mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-24 15:25:43 +00:00
fix: reimplement transfer to laying logics separating effective financial date and physical transfer date
This commit is contained in:
@@ -14,12 +14,13 @@ import (
|
||||
// === DTO Structs ===
|
||||
|
||||
type TransferLayingRelationDTO struct {
|
||||
Id uint `json:"id"`
|
||||
TransferNumber string `json:"transfer_number"`
|
||||
TransferDate time.Time `json:"transfer_date"`
|
||||
EffectiveMoveDate *time.Time `json:"effective_move_date,omitempty"`
|
||||
ExecutedAt *time.Time `json:"executed_at,omitempty"`
|
||||
Notes string `json:"notes"`
|
||||
Id uint `json:"id"`
|
||||
TransferNumber string `json:"transfer_number"`
|
||||
TransferDate time.Time `json:"transfer_date"`
|
||||
EconomicCutoffDate *time.Time `json:"economic_cutoff_date,omitempty"`
|
||||
EffectiveMoveDate *time.Time `json:"effective_move_date,omitempty"`
|
||||
ExecutedAt *time.Time `json:"executed_at,omitempty"`
|
||||
Notes string `json:"notes"`
|
||||
}
|
||||
|
||||
type ProjectFlockKandangWithKandangDTO struct {
|
||||
@@ -92,12 +93,13 @@ type MaxTargetQtyForTransferDTO struct {
|
||||
|
||||
func ToTransferLayingRelationDTO(e entity.LayingTransfer) TransferLayingRelationDTO {
|
||||
return TransferLayingRelationDTO{
|
||||
Id: e.Id,
|
||||
TransferNumber: e.TransferNumber,
|
||||
TransferDate: e.TransferDate,
|
||||
EffectiveMoveDate: e.EffectiveMoveDate,
|
||||
ExecutedAt: e.ExecutedAt,
|
||||
Notes: e.Notes,
|
||||
Id: e.Id,
|
||||
TransferNumber: e.TransferNumber,
|
||||
TransferDate: e.TransferDate,
|
||||
EconomicCutoffDate: e.EconomicCutoffDate,
|
||||
EffectiveMoveDate: e.EffectiveMoveDate,
|
||||
ExecutedAt: e.ExecutedAt,
|
||||
Notes: e.Notes,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -783,15 +783,16 @@ func (s transferLayingService) Approval(c *fiber.Ctx, req *validation.Approve) (
|
||||
if err != nil {
|
||||
return fiber.NewError(fiber.StatusInternalServerError, "Gagal mengambil sources transfer")
|
||||
}
|
||||
effectiveMoveDate, err := s.calculateEffectiveMoveDate(c.Context(), sources)
|
||||
economicCutoffDate, err := s.calculateEconomicCutoffDate(c.Context(), sources)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := repoTx.PatchOne(c.Context(), approvableID, map[string]any{
|
||||
"effective_move_date": effectiveMoveDate,
|
||||
"executed_at": nil,
|
||||
"executed_by": nil,
|
||||
"economic_cutoff_date": economicCutoffDate,
|
||||
"effective_move_date": economicCutoffDate, // Backward-compatible alias for existing clients.
|
||||
"executed_at": nil,
|
||||
"executed_by": nil,
|
||||
}, nil); err != nil {
|
||||
return fiber.NewError(fiber.StatusInternalServerError, "Gagal menyimpan tanggal efektif transfer laying")
|
||||
}
|
||||
@@ -866,23 +867,25 @@ func (s transferLayingService) Execute(c *fiber.Ctx, id uint) (*entity.LayingTra
|
||||
return fiber.NewError(fiber.StatusInternalServerError, "Gagal mengambil target transfer laying")
|
||||
}
|
||||
|
||||
if transfer.EffectiveMoveDate == nil || transfer.EffectiveMoveDate.IsZero() {
|
||||
effectiveMoveDate, calcErr := s.calculateEffectiveMoveDate(c.Context(), sources)
|
||||
if transfer.EconomicCutoffDate == nil || transfer.EconomicCutoffDate.IsZero() {
|
||||
economicCutoffDate, calcErr := s.calculateEconomicCutoffDate(c.Context(), sources)
|
||||
if calcErr != nil {
|
||||
return calcErr
|
||||
}
|
||||
if patchErr := repoTx.PatchOne(c.Context(), transfer.Id, map[string]any{
|
||||
"effective_move_date": effectiveMoveDate,
|
||||
"economic_cutoff_date": economicCutoffDate,
|
||||
"effective_move_date": economicCutoffDate, // Keep legacy field in sync.
|
||||
}, nil); patchErr != nil {
|
||||
return fiber.NewError(fiber.StatusInternalServerError, "Gagal menyimpan tanggal efektif transfer laying")
|
||||
}
|
||||
transfer.EffectiveMoveDate = &effectiveMoveDate
|
||||
transfer.EconomicCutoffDate = &economicCutoffDate
|
||||
transfer.EffectiveMoveDate = &economicCutoffDate
|
||||
}
|
||||
|
||||
effectiveMoveDate := normalizeDateOnlyUTC(*transfer.EffectiveMoveDate)
|
||||
physicalMoveDate := normalizeDateOnlyUTC(transfer.TransferDate)
|
||||
today := normalizeDateOnlyUTC(time.Now().UTC())
|
||||
if today.Before(effectiveMoveDate) {
|
||||
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Transfer laying baru bisa dieksekusi mulai tanggal %s", effectiveMoveDate.Format("2006-01-02")))
|
||||
if today.Before(physicalMoveDate) {
|
||||
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Transfer laying baru bisa dieksekusi mulai tanggal pindah fisik %s", physicalMoveDate.Format("2006-01-02")))
|
||||
}
|
||||
|
||||
if err := s.executeApprovedTransferMovement(c.Context(), dbTransaction, transfer, actorID, sources, targets); err != nil {
|
||||
@@ -978,10 +981,7 @@ func (s *transferLayingService) executeApprovedTransferMovement(
|
||||
return fiber.NewError(fiber.StatusInternalServerError, "Gagal update source usage qty")
|
||||
}
|
||||
|
||||
asOf := transfer.TransferDate
|
||||
if transfer.EffectiveMoveDate != nil && !transfer.EffectiveMoveDate.IsZero() {
|
||||
asOf = *transfer.EffectiveMoveDate
|
||||
}
|
||||
asOf := normalizeDateOnlyUTC(transfer.TransferDate)
|
||||
if _, err := s.FifoStockV2Svc.Reflow(ctx, commonSvc.FifoStockV2ReflowRequest{
|
||||
FlagGroupCode: transferToLayingFlagGroupCode,
|
||||
ProductWarehouseID: *source.ProductWarehouseId,
|
||||
@@ -1147,7 +1147,7 @@ func (s *transferLayingService) allocatePopulationForTransfer(
|
||||
)
|
||||
}
|
||||
|
||||
func (s *transferLayingService) calculateEffectiveMoveDate(ctx context.Context, sources []entity.LayingTransferSource) (time.Time, error) {
|
||||
func (s *transferLayingService) calculateEconomicCutoffDate(ctx context.Context, sources []entity.LayingTransferSource) (time.Time, error) {
|
||||
if len(sources) == 0 {
|
||||
return time.Time{}, fiber.NewError(fiber.StatusBadRequest, "Sumber transfer laying tidak ditemukan")
|
||||
}
|
||||
@@ -1172,8 +1172,8 @@ func (s *transferLayingService) calculateEffectiveMoveDate(ctx context.Context,
|
||||
return time.Time{}, fiber.NewError(fiber.StatusBadRequest, "Tanggal chick in sumber transfer laying tidak ditemukan")
|
||||
}
|
||||
|
||||
effectiveMoveDate := baselineChickInDate.AddDate(0, 0, maxGrowingWeek*7)
|
||||
return normalizeDateOnlyUTC(effectiveMoveDate), nil
|
||||
economicCutoffDate := baselineChickInDate.AddDate(0, 0, maxGrowingWeek*7)
|
||||
return normalizeDateOnlyUTC(economicCutoffDate), nil
|
||||
}
|
||||
|
||||
func (s *transferLayingService) resolveSourceChickInDate(ctx context.Context, sourceProjectFlockKandangID uint) (time.Time, error) {
|
||||
|
||||
Reference in New Issue
Block a user