diff --git a/db_lti_erp-202601271102-stg.sql b/db_lti_erp-202601271102-stg.sql new file mode 100644 index 00000000..2a8495d8 Binary files /dev/null and b/db_lti_erp-202601271102-stg.sql differ diff --git a/internal/database/migrations/20260129083458_create_transfer_laying_sequence.up.sql b/internal/database/migrations/20260129083458_create_transfer_laying_sequence.up.sql new file mode 100644 index 00000000..f5f5bdf7 --- /dev/null +++ b/internal/database/migrations/20260129083458_create_transfer_laying_sequence.up.sql @@ -0,0 +1,33 @@ +-- Create sequence for transfer laying movement number +CREATE SEQUENCE transfer_laying_seq START +WITH + 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 99999 NO CYCLE; + +-- Set sequence starting value based on existing data (if any) +-- This prevents duplicate movement numbers if there's already data +DO $$ DECLARE max_existing INTEGER; + +BEGIN +-- Check if table exists and has data +IF EXISTS ( + SELECT 1 + FROM information_schema.tables + WHERE + table_schema = 'public' + AND table_name = 'transfer_to_layings' +) THEN +-- Get max ID from existing records +SELECT COALESCE(MAX(id), 0) INTO max_existing +FROM transfer_to_layings; + +-- Set sequence to start after the highest existing ID +IF max_existing > 0 THEN PERFORM setval ( + 'transfer_laying_seq', + max_existing +); + +END IF; + +END IF; + +END $$; \ No newline at end of file diff --git a/internal/modules/production/transfer_layings/repositories/laying_transfer.repository.go b/internal/modules/production/transfer_layings/repositories/laying_transfer.repository.go index ebf63252..b3d7e7bc 100644 --- a/internal/modules/production/transfer_layings/repositories/laying_transfer.repository.go +++ b/internal/modules/production/transfer_layings/repositories/laying_transfer.repository.go @@ -2,6 +2,7 @@ package repository import ( "context" + "fmt" "strings" "gitlab.com/mbugroup/lti-api.git/internal/common/repository" @@ -16,6 +17,10 @@ type TransferLayingRepository interface { // Tambah method baru untuk query dengan filter lengkap GetAllWithFilters(ctx context.Context, offset int, limit int, params *GetAllFilterParams) ([]entity.LayingTransfer, int64, error) + + // Get sequence for movement number + GetNextMovementNumber(ctx context.Context) (int64, error) + GenerateMovementNumber(ctx context.Context) (string, error) } type TransferLayingRepositoryImpl struct { @@ -29,6 +34,26 @@ func NewTransferLayingRepository(db *gorm.DB) TransferLayingRepository { db: db, } } + +func (r *TransferLayingRepositoryImpl) GetNextMovementNumber(ctx context.Context) (int64, error) { + var seq int64 + err := r.db.WithContext(ctx).Raw("SELECT nextval('transfer_laying_seq')").Scan(&seq).Error + if err != nil { + return 0, err + } + return seq, nil +} + +func (r *TransferLayingRepositoryImpl) GenerateMovementNumber(ctx context.Context) (string, error) { + seq, err := r.GetNextMovementNumber(ctx) + if err != nil { + return "", err + } + // Format: TL00001, TL00002, dst + movementNumber := fmt.Sprintf("TL%05d", seq) + return movementNumber, nil +} + func (r *TransferLayingRepositoryImpl) IdExists(ctx context.Context, id uint) (bool, error) { return repository.Exists[entity.LayingTransfer](ctx, r.db, id) } diff --git a/internal/modules/production/transfer_layings/services/transfer_laying.service.go b/internal/modules/production/transfer_layings/services/transfer_laying.service.go index 310391c6..2acc2e8f 100644 --- a/internal/modules/production/transfer_layings/services/transfer_laying.service.go +++ b/internal/modules/production/transfer_layings/services/transfer_laying.service.go @@ -271,7 +271,11 @@ func (s *transferLayingService) CreateOne(c *fiber.Ctx, req *validation.Create) return nil, fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Jumlah total sumber (%.0f) harus sama dengan jumlah total tujuan (%.0f)", totalSourceQty, totalTargetQty)) } - transferNumber := fmt.Sprintf("TL-%d", time.Now().UnixNano()) + transferNumber, err := s.Repository.GenerateMovementNumber(c.Context()) + if err != nil { + s.Log.Errorf("Failed to generate movement number: %+v", err) + return nil, fiber.NewError(fiber.StatusInternalServerError, "Gagal membuat nomor transfer") + } createBody := &entity.LayingTransfer{ TransferNumber: transferNumber,