mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
FEAT[BE] :implement movement number generation and sequence management for transfer layings
This commit is contained in:
Binary file not shown.
@@ -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 $$;
|
||||||
+25
@@ -2,6 +2,7 @@ package repository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitlab.com/mbugroup/lti-api.git/internal/common/repository"
|
"gitlab.com/mbugroup/lti-api.git/internal/common/repository"
|
||||||
@@ -16,6 +17,10 @@ type TransferLayingRepository interface {
|
|||||||
|
|
||||||
// Tambah method baru untuk query dengan filter lengkap
|
// Tambah method baru untuk query dengan filter lengkap
|
||||||
GetAllWithFilters(ctx context.Context, offset int, limit int, params *GetAllFilterParams) ([]entity.LayingTransfer, int64, error)
|
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 {
|
type TransferLayingRepositoryImpl struct {
|
||||||
@@ -29,6 +34,26 @@ func NewTransferLayingRepository(db *gorm.DB) TransferLayingRepository {
|
|||||||
db: db,
|
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) {
|
func (r *TransferLayingRepositoryImpl) IdExists(ctx context.Context, id uint) (bool, error) {
|
||||||
return repository.Exists[entity.LayingTransfer](ctx, r.db, id)
|
return repository.Exists[entity.LayingTransfer](ctx, r.db, id)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))
|
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{
|
createBody := &entity.LayingTransfer{
|
||||||
TransferNumber: transferNumber,
|
TransferNumber: transferNumber,
|
||||||
|
|||||||
Reference in New Issue
Block a user