diff --git a/database/entities/t_inventory_return_line_entity.go b/database/entities/t_inventory_return_line_entity.go index f81a835..f6d6d36 100644 --- a/database/entities/t_inventory_return_line_entity.go +++ b/database/entities/t_inventory_return_line_entity.go @@ -5,9 +5,10 @@ import ( ) type TInventoryReturnLineEntity struct { - ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"` - Quantity float64 `gorm:"type:numeric;default:0" json:"quantity"` - Attachment string `gorm:"type:text;" json:"attachment"` + ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"` + ReturnQuantity float64 `gorm:"type:numeric;default:0" json:"return_quantity"` + IssuedQuantity float64 `gorm:"type:numeric;default:0" json:"issued_quantity"` + Attachment string `gorm:"type:text;" json:"attachment"` InvReturnID uuid.UUID `gorm:"type:uuid;index;" json:"inv_return_id"` ProductID uuid.UUID `gorm:"type:uuid;index;" json:"product_id"` diff --git a/database/migration.go b/database/migration.go index 4033aab..63ef6a1 100644 --- a/database/migration.go +++ b/database/migration.go @@ -50,37 +50,37 @@ func Migrate(db *gorm.DB) error { func MigrateFresh(db *gorm.DB) error { // Drop tables if err := db.Migrator().DropTable( - // &entities.M_Client{}, - // &entities.M_User{}, - // &entities.RefreshToken{}, - // &entities.M_Menu{}, - // &entities.M_Role{}, - // &entities.M_Permissions{}, - // &entities.M_User_Role{}, - // &entities.M_Role_Menu{}, - // &entities.M_Menu_Client{}, - // &entities.M_Role_Permission{}, - // &entities.M_MaintenanceGroup{}, - // &entities.M_MaintenanceGroupRole{}, - // &entities.M_MaintenanceGroupRoleUser{}, - // &entities.MCategoryEntity{}, - // &entities.MProductEntity{}, - // &entities.MUomEntity{}, - // &entities.MVendorEntity{}, - // &entities.MCrossReferenceEntity{}, - // &entities.MWarehouseEntity{}, - // &entities.MZonaEntity{}, - // &entities.MAisleEntity{}, - // &entities.TAssignmentEntity{}, - // &entities.TAssignmentUserEntity{}, - &entities.TInventoryReceiptEntity{}, - &entities.TInventoryReceiptLineEntity{}, - &entities.TInventoryRequestEntity{}, - &entities.TInventoryRequestLineEntity{}, - &entities.TInventoryIssueEntity{}, - &entities.TInventoryIssueLineEntity{}, - &entities.TInventoryReturnEntity{}, - &entities.TInventoryReturnLineEntity{}, + // &entities.M_Client{}, + // &entities.M_User{}, + // &entities.RefreshToken{}, + // &entities.M_Menu{}, + // &entities.M_Role{}, + // &entities.M_Permissions{}, + // &entities.M_User_Role{}, + // &entities.M_Role_Menu{}, + // &entities.M_Menu_Client{}, + // &entities.M_Role_Permission{}, + // &entities.M_MaintenanceGroup{}, + // &entities.M_MaintenanceGroupRole{}, + // &entities.M_MaintenanceGroupRoleUser{}, + // &entities.MCategoryEntity{}, + // &entities.MProductEntity{}, + // &entities.MUomEntity{}, + // &entities.MVendorEntity{}, + // &entities.MCrossReferenceEntity{}, + // &entities.MWarehouseEntity{}, + // &entities.MZonaEntity{}, + // &entities.MAisleEntity{}, + // &entities.TAssignmentEntity{}, + // &entities.TAssignmentUserEntity{}, + // &entities.TInventoryReceiptEntity{}, + // &entities.TInventoryReceiptLineEntity{}, + // &entities.TInventoryRequestEntity{}, + // &entities.TInventoryRequestLineEntity{}, + // &entities.TInventoryIssueEntity{}, + // &entities.TInventoryIssueLineEntity{}, + &entities.TInventoryReturnEntity{}, + &entities.TInventoryReturnLineEntity{}, // &entities.InventoryTransactionEntity{}, // &entities.InventoryStorageEntity{}, ); err != nil { diff --git a/modules/inventory_return/dto/inventory_return_dto.go b/modules/inventory_return/dto/inventory_return_dto.go index f862d65..2cd4553 100644 --- a/modules/inventory_return/dto/inventory_return_dto.go +++ b/modules/inventory_return/dto/inventory_return_dto.go @@ -2,7 +2,9 @@ package dto import ( "github.com/Caknoooo/go-gin-clean-starter/database/entities" + pkgdto "github.com/Caknoooo/go-gin-clean-starter/pkg/dto" "github.com/Caknoooo/go-gin-clean-starter/pkg/utils" + "github.com/google/uuid" ) const ( @@ -33,11 +35,12 @@ type InventoryReturnCreateRequest struct { } type InventoryReturnLineCreateRequest struct { - Quantity float64 `json:"quantity"` - Attachment string `json:"attachment"` - InvReturnID string `json:"inv_return_id"` - ProductID string `json:"product_id"` - ClientID string `json:"client_id"` + ReturnQuantity float64 `json:"return_quantity"` + IssuedQuantity float64 `json:"issued_quantity"` + Attachment string `json:"attachment"` + InvReturnID string `json:"inv_return_id"` + ProductID string `json:"product_id"` + ClientID string `json:"client_id"` } type InventoryReturnUpdateRequest struct { @@ -49,11 +52,12 @@ type InventoryReturnUpdateRequest struct { } type InventoryReturnLineUpdateRequest struct { - Quantity *float64 `json:"quantity"` - Attachment *string `json:"attachment"` - InvReturnID *string `json:"inv_return_id"` - ProductID *string `json:"product_id"` - ClientID *string `json:"client_id"` + ReturnQuantity *float64 `json:"return_quantity"` + IssuedQuantity *float64 `json:"issued_quantity"` + Attachment *string `json:"attachment"` + InvReturnID *string `json:"inv_return_id"` + ProductID *string `json:"product_id"` + ClientID *string `json:"client_id"` } type InventoryReturnResponse struct { @@ -62,18 +66,33 @@ type InventoryReturnResponse struct { DocumentDate string `json:"document_date"` Notes string `json:"notes"` Status string `json:"status"` - InvIssueID string `json:"inv_issue_id"` - ClientID string `json:"client_id"` + InvIssue InvReturnInvIssue `json:"inv_issue"` + Client pkgdto.IdNameResponse `json:"client"` ReturnLines []InventoryReturnLineResponse `json:"return_lines,omitempty"` } +type InvReturnInvIssue struct { + ID string `json:"id"` + DocumentNumber string `json:"document_number"` + DocumentDate string `json:"document_date"` + IssuerBy pkgdto.IdNameResponse `json:"issuer_by"` +} + type InventoryReturnLineResponse struct { - ID string `json:"id"` - Quantity float64 `json:"quantity"` - Attachment string `json:"attachment"` - InvReturnID string `json:"inv_return_id"` - ProductID string `json:"product_id"` - ClientID string `json:"client_id"` + ID string `json:"id"` + IssuedQuantity float64 `json:"issued_quantity"` + ReturnQuantity float64 `json:"return_quantity"` + Attachment string `json:"attachment"` + InvReturnID string `json:"inv_return_id"` + Product InvReturnProduct `json:"product"` + Client pkgdto.IdNameResponse `json:"client"` +} + +type InvReturnProduct struct { + ID string `json:"id"` + Name string `json:"name"` + RefNumber string `json:"ref_number"` + Uom pkgdto.IdNameResponse `json:"uom"` } // Helper untuk mapping entity ke response @@ -82,25 +101,77 @@ func ToInventoryReturnResponse(entity entities.TInventoryReturnEntity) Inventory for _, line := range entity.ReturnLines { lines = append(lines, ToInventoryReturnLineResponse(line)) } + + client := pkgdto.IdNameResponse{} + if entity.Client.ID != uuid.Nil { + client = pkgdto.IdNameResponse{ + ID: entity.Client.ID.String(), + Name: entity.Client.Name, + } + } + + invIssue := InvReturnInvIssue{} + if entity.InvIssue.ID != uuid.Nil { + issuer := pkgdto.IdNameResponse{} + if entity.InvIssue.IssuerBy != uuid.Nil { + issuer = pkgdto.IdNameResponse{ + ID: entity.InvIssue.IssuerBy.String(), + Name: "", // jika ada relasi user, isi nama user + } + } + invIssue = InvReturnInvIssue{ + ID: entity.InvIssue.ID.String(), + DocumentNumber: entity.InvIssue.DocumentNumber, + DocumentDate: utils.DateTimeToString(entity.InvIssue.DocumentDate), + IssuerBy: issuer, + } + } + return InventoryReturnResponse{ ID: entity.ID.String(), DocumentNumber: entity.DocumentNumber, DocumentDate: utils.DateTimeToString(entity.DocumentDate), Notes: entity.Notes, Status: entity.Status, - InvIssueID: entity.InvIssueID.String(), - ClientID: entity.ClientID.String(), + InvIssue: invIssue, + Client: client, ReturnLines: lines, } } func ToInventoryReturnLineResponse(line entities.TInventoryReturnLineEntity) InventoryReturnLineResponse { + client := pkgdto.IdNameResponse{} + if line.Client.ID != uuid.Nil { + client = pkgdto.IdNameResponse{ + ID: line.Client.ID.String(), + Name: line.Client.Name, + } + } + + product := InvReturnProduct{} + if line.Product.ID != uuid.Nil { + uom := pkgdto.IdNameResponse{} + if line.Product.Uom.ID != uuid.Nil { + uom = pkgdto.IdNameResponse{ + ID: line.Product.Uom.ID.String(), + Name: line.Product.Uom.Name, + } + } + product = InvReturnProduct{ + ID: line.Product.ID.String(), + Name: line.Product.Name, + RefNumber: line.Product.RefNumber, + Uom: uom, + } + } + return InventoryReturnLineResponse{ - ID: line.ID.String(), - Quantity: line.Quantity, - Attachment: line.Attachment, - InvReturnID: line.InvReturnID.String(), - ProductID: line.ProductID.String(), - ClientID: line.ClientID.String(), + ID: line.ID.String(), + IssuedQuantity: line.IssuedQuantity, // pastikan field ini ada di entity + ReturnQuantity: line.ReturnQuantity, // pastikan field ini ada di entity + Attachment: line.Attachment, + InvReturnID: line.InvReturnID.String(), + Product: product, + Client: client, } } diff --git a/modules/inventory_return/service/inventory_return_service.go b/modules/inventory_return/service/inventory_return_service.go index 2537810..06c703e 100644 --- a/modules/inventory_return/service/inventory_return_service.go +++ b/modules/inventory_return/service/inventory_return_service.go @@ -51,15 +51,17 @@ func (s *inventoryReturnService) UpdateLine(ctx context.Context, lineId string, if err != nil { return dtodomain.InventoryReturnLineResponse{}, err } - - if req.Quantity != nil { + if req.ReturnQuantity != nil { if product.IsReturnable { return dtodomain.InventoryReturnLineResponse{}, fmt.Errorf("product is not returnable, quantity cannot be updated") } else { - line.Quantity = *req.Quantity + line.ReturnQuantity = *req.ReturnQuantity } } + if req.IssuedQuantity != nil { + line.IssuedQuantity = *req.IssuedQuantity + } if req.Attachment != nil { line.Attachment = *req.Attachment } @@ -133,11 +135,12 @@ func (s *inventoryReturnService) Create(ctx context.Context, req dtodomain.Inven qty = issueLine.IssuedQuantity } lines = append(lines, entities.TInventoryReturnLineEntity{ - Quantity: qty, - Attachment: "", // isi sesuai kebutuhan - InvReturnID: created.ID, - ProductID: issueLine.ProductID, - ClientID: issueLine.ClientID, + ReturnQuantity: qty, + IssuedQuantity: issueLine.IssuedQuantity, + Attachment: "", // isi sesuai kebutuhan + InvReturnID: created.ID, + ProductID: issueLine.ProductID, + ClientID: issueLine.ClientID, }) } if len(lines) > 0 { @@ -237,11 +240,12 @@ func (s *inventoryReturnService) CreateLine(ctx context.Context, returnId string return dtodomain.InventoryReturnLineResponse{}, err } line := entities.TInventoryReturnLineEntity{ - Quantity: req.Quantity, - Attachment: req.Attachment, - InvReturnID: invReturnUUID, - ProductID: productUUID, - ClientID: clientUUID, + ReturnQuantity: req.ReturnQuantity, + IssuedQuantity: req.IssuedQuantity, + Attachment: req.Attachment, + InvReturnID: invReturnUUID, + ProductID: productUUID, + ClientID: clientUUID, } created, err := s.returnLineRepo.Create(ctx, nil, line) if err != nil {