diff --git a/internal/entities/purchase_item.go b/internal/entities/purchase_item.go index 22cb62ed..724c6376 100644 --- a/internal/entities/purchase_item.go +++ b/internal/entities/purchase_item.go @@ -23,6 +23,7 @@ type PurchaseItem struct { ExpenseNonstockId *uint64 // Relations + ExpenseNonstock *ExpenseNonstock `gorm:"foreignKey:ExpenseNonstockId;references:Id"` Purchase *Purchase `gorm:"foreignKey:PurchaseId;references:Id"` Product *Product `gorm:"foreignKey:ProductId;references:Id"` Warehouse *Warehouse `gorm:"foreignKey:WarehouseId;references:Id"` diff --git a/internal/modules/master/nonstocks/dto/nonstock.dto.go b/internal/modules/master/nonstocks/dto/nonstock.dto.go index dd187230..b2af526c 100644 --- a/internal/modules/master/nonstocks/dto/nonstock.dto.go +++ b/internal/modules/master/nonstocks/dto/nonstock.dto.go @@ -1,11 +1,11 @@ package dto import ( - "time" - entity "gitlab.com/mbugroup/lti-api.git/internal/entities" + supplierDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/master/suppliers/dto" uomDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/master/uoms/dto" userDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/users/dto" + "time" ) // === DTO Structs === @@ -18,13 +18,14 @@ type NonstockRelationDTO struct { } type NonstockListDTO struct { - Id uint `json:"id"` - Name string `json:"name"` - Flags []string `json:"flags"` - Uom *uomDTO.UomRelationDTO `json:"uom"` - CreatedUser *userDTO.UserRelationDTO `json:"created_user"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + Id uint `json:"id"` + Name string `json:"name"` + Flags []string `json:"flags"` + Uom *uomDTO.UomRelationDTO `json:"uom"` + Suppliers []supplierDTO.SupplierRelationDTO `json:"suppliers,omitempty"` + CreatedUser *userDTO.UserRelationDTO `json:"created_user"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` } type NonstockDetailDTO struct { @@ -76,6 +77,7 @@ func ToNonstockListDTO(e entity.Nonstock) NonstockListDTO { Name: e.Name, Flags: flags, Uom: uomRef, + Suppliers: toNonstockSupplierDTOs(e.NonstockSuppliers), CreatedAt: e.CreatedAt, UpdatedAt: e.UpdatedAt, CreatedUser: createdUser, @@ -95,3 +97,23 @@ func ToNonstockDetailDTO(e entity.Nonstock) NonstockDetailDTO { NonstockListDTO: ToNonstockListDTO(e), } } + +func toNonstockSupplierDTOs(relations []entity.NonstockSupplier) []supplierDTO.SupplierRelationDTO { + if len(relations) == 0 { + return nil + } + + result := make([]supplierDTO.SupplierRelationDTO, 0, len(relations)) + for _, relation := range relations { + if relation.Supplier.Id == 0 { + continue + } + result = append(result, supplierDTO.ToSupplierRelationDTO(relation.Supplier)) + } + + if len(result) == 0 { + return nil + } + + return result +} diff --git a/internal/modules/purchases/dto/purchase.dto.go b/internal/modules/purchases/dto/purchase.dto.go index d6114952..12fd714d 100644 --- a/internal/modules/purchases/dto/purchase.dto.go +++ b/internal/modules/purchases/dto/purchase.dto.go @@ -42,7 +42,6 @@ type PurchaseDetailDTO struct { LatestApproval *approvalDTO.ApprovalRelationDTO `json:"latest_approval"` } - type PurchaseItemDTO struct { Id uint `json:"id"` ProductID uint `json:"product_id"` @@ -59,9 +58,10 @@ type PurchaseItemDTO struct { TravelNumber *string `json:"travel_number"` TravelDocumentPath *string `json:"travel_document_path"` VehicleNumber *string `json:"vehicle_number"` + TransportPerItem *float64 `json:"transport_per_item,omitempty"` + ExpeditionVendor *supplierDTO.SupplierRelationDTO `json:"expedition_vendor,omitempty"` } - func ToPurchaseRelationDTO(p *entity.Purchase) PurchaseRelationDTO { return PurchaseRelationDTO{ Id: p.Id, @@ -107,6 +107,20 @@ func ToPurchaseItemDTO(item entity.PurchaseItem) PurchaseItemDTO { dto.Warehouse = &summary } + if item.ExpenseNonstock != nil { + priceCopy := item.ExpenseNonstock.Price + dto.TransportPerItem = &priceCopy + + if item.ExpenseNonstock.Expense != nil { + exp := item.ExpenseNonstock.Expense + + if exp.Supplier != nil && exp.Supplier.Id != 0 { + supplierSummary := supplierDTO.ToSupplierRelationDTO(*exp.Supplier) + dto.ExpeditionVendor = &supplierSummary + } + } + } + return dto } diff --git a/internal/modules/purchases/services/purchase.service.go b/internal/modules/purchases/services/purchase.service.go index cd25a364..fa1f2563 100644 --- a/internal/modules/purchases/services/purchase.service.go +++ b/internal/modules/purchases/services/purchase.service.go @@ -110,7 +110,10 @@ func (s *purchaseService) withRelations(db *gorm.DB) *gorm.DB { Preload("Items.Product.Flags"). Preload("Items.Warehouse.Area"). Preload("Items.Warehouse.Location"). - Preload("Items.ProductWarehouse") + Preload("Items.ProductWarehouse"). + Preload("Items.ExpenseNonstock"). + Preload("Items.ExpenseNonstock.Expense"). + Preload("Items.ExpenseNonstock.Expense.Supplier") } func (s *purchaseService) GetAll(c *fiber.Ctx, params *validation.Query) ([]entity.Purchase, int64, error) { @@ -319,8 +322,8 @@ func (s *purchaseService) CreateOne(c *fiber.Ctx, req *validation.CreatePurchase purchase := &entity.Purchase{ SupplierId: uint(req.SupplierID), // DueDate: dueDate, - Notes: req.Notes, - CreatedBy: uint(actorID), + Notes: req.Notes, + CreatedBy: uint(actorID), } items := make([]*entity.PurchaseItem, 0, len(aggregated)) @@ -432,7 +435,7 @@ func (s *purchaseService) ApproveStaffPurchase(c *fiber.Ctx, id uint, req *valid syncReceiving := !isInitialApproval && hasReceivingData - if len(req.Items) == 0 { + if action == entity.ApprovalActionApproved && len(req.Items) == 0 { return nil, utils.BadRequest("Items must not be empty for staff approval") } @@ -1397,21 +1400,21 @@ func (s *purchaseService) loadPurchase( } func collectPFKIDsFromPurchase(p *entity.Purchase) []uint { - seen := make(map[uint]struct{}) - ids := make([]uint, 0) + seen := make(map[uint]struct{}) + ids := make([]uint, 0) - for _, item := range p.Items { - if item.ProjectFlockKandangId == nil || *item.ProjectFlockKandangId == 0 { - continue - } - id := uint(*item.ProjectFlockKandangId) - if _, ok := seen[id]; ok { - continue - } - seen[id] = struct{}{} - ids = append(ids, id) - } - return ids + for _, item := range p.Items { + if item.ProjectFlockKandangId == nil || *item.ProjectFlockKandangId == 0 { + continue + } + id := uint(*item.ProjectFlockKandangId) + if _, ok := seen[id]; ok { + continue + } + seen[id] = struct{}{} + ids = append(ids, id) + } + return ids } func (s *purchaseService) ensureProjectFlockNotClosedForPurchase( ctx context.Context, @@ -1429,5 +1432,3 @@ func (s *purchaseService) ensureProjectFlockNotClosedForPurchase( return commonSvc.EnsureProjectFlockNotClosedForProductWarehouses(ctx, db, pfkIDs) } - -