mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-06-09 15:07:49 +00:00
initial refactori trasnfer to laying, and depretitation to 25 week
This commit is contained in:
@@ -16,13 +16,17 @@ type ExpenseDepreciationMetaDTO struct {
|
||||
}
|
||||
|
||||
type ExpenseDepreciationRowDTO struct {
|
||||
ProjectFlockID int64 `json:"project_flock_id"`
|
||||
FarmName string `json:"farm_name"`
|
||||
Period string `json:"period"`
|
||||
DepreciationPercentEffective float64 `json:"depreciation_percent_effective"`
|
||||
DepreciationValue float64 `json:"depreciation_value"`
|
||||
PulletCostDayNTotal float64 `json:"pullet_cost_day_n_total"`
|
||||
Components any `json:"components"`
|
||||
ProjectFlockID int64 `json:"project_flock_id"`
|
||||
FarmName string `json:"farm_name"`
|
||||
Period string `json:"period"`
|
||||
DepreciationPercentEffective float64 `json:"depreciation_percent_effective"`
|
||||
DepreciationValue float64 `json:"depreciation_value"`
|
||||
PulletCostDayNTotal float64 `json:"pullet_cost_day_n_total"`
|
||||
MultiplicationPercentage float64 `json:"multiplication_percentage"`
|
||||
DayN int `json:"day_n"`
|
||||
ChickinDate string `json:"chickin_date"`
|
||||
TotalValuePulletAfterDepreciation float64 `json:"total_value_pullet_after_depreciation"`
|
||||
Components any `json:"components"`
|
||||
}
|
||||
|
||||
type ExpenseDepreciationManualInputRowDTO struct {
|
||||
|
||||
@@ -37,10 +37,10 @@ type FarmDepreciationManualInputRow struct {
|
||||
Note *string
|
||||
}
|
||||
|
||||
type houseDepreciationPercentRow struct {
|
||||
HouseType string
|
||||
Day int
|
||||
DepreciationPercent float64
|
||||
type houseMultiplicationPercentageRow struct {
|
||||
HouseType string
|
||||
Day int
|
||||
MultiplicationPercentage float64
|
||||
}
|
||||
|
||||
type ExpenseDepreciationRepository interface {
|
||||
@@ -48,8 +48,9 @@ type ExpenseDepreciationRepository interface {
|
||||
GetSnapshotsByPeriodAndFarmIDs(ctx context.Context, period time.Time, farmIDs []uint) ([]entity.FarmDepreciationSnapshot, error)
|
||||
UpsertSnapshots(ctx context.Context, rows []entity.FarmDepreciationSnapshot) error
|
||||
DeleteSnapshotsFromDate(ctx context.Context, fromDate time.Time, farmIDs []uint) error
|
||||
DeleteSnapshotsByFarmIDs(ctx context.Context, farmIDs []uint) error
|
||||
GetLatestTransferInputsByFarms(ctx context.Context, period time.Time, farmIDs []uint) ([]FarmDepreciationLatestTransferRow, error)
|
||||
GetDepreciationPercents(ctx context.Context, houseTypes []string, maxDay int) (map[string]map[int]float64, error)
|
||||
GetMultiplicationPercentages(ctx context.Context, houseTypes []string, maxDay int) (map[string]map[int]float64, error)
|
||||
GetLatestManualInputsByFarms(ctx context.Context, areaIDs, locationIDs, projectFlockIDs []int64) ([]FarmDepreciationManualInputRow, error)
|
||||
UpsertManualInput(ctx context.Context, row *entity.FarmDepreciationManualInput) error
|
||||
DB() *gorm.DB
|
||||
@@ -159,6 +160,17 @@ func (r *expenseDepreciationRepository) DeleteSnapshotsFromDate(
|
||||
return query.Delete(nil).Error
|
||||
}
|
||||
|
||||
func (r *expenseDepreciationRepository) DeleteSnapshotsByFarmIDs(ctx context.Context, farmIDs []uint) error {
|
||||
if len(farmIDs) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return r.db.WithContext(ctx).
|
||||
Table("farm_depreciation_snapshots").
|
||||
Where("project_flock_id IN ?", farmIDs).
|
||||
Delete(nil).Error
|
||||
}
|
||||
|
||||
func (r *expenseDepreciationRepository) GetLatestTransferInputsByFarms(
|
||||
ctx context.Context,
|
||||
period time.Time,
|
||||
@@ -228,7 +240,7 @@ ORDER BY ltt.target_project_flock_kandang_id, at.effective_date DESC, at.id DESC
|
||||
return rows, nil
|
||||
}
|
||||
|
||||
func (r *expenseDepreciationRepository) GetDepreciationPercents(
|
||||
func (r *expenseDepreciationRepository) GetMultiplicationPercentages(
|
||||
ctx context.Context,
|
||||
houseTypes []string,
|
||||
maxDay int,
|
||||
@@ -238,14 +250,14 @@ func (r *expenseDepreciationRepository) GetDepreciationPercents(
|
||||
return result, nil
|
||||
}
|
||||
|
||||
rows := make([]houseDepreciationPercentRow, 0)
|
||||
if err := r.db.WithContext(ctx).
|
||||
Table("house_depreciation_standards").
|
||||
Select("house_type::text AS house_type, day, depreciation_percent").
|
||||
Where("house_type::text IN ?", houseTypes).
|
||||
Where("day <= ?", maxDay).
|
||||
Order("house_type ASC, day ASC").
|
||||
Scan(&rows).Error; err != nil {
|
||||
rows := make([]houseMultiplicationPercentageRow, 0)
|
||||
if err := r.db.WithContext(ctx).Raw(`
|
||||
SELECT DISTINCT ON (house_type::text, day)
|
||||
house_type::text AS house_type, day, multiplication_percentage
|
||||
FROM house_depreciation_standards
|
||||
WHERE house_type::text IN ? AND day <= ?
|
||||
ORDER BY house_type, day, effective_date DESC NULLS LAST
|
||||
`, houseTypes, maxDay).Scan(&rows).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -253,7 +265,7 @@ func (r *expenseDepreciationRepository) GetDepreciationPercents(
|
||||
if _, exists := result[row.HouseType]; !exists {
|
||||
result[row.HouseType] = make(map[int]float64)
|
||||
}
|
||||
result[row.HouseType][row.Day] = row.DepreciationPercent
|
||||
result[row.HouseType][row.Day] = row.MultiplicationPercentage
|
||||
}
|
||||
|
||||
return result, nil
|
||||
|
||||
@@ -237,6 +237,9 @@ func (s *repportService) GetExpenseDepreciation(ctx *fiber.Ctx) ([]dto.ExpenseDe
|
||||
|
||||
snapshotByFarmID := make(map[uint]entity.FarmDepreciationSnapshot)
|
||||
if params.ForceRecompute {
|
||||
if err := s.ExpenseDepreciationRepo.DeleteSnapshotsByFarmIDs(ctx.Context(), farmIDs); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
computedSnapshots, computeErr := s.computeExpenseDepreciationSnapshots(ctx.Context(), periodDate, farmIDs, farmNameByID)
|
||||
if computeErr != nil {
|
||||
return nil, nil, computeErr
|
||||
@@ -289,24 +292,31 @@ func (s *repportService) GetExpenseDepreciation(ctx *fiber.Ctx) ([]dto.ExpenseDe
|
||||
snapshot, exists := snapshotByFarmID[candidate.ProjectFlockID]
|
||||
if !exists {
|
||||
rows = append(rows, dto.ExpenseDepreciationRowDTO{
|
||||
ProjectFlockID: int64(candidate.ProjectFlockID),
|
||||
FarmName: candidate.FarmName,
|
||||
Period: params.Period,
|
||||
DepreciationPercentEffective: 0,
|
||||
DepreciationValue: 0,
|
||||
PulletCostDayNTotal: 0,
|
||||
Components: map[string]any{},
|
||||
ProjectFlockID: int64(candidate.ProjectFlockID),
|
||||
FarmName: candidate.FarmName,
|
||||
Period: params.Period,
|
||||
DepreciationPercentEffective: 0,
|
||||
DepreciationValue: 0,
|
||||
PulletCostDayNTotal: 0,
|
||||
TotalValuePulletAfterDepreciation: 0,
|
||||
Components: map[string]any{},
|
||||
})
|
||||
continue
|
||||
}
|
||||
components := parseSnapshotComponents(snapshot.Components)
|
||||
multiplicationPercentage, dayN, chickinDate := depreciationSnapshotInfo(components)
|
||||
rows = append(rows, dto.ExpenseDepreciationRowDTO{
|
||||
ProjectFlockID: int64(snapshot.ProjectFlockId),
|
||||
FarmName: candidate.FarmName,
|
||||
Period: params.Period,
|
||||
DepreciationPercentEffective: snapshot.DepreciationPercentEffective,
|
||||
DepreciationValue: snapshot.DepreciationValue,
|
||||
PulletCostDayNTotal: snapshot.PulletCostDayNTotal,
|
||||
Components: parseSnapshotComponents(snapshot.Components),
|
||||
ProjectFlockID: int64(snapshot.ProjectFlockId),
|
||||
FarmName: candidate.FarmName,
|
||||
Period: params.Period,
|
||||
DepreciationPercentEffective: snapshot.DepreciationPercentEffective,
|
||||
DepreciationValue: snapshot.DepreciationValue,
|
||||
PulletCostDayNTotal: snapshot.PulletCostDayNTotal,
|
||||
MultiplicationPercentage: multiplicationPercentage,
|
||||
DayN: dayN,
|
||||
ChickinDate: chickinDate,
|
||||
TotalValuePulletAfterDepreciation: snapshot.PulletCostDayNTotal - snapshot.DepreciationValue,
|
||||
Components: components,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -472,23 +482,26 @@ func (s *repportService) UpsertExpenseDepreciationManualInput(ctx *fiber.Ctx, re
|
||||
}
|
||||
|
||||
type depreciationKandangComponent struct {
|
||||
ProjectFlockKandangID uint `json:"project_flock_kandang_id"`
|
||||
KandangID uint `json:"kandang_id"`
|
||||
KandangName string `json:"kandang_name"`
|
||||
TransferID uint `json:"transfer_id"`
|
||||
TransferDate string `json:"transfer_date"`
|
||||
SourceProjectFlockID uint `json:"source_project_flock_id"`
|
||||
HouseType string `json:"house_type"`
|
||||
DayN int `json:"day_n"`
|
||||
DepreciationPercent float64 `json:"depreciation_percent"`
|
||||
TransferQty float64 `json:"transfer_qty"`
|
||||
PulletCostDayN float64 `json:"pullet_cost_day_n"`
|
||||
DepreciationValue float64 `json:"depreciation_value"`
|
||||
DepreciationSource string `json:"depreciation_source,omitempty"`
|
||||
ManualInputID *uint `json:"manual_input_id,omitempty"`
|
||||
CutoverDate string `json:"cutover_date,omitempty"`
|
||||
OriginDate string `json:"origin_date,omitempty"`
|
||||
StartScheduleDay *int `json:"start_schedule_day,omitempty"`
|
||||
ProjectFlockKandangID uint `json:"project_flock_kandang_id"`
|
||||
KandangID uint `json:"kandang_id"`
|
||||
KandangName string `json:"kandang_name"`
|
||||
TransferID uint `json:"transfer_id"`
|
||||
TransferDate string `json:"transfer_date"`
|
||||
SourceProjectFlockID uint `json:"source_project_flock_id"`
|
||||
HouseType string `json:"house_type"`
|
||||
DayN int `json:"day_n"`
|
||||
DepreciationPercent float64 `json:"depreciation_percent"`
|
||||
MultiplicationPercentage float64 `json:"multiplication_percentage"`
|
||||
TransferQty float64 `json:"transfer_qty"`
|
||||
PulletCostDayN float64 `json:"pullet_cost_day_n"`
|
||||
DepreciationValue float64 `json:"depreciation_value"`
|
||||
TotalValuePulletAfterDepreciation float64 `json:"total_value_pullet_after_depreciation"`
|
||||
DepreciationSource string `json:"depreciation_source,omitempty"`
|
||||
ManualInputID *uint `json:"manual_input_id,omitempty"`
|
||||
CutoverDate string `json:"cutover_date,omitempty"`
|
||||
OriginDate string `json:"origin_date,omitempty"`
|
||||
ChickinDate string `json:"chickin_date,omitempty"`
|
||||
StartScheduleDay *int `json:"start_schedule_day,omitempty"`
|
||||
}
|
||||
|
||||
type depreciationFarmComponents struct {
|
||||
@@ -548,17 +561,20 @@ func (s *repportService) computeExpenseDepreciationSnapshots(
|
||||
|
||||
houseType := approvalService.NormalizeDepreciationHouseType(breakdown.HouseType)
|
||||
component := depreciationKandangComponent{
|
||||
ProjectFlockKandangID: breakdown.ProjectFlockKandangID,
|
||||
KandangID: breakdown.KandangID,
|
||||
KandangName: breakdown.KandangName,
|
||||
SourceProjectFlockID: hppV2DetailUint(part.Details, "source_project_flock_id"),
|
||||
HouseType: houseType,
|
||||
DayN: hppV2DetailInt(part.Details, "schedule_day"),
|
||||
DepreciationPercent: hppV2DetailFloat(part.Details, "depreciation_percent"),
|
||||
PulletCostDayN: hppV2DetailFloat(part.Details, "pullet_cost_day_n"),
|
||||
DepreciationValue: part.Total,
|
||||
DepreciationSource: part.Code,
|
||||
OriginDate: hppV2DetailString(part.Details, "origin_date"),
|
||||
ProjectFlockKandangID: breakdown.ProjectFlockKandangID,
|
||||
KandangID: breakdown.KandangID,
|
||||
KandangName: breakdown.KandangName,
|
||||
SourceProjectFlockID: hppV2DetailUint(part.Details, "source_project_flock_id"),
|
||||
HouseType: houseType,
|
||||
DayN: hppV2DetailInt(part.Details, "schedule_day"),
|
||||
DepreciationPercent: hppV2DetailFloat(part.Details, "depreciation_percent"),
|
||||
MultiplicationPercentage: hppV2DetailFloat(part.Details, "multiplication_percentage"),
|
||||
PulletCostDayN: hppV2DetailFloat(part.Details, "pullet_cost_day_n"),
|
||||
DepreciationValue: part.Total,
|
||||
TotalValuePulletAfterDepreciation: hppV2DetailFloat(part.Details, "total_value_pullet_after_depreciation"),
|
||||
DepreciationSource: part.Code,
|
||||
OriginDate: hppV2DetailString(part.Details, "origin_date"),
|
||||
ChickinDate: hppV2DetailString(part.Details, "origin_date"),
|
||||
}
|
||||
|
||||
if component.HouseType == "" {
|
||||
@@ -700,8 +716,11 @@ func hppV2DetailString(details map[string]any, key string) string {
|
||||
if details == nil || key == "" {
|
||||
return ""
|
||||
}
|
||||
raw, exists := details[key]
|
||||
if !exists || raw == nil {
|
||||
return anyString(details[key])
|
||||
}
|
||||
|
||||
func anyString(raw any) string {
|
||||
if raw == nil {
|
||||
return ""
|
||||
}
|
||||
switch value := raw.(type) {
|
||||
@@ -725,6 +744,68 @@ func parseSnapshotComponents(raw []byte) any {
|
||||
return out
|
||||
}
|
||||
|
||||
func depreciationSnapshotInfo(components any) (float64, int, string) {
|
||||
root, ok := components.(map[string]any)
|
||||
if !ok {
|
||||
return 0, 0, ""
|
||||
}
|
||||
kandang, ok := root["kandang"].([]any)
|
||||
if !ok {
|
||||
return 0, 0, ""
|
||||
}
|
||||
for _, raw := range kandang {
|
||||
component, ok := raw.(map[string]any)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
dayN := int(math.Round(anyFloat(component["day_n"])))
|
||||
multiplicationPercentage := anyFloat(component["multiplication_percentage"])
|
||||
chickinDate := anyString(component["chickin_date"])
|
||||
if chickinDate == "" {
|
||||
chickinDate = anyString(component["origin_date"])
|
||||
}
|
||||
if dayN > 0 || multiplicationPercentage > 0 || chickinDate != "" {
|
||||
return multiplicationPercentage, dayN, chickinDate
|
||||
}
|
||||
}
|
||||
return 0, 0, ""
|
||||
}
|
||||
|
||||
func anyFloat(raw any) float64 {
|
||||
switch value := raw.(type) {
|
||||
case float64:
|
||||
return value
|
||||
case float32:
|
||||
return float64(value)
|
||||
case int:
|
||||
return float64(value)
|
||||
case int8:
|
||||
return float64(value)
|
||||
case int16:
|
||||
return float64(value)
|
||||
case int32:
|
||||
return float64(value)
|
||||
case int64:
|
||||
return float64(value)
|
||||
case uint:
|
||||
return float64(value)
|
||||
case uint8:
|
||||
return float64(value)
|
||||
case uint16:
|
||||
return float64(value)
|
||||
case uint32:
|
||||
return float64(value)
|
||||
case uint64:
|
||||
return float64(value)
|
||||
case string:
|
||||
parsed, err := strconv.ParseFloat(strings.TrimSpace(value), 64)
|
||||
if err == nil {
|
||||
return parsed
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func valueOrEmptyString(v *string) string {
|
||||
if v == nil {
|
||||
return ""
|
||||
@@ -1812,6 +1893,15 @@ func (s *repportService) GetDebtSupplier(c *fiber.Ctx, params *validation.DebtSu
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
expenseIDs := make([]uint64, 0, len(expenses))
|
||||
for _, exp := range expenses {
|
||||
expenseIDs = append(expenseIDs, exp.Id)
|
||||
}
|
||||
expenseWarehousesMap, err := s.DebtSupplierRepo.GetWarehousesByExpenseIDs(c.Context(), expenseIDs)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
purchasesBySupplier := make(map[uint][]entity.Purchase, len(supplierIDs))
|
||||
for _, purchase := range purchases {
|
||||
purchasesBySupplier[purchase.SupplierId] = append(purchasesBySupplier[purchase.SupplierId], purchase)
|
||||
@@ -1906,7 +1996,7 @@ func (s *repportService) GetDebtSupplier(c *fiber.Ctx, params *validation.DebtSu
|
||||
}
|
||||
|
||||
for _, exp := range expensesBySupplier[supplierID] {
|
||||
row := buildDebtSupplierExpenseRow(exp, now, location)
|
||||
row := buildDebtSupplierExpenseRow(exp, expenseWarehousesMap[exp.Id], now, location)
|
||||
sortTime := exp.TransactionDate.In(location)
|
||||
rowIndex := len(combinedRows)
|
||||
combinedRows = append(combinedRows, debtSupplierRowItem{
|
||||
@@ -2068,7 +2158,8 @@ func buildDebtSupplierRow(purchase entity.Purchase, now time.Time, loc *time.Loc
|
||||
travelNumber := "-"
|
||||
receivedDate := ""
|
||||
var area *areaDTO.AreaRelationDTO
|
||||
var warehouse *warehouseDTO.WarehouseRelationDTO
|
||||
warehouses := []warehouseDTO.WarehouseRelationDTO{}
|
||||
seenWarehouseIDs := map[uint]bool{}
|
||||
|
||||
if len(purchase.Items) > 0 {
|
||||
firstItem := purchase.Items[0]
|
||||
@@ -2076,24 +2167,22 @@ func buildDebtSupplierRow(purchase entity.Purchase, now time.Time, loc *time.Loc
|
||||
travelNumber = *firstItem.TravelNumber
|
||||
}
|
||||
|
||||
if firstItem.Warehouse != nil && firstItem.Warehouse.Id != 0 {
|
||||
mappedWarehouse := warehouseDTO.ToWarehouseRelationDTO(*firstItem.Warehouse)
|
||||
warehouse = &mappedWarehouse
|
||||
if firstItem.Warehouse.Area.Id != 0 {
|
||||
mappedArea := areaDTO.ToAreaRelationDTO(firstItem.Warehouse.Area)
|
||||
area = &mappedArea
|
||||
}
|
||||
}
|
||||
|
||||
earliestReceived := time.Time{}
|
||||
for _, item := range purchase.Items {
|
||||
totalPrice += item.TotalPrice
|
||||
if item.ReceivedDate == nil || item.ReceivedDate.IsZero() {
|
||||
continue
|
||||
if item.ReceivedDate != nil && !item.ReceivedDate.IsZero() {
|
||||
received := item.ReceivedDate.In(loc)
|
||||
if earliestReceived.IsZero() || received.Before(earliestReceived) {
|
||||
earliestReceived = received
|
||||
}
|
||||
}
|
||||
received := item.ReceivedDate.In(loc)
|
||||
if earliestReceived.IsZero() || received.Before(earliestReceived) {
|
||||
earliestReceived = received
|
||||
if item.Warehouse != nil && item.Warehouse.Id != 0 && !seenWarehouseIDs[item.Warehouse.Id] {
|
||||
seenWarehouseIDs[item.Warehouse.Id] = true
|
||||
warehouses = append(warehouses, warehouseDTO.ToWarehouseRelationDTO(*item.Warehouse))
|
||||
if area == nil && item.Warehouse.Area.Id != 0 {
|
||||
mappedArea := areaDTO.ToAreaRelationDTO(item.Warehouse.Area)
|
||||
area = &mappedArea
|
||||
}
|
||||
}
|
||||
}
|
||||
if !earliestReceived.IsZero() {
|
||||
@@ -2126,7 +2215,7 @@ func buildDebtSupplierRow(purchase entity.Purchase, now time.Time, loc *time.Loc
|
||||
ReceivedDate: receivedDate,
|
||||
Aging: aging,
|
||||
Area: area,
|
||||
Warehouse: warehouse,
|
||||
Warehouses: warehouses,
|
||||
DueDate: dueDate,
|
||||
DueStatus: dueStatus,
|
||||
TotalPrice: totalPrice,
|
||||
@@ -2156,7 +2245,7 @@ func buildDebtSupplierPaymentRow(payment entity.Payment, loc *time.Location) dto
|
||||
ReceivedDate: payment.PaymentDate.In(loc).Format("2006-01-02"),
|
||||
Aging: 0,
|
||||
Area: nil,
|
||||
Warehouse: nil,
|
||||
Warehouses: []warehouseDTO.WarehouseRelationDTO{},
|
||||
DueDate: "-",
|
||||
DueStatus: "-",
|
||||
TotalPrice: 0,
|
||||
@@ -2260,7 +2349,7 @@ func resolveDebtSupplierReceivedDate(purchase entity.Purchase, loc *time.Locatio
|
||||
return time.Date(earliest.Year(), earliest.Month(), earliest.Day(), 0, 0, 0, 0, loc)
|
||||
}
|
||||
|
||||
func buildDebtSupplierExpenseRow(exp entity.Expense, now time.Time, loc *time.Location) dto.DebtSupplierRowDTO {
|
||||
func buildDebtSupplierExpenseRow(exp entity.Expense, warehouses []entity.Warehouse, now time.Time, loc *time.Location) dto.DebtSupplierRowDTO {
|
||||
txDate := exp.TransactionDate.In(loc)
|
||||
dateStr := txDate.Format("2006-01-02")
|
||||
|
||||
@@ -2282,6 +2371,15 @@ func buildDebtSupplierExpenseRow(exp entity.Expense, now time.Time, loc *time.Lo
|
||||
area = &mapped
|
||||
}
|
||||
|
||||
warehouseDTOs := make([]warehouseDTO.WarehouseRelationDTO, 0, len(warehouses))
|
||||
seenWarehouseIDs := map[uint]bool{}
|
||||
for _, w := range warehouses {
|
||||
if w.Id != 0 && !seenWarehouseIDs[w.Id] {
|
||||
seenWarehouseIDs[w.Id] = true
|
||||
warehouseDTOs = append(warehouseDTOs, warehouseDTO.ToWarehouseRelationDTO(w))
|
||||
}
|
||||
}
|
||||
|
||||
poNumber := ""
|
||||
if strings.TrimSpace(exp.PoNumber) != "" {
|
||||
poNumber = exp.PoNumber
|
||||
@@ -2294,7 +2392,7 @@ func buildDebtSupplierExpenseRow(exp entity.Expense, now time.Time, loc *time.Lo
|
||||
ReceivedDate: dateStr,
|
||||
Aging: aging,
|
||||
Area: area,
|
||||
Warehouse: nil,
|
||||
Warehouses: warehouseDTOs,
|
||||
DueDate: "-",
|
||||
DueStatus: "-",
|
||||
TotalPrice: totalPrice,
|
||||
|
||||
Reference in New Issue
Block a user