FEAT[BE]: adjust api match with mock API

This commit is contained in:
aguhh18
2025-11-28 15:18:49 +07:00
parent f3b14cb8f2
commit 79c754312e
4 changed files with 48 additions and 50 deletions
@@ -96,30 +96,30 @@ func (u *ExpenseController) CreateOne(c *fiber.Ctx) error {
} }
req.Documents = form.File["documents"] req.Documents = form.File["documents"]
costPerKandangJSON := c.FormValue("cost_per_kandangs") expenseNonstocksJSON := c.FormValue("expense_nonstocks")
if costPerKandangJSON != "" { if expenseNonstocksJSON != "" {
if err := json.Unmarshal([]byte(costPerKandangJSON), &req.CostPerKandangs); err != nil { if err := json.Unmarshal([]byte(expenseNonstocksJSON), &req.ExpenseNonstocks); err != nil {
var singleCostPerKandang validation.CostPerKandang var singleExpenseNonstock validation.ExpenseNonstock
if err := json.Unmarshal([]byte(costPerKandangJSON), &singleCostPerKandang); err != nil { if err := json.Unmarshal([]byte(expenseNonstocksJSON), &singleExpenseNonstock); err != nil {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Invalid cost_per_kandangs JSON: %v", err)) return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Invalid expense_nonstocks JSON: %v", err))
} }
if singleCostPerKandang.KandangID == 0 { if singleExpenseNonstock.KandangID == 0 {
return fiber.NewError(fiber.StatusBadRequest, "Field KandangID is required") return fiber.NewError(fiber.StatusBadRequest, "Field KandangID is required")
} }
req.CostPerKandangs = []validation.CostPerKandang{singleCostPerKandang} req.ExpenseNonstocks = []validation.ExpenseNonstock{singleExpenseNonstock}
} else { } else {
for i, costPerKandang := range req.CostPerKandangs { for i, expenseNonstock := range req.ExpenseNonstocks {
if costPerKandang.KandangID == 0 { if expenseNonstock.KandangID == 0 {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Field KandangID is required for cost_per_kandangs[%d]", i)) return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Field KandangID is required for expense_nonstocks[%d]", i))
} }
} }
} }
} else { } else {
return fiber.NewError(fiber.StatusBadRequest, "Field cost_per_kandangs is required") return fiber.NewError(fiber.StatusBadRequest, "Field expense_nonstocks is required")
} }
result, err := u.ExpenseService.CreateOne(c, req) result, err := u.ExpenseService.CreateOne(c, req)
@@ -167,20 +167,20 @@ func (u *ExpenseController) UpdateOne(c *fiber.Ctx) error {
req.SupplierID = &supplierID req.SupplierID = &supplierID
} }
costPerKandangJSON := c.FormValue("cost_per_kandang") expenseNonstocksJSON := c.FormValue("expense_nonstocks")
if costPerKandangJSON != "" { if expenseNonstocksJSON != "" {
var costPerKandang []validation.CostPerKandang var expenseNonstocks []validation.ExpenseNonstock
if err := json.Unmarshal([]byte(costPerKandangJSON), &costPerKandang); err != nil { if err := json.Unmarshal([]byte(expenseNonstocksJSON), &expenseNonstocks); err != nil {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Invalid cost_per_kandang JSON: %v", err)) return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Invalid expense_nonstocks JSON: %v", err))
} }
for i, costPerKandang := range costPerKandang { for i, expenseNonstock := range expenseNonstocks {
if costPerKandang.KandangID == 0 { if expenseNonstock.KandangID == 0 {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Field KandangID is required for cost_per_kandang[%d]", i)) return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Field KandangID is required for expense_nonstocks[%d]", i))
} }
} }
req.CostPerKandang = &costPerKandang req.ExpenseNonstocks = &expenseNonstocks
} }
result, err := u.ExpenseService.UpdateOne(c, req, uint(id)) result, err := u.ExpenseService.UpdateOne(c, req, uint(id))
@@ -28,7 +28,6 @@ type ExpenseBaseDTO struct {
Supplier *supplierDTO.SupplierRelationDTO `json:"supplier,omitempty"` Supplier *supplierDTO.SupplierRelationDTO `json:"supplier,omitempty"`
RealizationDate *time.Time `json:"realization_date,omitempty"` RealizationDate *time.Time `json:"realization_date,omitempty"`
TransactionDate time.Time `json:"transaction_date"` TransactionDate time.Time `json:"transaction_date"`
Notes string `json:"notes"`
Location *locationDTO.LocationRelationDTO `json:"location,omitempty"` Location *locationDTO.LocationRelationDTO `json:"location,omitempty"`
} }
@@ -128,7 +127,6 @@ func ToExpenseBaseDTO(e *entity.Expense) ExpenseBaseDTO {
Supplier: supplier, Supplier: supplier,
RealizationDate: realizationDate, RealizationDate: realizationDate,
TransactionDate: e.TransactionDate, TransactionDate: e.TransactionDate,
Notes: e.Notes,
Location: location, Location: location,
} }
} }
@@ -147,8 +147,8 @@ func (s *expenseService) CreateOne(c *fiber.Ctx, req *validation.Create) (*expen
return nil, err return nil, err
} }
for _, costPerKandang := range req.CostPerKandangs { for _, expenseNonstock := range req.ExpenseNonstocks {
for _, costItem := range costPerKandang.CostItems { for _, costItem := range expenseNonstock.CostItems {
nonstockId := uint(costItem.NonstockID) nonstockId := uint(costItem.NonstockID)
if err := commonSvc.EnsureRelations(c.Context(), if err := commonSvc.EnsureRelations(c.Context(),
@@ -202,15 +202,15 @@ func (s *expenseService) CreateOne(c *fiber.Ctx, req *validation.Create) (*expen
return fiber.NewError(fiber.StatusInternalServerError, "Failed to create expense") return fiber.NewError(fiber.StatusInternalServerError, "Failed to create expense")
} }
if len(req.CostPerKandangs) > 0 { if len(req.ExpenseNonstocks) > 0 {
for _, costPerKandang := range req.CostPerKandangs { for _, expenseNonstock := range req.ExpenseNonstocks {
var projectFlockKandangId *uint64 var projectFlockKandangId *uint64
if req.Category == "BOP" { if req.Category == "BOP" {
projectFlockKandang, err := projectFlockKandangRepoTx.GetActiveByKandangID(c.Context(), uint(costPerKandang.KandangID)) projectFlockKandang, err := projectFlockKandangRepoTx.GetActiveByKandangID(c.Context(), uint(expenseNonstock.KandangID))
if err != nil { if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) { if errors.Is(err, gorm.ErrRecordNotFound) {
return fiber.NewError(fiber.StatusNotFound, "No active project flock kandang found for this kandang") return fiber.NewError(fiber.StatusNotFound, "No active project flock kandang found for this kandang")
@@ -221,16 +221,16 @@ func (s *expenseService) CreateOne(c *fiber.Ctx, req *validation.Create) (*expen
projectFlockKandangId = &id projectFlockKandangId = &id
} }
for _, costItem := range costPerKandang.CostItems { for _, costItem := range expenseNonstock.CostItems {
nonstockId := costItem.NonstockID nonstockId := costItem.NonstockID
var kandangId *uint64 var kandangId *uint64
if req.Category == "NON-BOP" { if req.Category == "NON-BOP" {
id := uint64(costPerKandang.KandangID) id := uint64(expenseNonstock.KandangID)
kandangId = &id kandangId = &id
} else if req.Category == "BOP" { } else if req.Category == "BOP" {
if projectFlockKandangId != nil { if projectFlockKandangId != nil {
kandangId = &costPerKandang.KandangID kandangId = &expenseNonstock.KandangID
} }
} }
@@ -337,7 +337,7 @@ func (s expenseService) UpdateOne(c *fiber.Ctx, req *validation.Update, id uint)
updateBody["supplier_id"] = *req.SupplierID updateBody["supplier_id"] = *req.SupplierID
} }
if len(updateBody) == 0 && req.CostPerKandang == nil && len(req.Documents) == 0 { if len(updateBody) == 0 && req.ExpenseNonstocks == nil && len(req.Documents) == 0 {
responseDTO, err := s.GetOne(c, id) responseDTO, err := s.GetOne(c, id)
if err != nil { if err != nil {
@@ -422,7 +422,7 @@ func (s expenseService) UpdateOne(c *fiber.Ctx, req *validation.Update, id uint)
} }
} }
if req.CostPerKandang != nil { if req.ExpenseNonstocks != nil {
var existingExpenseNonstocks []entity.ExpenseNonstock var existingExpenseNonstocks []entity.ExpenseNonstock
if err := tx.Where("expense_id = ?", id).Find(&existingExpenseNonstocks).Error; err != nil { if err := tx.Where("expense_id = ?", id).Find(&existingExpenseNonstocks).Error; err != nil {
@@ -443,12 +443,12 @@ func (s expenseService) UpdateOne(c *fiber.Ctx, req *validation.Update, id uint)
return fiber.NewError(fiber.StatusInternalServerError, "Failed to get updated expense") return fiber.NewError(fiber.StatusInternalServerError, "Failed to get updated expense")
} }
for _, cpk := range *req.CostPerKandang { for _, expenseNonstock := range *req.ExpenseNonstocks {
var projectFlockKandangId *uint64 var projectFlockKandangId *uint64
if updatedExpense.Category == "BOP" { if updatedExpense.Category == "BOP" {
projectFlockKandangRepoTx := projectFlockKandangRepo.NewProjectFlockKandangRepository(tx) projectFlockKandangRepoTx := projectFlockKandangRepo.NewProjectFlockKandangRepository(tx)
projectFlockKandang, err := projectFlockKandangRepoTx.GetActiveByKandangID(c.Context(), uint(cpk.KandangID)) projectFlockKandang, err := projectFlockKandangRepoTx.GetActiveByKandangID(c.Context(), uint(expenseNonstock.KandangID))
if err != nil { if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) { if errors.Is(err, gorm.ErrRecordNotFound) {
return fiber.NewError(fiber.StatusNotFound, "No active project flock kandang found for this kandang") return fiber.NewError(fiber.StatusNotFound, "No active project flock kandang found for this kandang")
@@ -459,7 +459,7 @@ func (s expenseService) UpdateOne(c *fiber.Ctx, req *validation.Update, id uint)
projectFlockKandangId = &id projectFlockKandangId = &id
} }
for _, costItem := range cpk.CostItems { for _, costItem := range expenseNonstock.CostItems {
nonstockId := uint(costItem.NonstockID) nonstockId := uint(costItem.NonstockID)
if err := commonSvc.EnsureRelations(c.Context(), if err := commonSvc.EnsureRelations(c.Context(),
@@ -470,11 +470,11 @@ func (s expenseService) UpdateOne(c *fiber.Ctx, req *validation.Update, id uint)
var kandangId *uint64 var kandangId *uint64
if updatedExpense.Category == "NON-BOP" { if updatedExpense.Category == "NON-BOP" {
id := uint64(cpk.KandangID) id := uint64(expenseNonstock.KandangID)
kandangId = &id kandangId = &id
} else if updatedExpense.Category == "BOP" { } else if updatedExpense.Category == "BOP" {
if projectFlockKandangId != nil { if projectFlockKandangId != nil {
kandangId = &cpk.KandangID kandangId = &expenseNonstock.KandangID
} }
} }
@@ -5,15 +5,15 @@ import (
) )
type Create struct { type Create struct {
PoNumber string `form:"po_number" json:"po_number" validate:"omitempty,max=50"` PoNumber string `form:"po_number" json:"po_number" validate:"omitempty,max=50"`
TransactionDate string `form:"transaction_date" json:"transaction_date" validate:"required,datetime=2006-01-02"` TransactionDate string `form:"transaction_date" json:"transaction_date" validate:"required,datetime=2006-01-02"`
Category string `form:"category" json:"category" validate:"required,oneof=BOP NON-BOP"` Category string `form:"category" json:"category" validate:"required,oneof=BOP NON-BOP"`
SupplierID uint64 `form:"supplier_id" json:"supplier_id" validate:"required,gt=0"` SupplierID uint64 `form:"supplier_id" json:"supplier_id" validate:"required,gt=0"`
Documents []*multipart.FileHeader `form:"documents" json:"documents" validate:"omitempty,dive"` Documents []*multipart.FileHeader `form:"documents" json:"documents" validate:"omitempty,dive"`
CostPerKandangs []CostPerKandang `form:"cost_per_kandangs" json:"cost_per_kandangs" validate:"required,min=1,dive"` ExpenseNonstocks []ExpenseNonstock `form:"expense_nonstocks" json:"expense_nonstocks" validate:"required,min=1,dive"`
} }
type CostPerKandang struct { type ExpenseNonstock struct {
KandangID uint64 `form:"kandang_id" json:"kandang_id" validate:"required,gt=0"` KandangID uint64 `form:"kandang_id" json:"kandang_id" validate:"required,gt=0"`
CostItems []CostItem `form:"cost_items" json:"cost_items" validate:"required,min=1,dive"` CostItems []CostItem `form:"cost_items" json:"cost_items" validate:"required,min=1,dive"`
} }
@@ -26,11 +26,11 @@ type CostItem struct {
} }
type Update struct { type Update struct {
TransactionDate *string `form:"transaction_date" json:"transaction_date" validate:"omitempty,datetime=2006-01-02"` TransactionDate *string `form:"transaction_date" json:"transaction_date" validate:"omitempty,datetime=2006-01-02"`
Category *string `form:"category" json:"category" validate:"omitempty,oneof=BOP NON-BOP"` Category *string `form:"category" json:"category" validate:"omitempty,oneof=BOP NON-BOP"`
SupplierID *uint64 `form:"supplier_id" json:"supplier_id" validate:"omitempty,gt=0"` SupplierID *uint64 `form:"supplier_id" json:"supplier_id" validate:"omitempty,gt=0"`
CostPerKandang *[]CostPerKandang `form:"cost_per_kandang" json:"cost_per_kandang" validate:"omitempty,min=1,dive"` ExpenseNonstocks *[]ExpenseNonstock `form:"expense_nonstocks" json:"expense_nonstocks" validate:"omitempty,min=1,dive"`
Documents []*multipart.FileHeader `form:"documents" json:"documents" validate:"omitempty,dive"` Documents []*multipart.FileHeader `form:"documents" json:"documents" validate:"omitempty,dive"`
} }
type Query struct { type Query struct {