feat: add GetLinesByQuarantineId method to QuarantineController and service for retrieving quarantine lines
Deploy Application / deploy (push) Successful in 25s Details

This commit is contained in:
Habib Fatkhul Rohman 2025-12-01 11:44:21 +07:00
parent 257ffc8af2
commit 6fb7218de7
3 changed files with 81 additions and 40 deletions

View File

@ -17,6 +17,7 @@ type QuarantineController interface {
Delete(ctx *gin.Context) Delete(ctx *gin.Context)
GetById(ctx *gin.Context) GetById(ctx *gin.Context)
GetAll(ctx *gin.Context) GetAll(ctx *gin.Context)
GetLinesByQuarantineId(ctx *gin.Context)
CreateLine(ctx *gin.Context) CreateLine(ctx *gin.Context)
UpdateLine(ctx *gin.Context) UpdateLine(ctx *gin.Context)
DeleteLine(ctx *gin.Context) DeleteLine(ctx *gin.Context)
@ -28,6 +29,20 @@ type quarantineController struct {
db *gorm.DB db *gorm.DB
} }
// GetLinesByQuarantineId implements QuarantineController.
func (c *quarantineController) GetLinesByQuarantineId(ctx *gin.Context) {
id := ctx.Param("id")
lines, err := c.quarantineService.GetLinesByQuarantineId(ctx, id)
if err != nil {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_QUARANTINE_LINES, err.Error(), nil)
ctx.JSON(500, res)
return
}
res := utils.BuildResponseSuccess(dto.MESSAGE_SUCCESS_GET_QUARANTINE_LINES, lines)
ctx.JSON(200, res)
}
func NewQuarantineController(i *do.Injector, quarantineService service.QuarantineService) QuarantineController { func NewQuarantineController(i *do.Injector, quarantineService service.QuarantineService) QuarantineController {
return &quarantineController{ return &quarantineController{
quarantineService: quarantineService, quarantineService: quarantineService,

View File

@ -1,5 +1,10 @@
package dto package dto
import (
"github.com/Caknoooo/go-gin-clean-starter/database/entities"
"github.com/Caknoooo/go-gin-clean-starter/pkg/utils"
)
const ( const (
MESSAGE_FAILED_CREATE_QUARANTINE = "failed create quarantine" MESSAGE_FAILED_CREATE_QUARANTINE = "failed create quarantine"
MESSAGE_FAILED_CREATE_QUARANTINE_LINE = "failed create quarantine line" MESSAGE_FAILED_CREATE_QUARANTINE_LINE = "failed create quarantine line"
@ -18,6 +23,8 @@ const (
MESSAGE_FAILED_GET_DATA_FROM_BODY = "failed get data from body" MESSAGE_FAILED_GET_DATA_FROM_BODY = "failed get data from body"
MESSAGE_SUCCESS_COMPLETE_QUARANTINE = "success complete quarantine" MESSAGE_SUCCESS_COMPLETE_QUARANTINE = "success complete quarantine"
MESSAGE_FAILED_COMPLETE_QUARANTINE = "failed complete quarantine" MESSAGE_FAILED_COMPLETE_QUARANTINE = "failed complete quarantine"
MESSAGE_FAILED_GET_QUARANTINE_LINES = "failed get quarantine lines"
MESSAGE_SUCCESS_GET_QUARANTINE_LINES = "success get quarantine lines"
) )
type QuarantineCreateRequest struct { type QuarantineCreateRequest struct {
@ -85,3 +92,44 @@ type QuarantineLineResponse struct {
Quarantine string `json:"quarantine"` Quarantine string `json:"quarantine"`
Client string `json:"client"` Client string `json:"client"`
} }
func MapQuarantineToResponse(entity entities.TInventoryQuarantineEntity, lines []entities.TInventoryQuarantineLineEntity) QuarantineResponse {
resp := QuarantineResponse{
ID: entity.ID.String(),
DocumentNumber: entity.DocumentNumber,
DocumentDate: utils.DateTimeToString(entity.DocumentDate),
Status: entity.Status,
WarehouseID: entity.WarehouseID.String(),
ZonaID: entity.ZonaID.String(),
ClientID: entity.ClientID.String(),
Warehouse: entity.Warehouse.Name,
Zona: entity.Zona.Name,
Client: entity.Client.Name,
}
return resp
}
func MapQuarantineLineToResponse(line entities.TInventoryQuarantineLineEntity) QuarantineLineResponse {
return QuarantineLineResponse{
ID: line.ID.String(),
QuarantineID: line.QuarantineID.String(),
StorageID: line.StorageID.String(),
ProductID: line.ProductID.String(),
ClientID: line.ClientID.String(),
Product: line.Product.Name,
Storage: line.StorageID.String(), // gunakan StorageID, karena field Name tidak ada
Quarantine: line.Quarantine.DocumentNumber,
Client: line.Client.Name,
}
}
func MapQuarantineLinesToResponse(lines []entities.TInventoryQuarantineLineEntity) []QuarantineLineResponse {
var responses []QuarantineLineResponse
for _, e := range lines {
responses = append(responses, MapQuarantineLineToResponse(e))
}
if responses == nil {
responses = make([]QuarantineLineResponse, 0)
}
return responses
}

View File

@ -7,6 +7,7 @@ import (
"github.com/Caknoooo/go-gin-clean-starter/database/entities" "github.com/Caknoooo/go-gin-clean-starter/database/entities"
invstoragerepository "github.com/Caknoooo/go-gin-clean-starter/modules/inventory_storage/repository" invstoragerepository "github.com/Caknoooo/go-gin-clean-starter/modules/inventory_storage/repository"
productrepository "github.com/Caknoooo/go-gin-clean-starter/modules/product/repository" productrepository "github.com/Caknoooo/go-gin-clean-starter/modules/product/repository"
dto "github.com/Caknoooo/go-gin-clean-starter/modules/quarantine/dto"
dtodomain "github.com/Caknoooo/go-gin-clean-starter/modules/quarantine/dto" dtodomain "github.com/Caknoooo/go-gin-clean-starter/modules/quarantine/dto"
"github.com/Caknoooo/go-gin-clean-starter/modules/quarantine/query" "github.com/Caknoooo/go-gin-clean-starter/modules/quarantine/query"
"github.com/Caknoooo/go-gin-clean-starter/modules/quarantine/repository" "github.com/Caknoooo/go-gin-clean-starter/modules/quarantine/repository"
@ -21,6 +22,7 @@ type QuarantineService interface {
GetAll(ctx context.Context, filter query.QuarantineFilter) ([]dtodomain.QuarantineResponse, int64, error) GetAll(ctx context.Context, filter query.QuarantineFilter) ([]dtodomain.QuarantineResponse, int64, error)
Update(ctx context.Context, req dtodomain.QuarantineUpdateRequest, id string) (dtodomain.QuarantineResponse, error) Update(ctx context.Context, req dtodomain.QuarantineUpdateRequest, id string) (dtodomain.QuarantineResponse, error)
Delete(ctx context.Context, id string) error Delete(ctx context.Context, id string) error
GetLinesByQuarantineId(ctx context.Context, quarantineId string) ([]dtodomain.QuarantineLineResponse, error)
CreateLine(ctx context.Context, quarantineId string, req dtodomain.QuarantineLineCreateRequest) (dtodomain.QuarantineLineResponse, error) CreateLine(ctx context.Context, quarantineId string, req dtodomain.QuarantineLineCreateRequest) (dtodomain.QuarantineLineResponse, error)
UpdateLine(ctx context.Context, lineId string, req dtodomain.QuarantineLineUpdateRequest) (dtodomain.QuarantineLineResponse, error) UpdateLine(ctx context.Context, lineId string, req dtodomain.QuarantineLineUpdateRequest) (dtodomain.QuarantineLineResponse, error)
DeleteLine(ctx context.Context, lineId string) error DeleteLine(ctx context.Context, lineId string) error
@ -34,6 +36,15 @@ type quarantineService struct {
productRepo productrepository.ProductRepository productRepo productrepository.ProductRepository
} }
// GetLinesByQuarantineId implements QuarantineService.
func (s *quarantineService) GetLinesByQuarantineId(ctx context.Context, quarantineId string) ([]dtodomain.QuarantineLineResponse, error) {
lines, err := s.quarantineLineRepo.GetAllByQuarantineId(ctx, quarantineId)
if err != nil {
return nil, err
}
return dto.MapQuarantineLinesToResponse(lines), nil
}
func NewQuarantineService(db *gorm.DB, quarantineRepo repository.QuarantineRepository, quarantineLineRepo repository.QuarantineLineRepository, productRepo productrepository.ProductRepository, uomRepo uomrepository.UomRepository, invStorageRepository invstoragerepository.InventoryStorageRepository) QuarantineService { func NewQuarantineService(db *gorm.DB, quarantineRepo repository.QuarantineRepository, quarantineLineRepo repository.QuarantineLineRepository, productRepo productrepository.ProductRepository, uomRepo uomrepository.UomRepository, invStorageRepository invstoragerepository.InventoryStorageRepository) QuarantineService {
return &quarantineService{ return &quarantineService{
db: db, db: db,
@ -78,7 +89,7 @@ func (s *quarantineService) Create(ctx context.Context, req dtodomain.Quarantine
} }
} }
tx.Commit() tx.Commit()
return mapQuarantineToResponse(created, lines), nil return dto.MapQuarantineToResponse(created, lines), nil
} }
func (s *quarantineService) GetById(ctx context.Context, id string) (dtodomain.QuarantineResponse, error) { func (s *quarantineService) GetById(ctx context.Context, id string) (dtodomain.QuarantineResponse, error) {
@ -87,7 +98,7 @@ func (s *quarantineService) GetById(ctx context.Context, id string) (dtodomain.Q
return dtodomain.QuarantineResponse{}, err return dtodomain.QuarantineResponse{}, err
} }
lines, _ := s.quarantineLineRepo.GetAllByQuarantineId(ctx, id) lines, _ := s.quarantineLineRepo.GetAllByQuarantineId(ctx, id)
return mapQuarantineToResponse(entity, lines), nil return dto.MapQuarantineToResponse(entity, lines), nil
} }
func (s *quarantineService) GetAll(ctx context.Context, filter query.QuarantineFilter) ([]dtodomain.QuarantineResponse, int64, error) { func (s *quarantineService) GetAll(ctx context.Context, filter query.QuarantineFilter) ([]dtodomain.QuarantineResponse, int64, error) {
@ -98,7 +109,7 @@ func (s *quarantineService) GetAll(ctx context.Context, filter query.QuarantineF
var responses []dtodomain.QuarantineResponse var responses []dtodomain.QuarantineResponse
for _, entity := range entities { for _, entity := range entities {
lines, _ := s.quarantineLineRepo.GetAllByQuarantineId(ctx, entity.ID.String()) lines, _ := s.quarantineLineRepo.GetAllByQuarantineId(ctx, entity.ID.String())
responses = append(responses, mapQuarantineToResponse(entity, lines)) responses = append(responses, dto.MapQuarantineToResponse(entity, lines))
} }
return responses, total, nil return responses, total, nil
} }
@ -125,7 +136,7 @@ func (s *quarantineService) Update(ctx context.Context, req dtodomain.Quarantine
} }
tx.Commit() tx.Commit()
lines, _ := s.quarantineLineRepo.GetAllByQuarantineId(ctx, id) lines, _ := s.quarantineLineRepo.GetAllByQuarantineId(ctx, id)
return mapQuarantineToResponse(updated, lines), nil return dto.MapQuarantineToResponse(updated, lines), nil
} }
func (s *quarantineService) Delete(ctx context.Context, id string) error { func (s *quarantineService) Delete(ctx context.Context, id string) error {
@ -157,7 +168,7 @@ func (s *quarantineService) CreateLine(ctx context.Context, quarantineId string,
if err != nil { if err != nil {
return dtodomain.QuarantineLineResponse{}, err return dtodomain.QuarantineLineResponse{}, err
} }
return mapQuarantineLineToResponse(created), nil return dto.MapQuarantineLineToResponse(created), nil
} }
func (s *quarantineService) UpdateLine(ctx context.Context, lineId string, req dtodomain.QuarantineLineUpdateRequest) (dtodomain.QuarantineLineResponse, error) { func (s *quarantineService) UpdateLine(ctx context.Context, lineId string, req dtodomain.QuarantineLineUpdateRequest) (dtodomain.QuarantineLineResponse, error) {
@ -171,7 +182,7 @@ func (s *quarantineService) UpdateLine(ctx context.Context, lineId string, req d
if err != nil { if err != nil {
return dtodomain.QuarantineLineResponse{}, err return dtodomain.QuarantineLineResponse{}, err
} }
return mapQuarantineLineToResponse(updated), nil return dto.MapQuarantineLineToResponse(updated), nil
} }
func (s *quarantineService) DeleteLine(ctx context.Context, lineId string) error { func (s *quarantineService) DeleteLine(ctx context.Context, lineId string) error {
@ -189,7 +200,7 @@ func (s *quarantineService) OnComplete(ctx context.Context, id string) (dtodomai
return dtodomain.QuarantineResponse{}, err return dtodomain.QuarantineResponse{}, err
} }
lines, _ := s.quarantineLineRepo.GetAllByQuarantineId(ctx, id) lines, _ := s.quarantineLineRepo.GetAllByQuarantineId(ctx, id)
return mapQuarantineToResponse(updated, lines), nil return dto.MapQuarantineToResponse(updated, lines), nil
} }
func parseUUID(id string) uuid.UUID { func parseUUID(id string) uuid.UUID {
@ -201,36 +212,3 @@ func parseDate(dateStr string) time.Time {
t, _ := time.Parse("2006-01-02", dateStr) t, _ := time.Parse("2006-01-02", dateStr)
return t return t
} }
func mapQuarantineToResponse(entity entities.TInventoryQuarantineEntity, lines []entities.TInventoryQuarantineLineEntity) dtodomain.QuarantineResponse {
resp := dtodomain.QuarantineResponse{
ID: entity.ID.String(),
DocumentNumber: entity.DocumentNumber,
DocumentDate: entity.DocumentDate.Format("2006-01-02"),
Status: entity.Status,
WarehouseID: entity.WarehouseID.String(),
ZonaID: entity.ZonaID.String(),
ClientID: entity.ClientID.String(),
Warehouse: entity.Warehouse.Name,
Zona: entity.Zona.Name,
Client: entity.Client.Name,
}
for _, line := range lines {
resp.QuarantineLines = append(resp.QuarantineLines, mapQuarantineLineToResponse(line))
}
return resp
}
func mapQuarantineLineToResponse(line entities.TInventoryQuarantineLineEntity) dtodomain.QuarantineLineResponse {
return dtodomain.QuarantineLineResponse{
ID: line.ID.String(),
QuarantineID: line.QuarantineID.String(),
StorageID: line.StorageID.String(),
ProductID: line.ProductID.String(),
ClientID: line.ClientID.String(),
Product: line.Product.Name,
Storage: line.StorageID.String(), // gunakan StorageID, karena field Name tidak ada
Quarantine: line.Quarantine.DocumentNumber,
Client: line.Client.Name,
}
}