normalize data po number to pr number and fix logic to fill field PO number

This commit is contained in:
giovanni
2026-05-29 16:01:44 +07:00
parent 6264b0f08d
commit 0410169746
4 changed files with 110 additions and 6 deletions
@@ -24,7 +24,6 @@ type PurchaseRepository interface {
UpdateReceivingDetails(ctx context.Context, purchaseID uint, updates []PurchaseReceivingUpdate) error
DeleteItems(ctx context.Context, purchaseID uint, itemIDs []uint) error
NextPrNumber(ctx context.Context, tx *gorm.DB) (string, error)
NextPoNumber(ctx context.Context, tx *gorm.DB) (string, error)
BackfillProjectFlockKandang(ctx context.Context, purchaseID uint) error
SoftDeleteByProjectFlockKandangIDs(ctx context.Context, projectFlockKandangIDs []uint) error
GetItemsByProjectFlockID(ctx context.Context, projectFlockID uint) ([]entity.PurchaseItem, error)
@@ -369,9 +368,8 @@ func (r *PurchaseRepositoryImpl) NextPrNumber(ctx context.Context, tx *gorm.DB)
return r.generateSequentialNumber(ctx, tx, "pr_number", utils.PurchasePRNumberPrefix, utils.PurchaseNumberPadding)
}
func (r *PurchaseRepositoryImpl) NextPoNumber(ctx context.Context, tx *gorm.DB) (string, error) {
return r.generateSequentialNumber(ctx, tx, "po_number", utils.PurchasePONumberPrefix, utils.PurchaseNumberPadding)
}
// NOTE: NextPoNumber dihapus per migration 20260529143940 — po_number sekarang
// di-derive dari pr_number (swap prefix) via derivePoFromPr di purchase.service.go.
func (r *PurchaseRepositoryImpl) generateSequentialNumber(ctx context.Context, tx *gorm.DB, column, prefix string, padding int) (string, error) {
db := tx
@@ -779,8 +779,7 @@ func (s *purchaseService) ApproveManagerPurchase(c *fiber.Ctx, id uint, req *val
transactionErr := s.PurchaseRepo.DB().WithContext(c.Context()).Transaction(func(tx *gorm.DB) error {
updateData := map[string]any{}
if !hasExistingPO {
repoTx := rPurchase.NewPurchaseRepository(tx)
code, err := repoTx.NextPoNumber(c.Context(), tx)
code, err := derivePoFromPr(purchase.PrNumber)
if err != nil {
return err
}
@@ -2513,6 +2512,18 @@ func parseApprovalActionInput(raw string) (entity.ApprovalAction, error) {
}
}
// derivePoFromPr menghasilkan po_number dari pr_number dengan swap prefix.
// Contoh: "PR-LTI-0050" -> "PO-LTI-0050". Mengembalikan error kalau pr_number
// tidak diawali prefix standar — caller harus memastikan PR sudah valid.
func derivePoFromPr(prNumber string) (string, error) {
trimmed := strings.TrimSpace(prNumber)
if !strings.HasPrefix(trimmed, utils.PurchasePRNumberPrefix) {
return "", fmt.Errorf("invalid pr_number %q: missing prefix %q", trimmed, utils.PurchasePRNumberPrefix)
}
suffix := strings.TrimPrefix(trimmed, utils.PurchasePRNumberPrefix)
return utils.PurchasePONumberPrefix + suffix, nil
}
func (s *purchaseService) rejectAndReload(
c *fiber.Ctx,
step approvalutils.ApprovalStep,