mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
Feat[BE] : add avaibility DOC on lookup porject flock API, add note request json on chickin
This commit is contained in:
+4
-2
@@ -30,6 +30,10 @@ func (u *ProductWarehouseController) GetAll(c *fiber.Ctx) error {
|
|||||||
WarehouseId: uint(c.QueryInt("warehouse_id", 0)),
|
WarehouseId: uint(c.QueryInt("warehouse_id", 0)),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if query.Page < 1 || query.Limit < 1 {
|
||||||
|
return fiber.NewError(fiber.StatusBadRequest, "page and limit must be greater than 0")
|
||||||
|
}
|
||||||
|
|
||||||
result, totalResults, err := u.ProductWarehouseService.GetAll(c, query)
|
result, totalResults, err := u.ProductWarehouseService.GetAll(c, query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -71,5 +75,3 @@ func (u *ProductWarehouseController) GetOne(c *fiber.Ctx) error {
|
|||||||
Data: dto.ToProductWarehouseListDTO(*result),
|
Data: dto.ToProductWarehouseListDTO(*result),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,26 @@ func (s productWarehouseService) GetAll(c *fiber.Ctx, params *validation.Query)
|
|||||||
return nil, 0, err
|
return nil, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if params.ProductId > 0 {
|
||||||
|
isProductExist, err := s.Repository.IsProductExist(c.Context(), params.ProductId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
if !isProductExist {
|
||||||
|
return nil, 0, fiber.NewError(fiber.StatusNotFound, "Product not found")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if params.WarehouseId > 0 {
|
||||||
|
isWarehouseExist, err := s.Repository.IsWarehouseExist(c.Context(), params.WarehouseId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
if !isWarehouseExist {
|
||||||
|
return nil, 0, fiber.NewError(fiber.StatusNotFound, "Warehouse not found")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
offset := (params.Page - 1) * params.Limit
|
offset := (params.Page - 1) * params.Limit
|
||||||
|
|
||||||
productWarehouses, total, err := s.Repository.GetAll(c.Context(), offset, params.Limit, func(db *gorm.DB) *gorm.DB {
|
productWarehouses, total, err := s.Repository.GetAll(c.Context(), offset, params.Limit, func(db *gorm.DB) *gorm.DB {
|
||||||
|
|||||||
@@ -136,8 +136,6 @@ func (s *chickinService) CreateOne(c *fiber.Ctx, req *validation.Create) (*entit
|
|||||||
if len(productWarehouses) == 0 {
|
if len(productWarehouses) == 0 {
|
||||||
return nil, fiber.NewError(fiber.StatusNotFound, "Product Warehouse not found for the given Project Flock and Warehouse")
|
return nil, fiber.NewError(fiber.StatusNotFound, "Product Warehouse not found for the given Project Flock and Warehouse")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Jumlahkan semua quantity DOC
|
|
||||||
totalQuantity := 0.0
|
totalQuantity := 0.0
|
||||||
for _, pw := range productWarehouses {
|
for _, pw := range productWarehouses {
|
||||||
totalQuantity += pw.Quantity
|
totalQuantity += pw.Quantity
|
||||||
@@ -147,7 +145,6 @@ func (s *chickinService) CreateOne(c *fiber.Ctx, req *validation.Create) (*entit
|
|||||||
return nil, fiber.NewError(fiber.StatusBadRequest, "Insufficient quantity in Product Warehouses")
|
return nil, fiber.NewError(fiber.StatusBadRequest, "Insufficient quantity in Product Warehouses")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Buat satu chickin dengan total quantity
|
|
||||||
chickinDate, err := utils.ParseDateString(req.ChickInDate)
|
chickinDate, err := utils.ParseDateString(req.ChickInDate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.Log.Errorf("Failed to parse chickin date: %+v", err)
|
s.Log.Errorf("Failed to parse chickin date: %+v", err)
|
||||||
@@ -157,7 +154,7 @@ func (s *chickinService) CreateOne(c *fiber.Ctx, req *validation.Create) (*entit
|
|||||||
ProjectFlockKandangId: projectflockkandang.Id,
|
ProjectFlockKandangId: projectflockkandang.Id,
|
||||||
ChickInDate: chickinDate,
|
ChickInDate: chickinDate,
|
||||||
Quantity: totalQuantity,
|
Quantity: totalQuantity,
|
||||||
Note: "",
|
Note: req.Note,
|
||||||
CreatedBy: 1, //todo: ganti dengan user login
|
CreatedBy: 1, //todo: ganti dengan user login
|
||||||
}
|
}
|
||||||
err = s.Repository.CreateOne(c.Context(), newChickin, nil)
|
err = s.Repository.CreateOne(c.Context(), newChickin, nil)
|
||||||
@@ -176,7 +173,6 @@ func (s *chickinService) CreateOne(c *fiber.Ctx, req *validation.Create) (*entit
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// add ke detail chickin
|
|
||||||
newChickinDetail := &entity.ProjectChickinDetail{
|
newChickinDetail := &entity.ProjectChickinDetail{
|
||||||
ProjectChickinId: newChickin.Id,
|
ProjectChickinId: newChickin.Id,
|
||||||
ProductWarehouseId: pw.Id,
|
ProductWarehouseId: pw.Id,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package validation
|
|||||||
type Create struct {
|
type Create struct {
|
||||||
ProjectFlockKandangId uint `json:"project_flock_kandang_id" validate:"required,number,min=1"`
|
ProjectFlockKandangId uint `json:"project_flock_kandang_id" validate:"required,number,min=1"`
|
||||||
ChickInDate string `json:"chick_in_date" validate:"required,datetime=2006-01-02"`
|
ChickInDate string `json:"chick_in_date" validate:"required,datetime=2006-01-02"`
|
||||||
|
Note string `json:"note" validate:"omitempty`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Update struct {
|
type Update struct {
|
||||||
|
|||||||
@@ -246,17 +246,39 @@ func (u *ProjectflockController) GetFlockPeriodSummary(c *fiber.Ctx) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (u *ProjectflockController) LookupProjectFlockKandang(c *fiber.Ctx) error {
|
func (u *ProjectflockController) LookupProjectFlockKandang(c *fiber.Ctx) error {
|
||||||
projectFlockIdStr := c.Query("project_flock_id", "")
|
projectFlockId := c.QueryInt("project_flock_id", 0)
|
||||||
kandangIdStr := c.Query("kandang_id", "")
|
kandangId := c.QueryInt("kandang_id", 0)
|
||||||
|
|
||||||
result, err := u.ProjectflockService.GetProjectFlockKandangByParams(c, "", projectFlockIdStr, kandangIdStr)
|
if projectFlockId == 0 || kandangId == 0 {
|
||||||
|
return fiber.NewError(fiber.StatusBadRequest, "Invalid project_flock_id or kandang_id")
|
||||||
|
}
|
||||||
|
|
||||||
|
result, availableStock, err := u.ProjectflockService.GetProjectFlockKandangByProjectAndKandang(c, uint(projectFlockId), uint(kandangId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dtoResult := dto.ToProjectFlockKandangDTO(*result)
|
||||||
|
dtoResult.AvailableQuantity = float64(availableStock)
|
||||||
|
|
||||||
|
// populate available quantity for each kandang inside project_flock
|
||||||
|
if dtoResult.ProjectFlock != nil {
|
||||||
|
for i := range dtoResult.ProjectFlock.Kandangs {
|
||||||
|
kand := &dtoResult.ProjectFlock.Kandangs[i]
|
||||||
|
if kand.Id == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if q, qerr := u.ProjectflockService.GetAvailableDocQuantity(c, kand.Id); qerr == nil {
|
||||||
|
kand.AvailableQuantity = q
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// remove inner kandangs from project_flock to avoid duplication
|
||||||
|
dtoResult.ProjectFlock.Kandangs = nil
|
||||||
|
}
|
||||||
|
|
||||||
return c.Status(fiber.StatusOK).
|
return c.Status(fiber.StatusOK).
|
||||||
JSON(response.Success{Code: fiber.StatusOK,
|
JSON(response.Success{Code: fiber.StatusOK,
|
||||||
Status: "success",
|
Status: "success",
|
||||||
Message: "Get projectflock kandang successfully",
|
Message: "Get projectflock kandang successfully",
|
||||||
Data: dto.ToProjectFlockKandangDTO(*result)})
|
Data: dtoResult})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,10 +10,9 @@ import (
|
|||||||
userDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/users/dto"
|
userDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/users/dto"
|
||||||
)
|
)
|
||||||
|
|
||||||
// internal DTO used only for lookup response: project flock with kandangs carrying pivot ids
|
|
||||||
type KandangWithPivotDTO struct {
|
type KandangWithPivotDTO struct {
|
||||||
kandangDTO.KandangBaseDTO
|
kandangDTO.KandangBaseDTO
|
||||||
ProjectFlockKandangId *uint `json:"project_flock_kandang_id,omitempty"`
|
AvailableQuantity float64 `json:"available_quantity"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProjectFlockWithPivotDTO struct {
|
type ProjectFlockWithPivotDTO struct {
|
||||||
@@ -28,11 +27,13 @@ type ProjectFlockWithPivotDTO struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ProjectFlockKandangDTO struct {
|
type ProjectFlockKandangDTO struct {
|
||||||
Id uint `json:"id"`
|
Id uint `json:"id"`
|
||||||
ProjectFlockId uint `json:"project_flock_id"`
|
ProjectFlockKandangId uint `json:"project_flock_kandang_id"`
|
||||||
KandangId uint `json:"kandang_id"`
|
ProjectFlockId uint `json:"project_flock_id"`
|
||||||
Kandang *kandangDTO.KandangBaseDTO `json:"kandang,omitempty"`
|
KandangId uint `json:"kandang_id"`
|
||||||
ProjectFlock *ProjectFlockWithPivotDTO `json:"project_flock,omitempty"`
|
Kandang *kandangDTO.KandangBaseDTO `json:"kandang,omitempty"`
|
||||||
|
ProjectFlock *ProjectFlockWithPivotDTO `json:"project_flock,omitempty"`
|
||||||
|
AvailableQuantity float64 `json:"available_quantity"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func ToProjectFlockKandangDTO(e entity.ProjectFlockKandang) ProjectFlockKandangDTO {
|
func ToProjectFlockKandangDTO(e entity.ProjectFlockKandang) ProjectFlockKandangDTO {
|
||||||
@@ -44,7 +45,7 @@ func ToProjectFlockKandangDTO(e entity.ProjectFlockKandang) ProjectFlockKandangD
|
|||||||
|
|
||||||
var pf *ProjectFlockWithPivotDTO
|
var pf *ProjectFlockWithPivotDTO
|
||||||
if e.ProjectFlock.Id != 0 {
|
if e.ProjectFlock.Id != 0 {
|
||||||
// build project flock with kandangs that include pivot ids
|
|
||||||
pfLocal := ProjectFlockWithPivotDTO{
|
pfLocal := ProjectFlockWithPivotDTO{
|
||||||
ProjectFlockBaseDTO: ProjectFlockBaseDTO{
|
ProjectFlockBaseDTO: ProjectFlockBaseDTO{
|
||||||
Id: e.ProjectFlock.Id,
|
Id: e.ProjectFlock.Id,
|
||||||
@@ -53,7 +54,6 @@ func ToProjectFlockKandangDTO(e entity.ProjectFlockKandang) ProjectFlockKandangD
|
|||||||
Category: e.ProjectFlock.Category,
|
Category: e.ProjectFlock.Category,
|
||||||
}
|
}
|
||||||
|
|
||||||
// fill related small summaries
|
|
||||||
if e.ProjectFlock.Flock.Id != 0 {
|
if e.ProjectFlock.Flock.Id != 0 {
|
||||||
mapped := ToFlockSummaryDTO(e.ProjectFlock.Flock)
|
mapped := ToFlockSummaryDTO(e.ProjectFlock.Flock)
|
||||||
pfLocal.Flock = &mapped
|
pfLocal.Flock = &mapped
|
||||||
@@ -75,23 +75,16 @@ func ToProjectFlockKandangDTO(e entity.ProjectFlockKandang) ProjectFlockKandangD
|
|||||||
pfLocal.CreatedUser = &mapped
|
pfLocal.CreatedUser = &mapped
|
||||||
}
|
}
|
||||||
|
|
||||||
// build pivot map
|
|
||||||
pivotMap := make(map[uint]uint)
|
pivotMap := make(map[uint]uint)
|
||||||
for _, ph := range e.ProjectFlock.KandangHistory {
|
for _, ph := range e.ProjectFlock.KandangHistory {
|
||||||
pivotMap[ph.KandangId] = ph.Id
|
pivotMap[ph.KandangId] = ph.Id
|
||||||
}
|
}
|
||||||
|
|
||||||
// populate kandangs with pivot ids
|
|
||||||
for _, k := range e.ProjectFlock.Kandangs {
|
for _, k := range e.ProjectFlock.Kandangs {
|
||||||
kb := kandangDTO.ToKandangBaseDTO(k)
|
kb := kandangDTO.ToKandangBaseDTO(k)
|
||||||
var pid *uint
|
|
||||||
if v, ok := pivotMap[k.Id]; ok {
|
|
||||||
vv := v
|
|
||||||
pid = &vv
|
|
||||||
}
|
|
||||||
pfLocal.Kandangs = append(pfLocal.Kandangs, KandangWithPivotDTO{
|
pfLocal.Kandangs = append(pfLocal.Kandangs, KandangWithPivotDTO{
|
||||||
KandangBaseDTO: kb,
|
KandangBaseDTO: kb,
|
||||||
ProjectFlockKandangId: pid,
|
AvailableQuantity: 0,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,10 +92,12 @@ func ToProjectFlockKandangDTO(e entity.ProjectFlockKandang) ProjectFlockKandangD
|
|||||||
}
|
}
|
||||||
|
|
||||||
return ProjectFlockKandangDTO{
|
return ProjectFlockKandangDTO{
|
||||||
Id: e.Id,
|
Id: e.Id,
|
||||||
ProjectFlockId: e.ProjectFlockId,
|
ProjectFlockKandangId: e.Id,
|
||||||
KandangId: e.KandangId,
|
ProjectFlockId: e.ProjectFlockId,
|
||||||
Kandang: kandang,
|
KandangId: e.KandangId,
|
||||||
ProjectFlock: pf,
|
Kandang: kandang,
|
||||||
|
ProjectFlock: pf,
|
||||||
|
AvailableQuantity: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,10 @@ import (
|
|||||||
commonSvc "gitlab.com/mbugroup/lti-api.git/internal/common/service"
|
commonSvc "gitlab.com/mbugroup/lti-api.git/internal/common/service"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
rProductWarehouse "gitlab.com/mbugroup/lti-api.git/internal/modules/inventory/product-warehouses/repositories"
|
||||||
rFlock "gitlab.com/mbugroup/lti-api.git/internal/modules/master/flocks/repositories"
|
rFlock "gitlab.com/mbugroup/lti-api.git/internal/modules/master/flocks/repositories"
|
||||||
rKandang "gitlab.com/mbugroup/lti-api.git/internal/modules/master/kandangs/repositories"
|
rKandang "gitlab.com/mbugroup/lti-api.git/internal/modules/master/kandangs/repositories"
|
||||||
|
rWarehouse "gitlab.com/mbugroup/lti-api.git/internal/modules/master/warehouses/repositories"
|
||||||
rProjectflock "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/repositories"
|
rProjectflock "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/repositories"
|
||||||
|
|
||||||
sProjectflock "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/services"
|
sProjectflock "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/services"
|
||||||
@@ -27,6 +29,8 @@ func (ProjectflockModule) RegisterRoutes(router fiber.Router, db *gorm.DB, valid
|
|||||||
kandangRepo := rKandang.NewKandangRepository(db)
|
kandangRepo := rKandang.NewKandangRepository(db)
|
||||||
projectflockRepo := rProjectflock.NewProjectflockRepository(db)
|
projectflockRepo := rProjectflock.NewProjectflockRepository(db)
|
||||||
projectflockKandangRepo := rProjectflock.NewProjectFlockKandangRepository(db)
|
projectflockKandangRepo := rProjectflock.NewProjectFlockKandangRepository(db)
|
||||||
|
warehouseRepo := rWarehouse.NewWarehouseRepository(db)
|
||||||
|
productWarehouseRepo := rProductWarehouse.NewProductWarehouseRepository(db)
|
||||||
userRepo := rUser.NewUserRepository(db)
|
userRepo := rUser.NewUserRepository(db)
|
||||||
|
|
||||||
approvalRepo := commonRepo.NewApprovalRepository(db)
|
approvalRepo := commonRepo.NewApprovalRepository(db)
|
||||||
@@ -35,7 +39,7 @@ func (ProjectflockModule) RegisterRoutes(router fiber.Router, db *gorm.DB, valid
|
|||||||
panic(fmt.Sprintf("failed to register project flock approval workflow: %v", err))
|
panic(fmt.Sprintf("failed to register project flock approval workflow: %v", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
projectflockService := sProjectflock.NewProjectflockService(projectflockRepo, flockRepo, kandangRepo, projectflockKandangRepo, approvalService, validate)
|
projectflockService := sProjectflock.NewProjectflockService(projectflockRepo, flockRepo, kandangRepo, projectflockKandangRepo, warehouseRepo, productWarehouseRepo, approvalService, validate)
|
||||||
userService := sUser.NewUserService(userRepo, validate)
|
userService := sUser.NewUserService(userRepo, validate)
|
||||||
|
|
||||||
ProjectflockRoutes(router, userService, projectflockService)
|
ProjectflockRoutes(router, userService, projectflockService)
|
||||||
|
|||||||
@@ -4,14 +4,15 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
commonRepo "gitlab.com/mbugroup/lti-api.git/internal/common/repository"
|
commonRepo "gitlab.com/mbugroup/lti-api.git/internal/common/repository"
|
||||||
commonSvc "gitlab.com/mbugroup/lti-api.git/internal/common/service"
|
commonSvc "gitlab.com/mbugroup/lti-api.git/internal/common/service"
|
||||||
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
||||||
|
productWarehouseRepository "gitlab.com/mbugroup/lti-api.git/internal/modules/inventory/product-warehouses/repositories"
|
||||||
flockRepository "gitlab.com/mbugroup/lti-api.git/internal/modules/master/flocks/repositories"
|
flockRepository "gitlab.com/mbugroup/lti-api.git/internal/modules/master/flocks/repositories"
|
||||||
kandangRepository "gitlab.com/mbugroup/lti-api.git/internal/modules/master/kandangs/repositories"
|
kandangRepository "gitlab.com/mbugroup/lti-api.git/internal/modules/master/kandangs/repositories"
|
||||||
|
warehouseRepository "gitlab.com/mbugroup/lti-api.git/internal/modules/master/warehouses/repositories"
|
||||||
repository "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/repositories"
|
repository "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/repositories"
|
||||||
validation "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/validations"
|
validation "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/validations"
|
||||||
utils "gitlab.com/mbugroup/lti-api.git/internal/utils"
|
utils "gitlab.com/mbugroup/lti-api.git/internal/utils"
|
||||||
@@ -29,20 +30,23 @@ type ProjectflockService interface {
|
|||||||
CreateOne(ctx *fiber.Ctx, req *validation.Create) (*entity.ProjectFlock, error)
|
CreateOne(ctx *fiber.Ctx, req *validation.Create) (*entity.ProjectFlock, error)
|
||||||
UpdateOne(ctx *fiber.Ctx, req *validation.Update, id uint) (*entity.ProjectFlock, error)
|
UpdateOne(ctx *fiber.Ctx, req *validation.Update, id uint) (*entity.ProjectFlock, error)
|
||||||
DeleteOne(ctx *fiber.Ctx, id uint) error
|
DeleteOne(ctx *fiber.Ctx, id uint) error
|
||||||
GetProjectFlockKandangByParams(ctx *fiber.Ctx, idStr string, projectFlockIdStr string, kandangIdStr string) (*entity.ProjectFlockKandang, error)
|
GetProjectFlockKandangByProjectAndKandang(ctx *fiber.Ctx, projectFlockID uint, kandangID uint) (*entity.ProjectFlockKandang, int, error)
|
||||||
|
GetAvailableDocQuantity(ctx *fiber.Ctx, kandangID uint) (float64, error)
|
||||||
GetFlockPeriodSummary(ctx *fiber.Ctx, flockID uint) (*FlockPeriodSummary, error)
|
GetFlockPeriodSummary(ctx *fiber.Ctx, flockID uint) (*FlockPeriodSummary, error)
|
||||||
Approval(ctx *fiber.Ctx, req *validation.Approve) ([]entity.ProjectFlock, error)
|
Approval(ctx *fiber.Ctx, req *validation.Approve) ([]entity.ProjectFlock, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type projectflockService struct {
|
type projectflockService struct {
|
||||||
Log *logrus.Logger
|
Log *logrus.Logger
|
||||||
Validate *validator.Validate
|
Validate *validator.Validate
|
||||||
Repository repository.ProjectflockRepository
|
Repository repository.ProjectflockRepository
|
||||||
FlockRepo flockRepository.FlockRepository
|
FlockRepo flockRepository.FlockRepository
|
||||||
KandangRepo kandangRepository.KandangRepository
|
KandangRepo kandangRepository.KandangRepository
|
||||||
PivotRepo repository.ProjectFlockKandangRepository
|
WarehouseRepo warehouseRepository.WarehouseRepository
|
||||||
ApprovalSvc commonSvc.ApprovalService
|
ProductWarehouseRepo productWarehouseRepository.ProductWarehouseRepository
|
||||||
approvalWorkflow approvalutils.ApprovalWorkflowKey
|
ProjectFlockKandangRepo repository.ProjectFlockKandangRepository
|
||||||
|
ApprovalSvc commonSvc.ApprovalService
|
||||||
|
approvalWorkflow approvalutils.ApprovalWorkflowKey
|
||||||
}
|
}
|
||||||
|
|
||||||
type FlockPeriodSummary struct {
|
type FlockPeriodSummary struct {
|
||||||
@@ -54,19 +58,23 @@ func NewProjectflockService(
|
|||||||
repo repository.ProjectflockRepository,
|
repo repository.ProjectflockRepository,
|
||||||
flockRepo flockRepository.FlockRepository,
|
flockRepo flockRepository.FlockRepository,
|
||||||
kandangRepo kandangRepository.KandangRepository,
|
kandangRepo kandangRepository.KandangRepository,
|
||||||
pivotRepo repository.ProjectFlockKandangRepository,
|
ProjectFlockKandangRepo repository.ProjectFlockKandangRepository,
|
||||||
|
warehouseRepo warehouseRepository.WarehouseRepository,
|
||||||
|
productWarehouseRepo productWarehouseRepository.ProductWarehouseRepository,
|
||||||
approvalSvc commonSvc.ApprovalService,
|
approvalSvc commonSvc.ApprovalService,
|
||||||
validate *validator.Validate,
|
validate *validator.Validate,
|
||||||
) ProjectflockService {
|
) ProjectflockService {
|
||||||
return &projectflockService{
|
return &projectflockService{
|
||||||
Log: utils.Log,
|
Log: utils.Log,
|
||||||
Validate: validate,
|
Validate: validate,
|
||||||
Repository: repo,
|
Repository: repo,
|
||||||
FlockRepo: flockRepo,
|
FlockRepo: flockRepo,
|
||||||
KandangRepo: kandangRepo,
|
KandangRepo: kandangRepo,
|
||||||
PivotRepo: pivotRepo,
|
WarehouseRepo: warehouseRepo,
|
||||||
ApprovalSvc: approvalSvc,
|
ProductWarehouseRepo: productWarehouseRepo,
|
||||||
approvalWorkflow: utils.ApprovalWorkflowProjectFlock,
|
ProjectFlockKandangRepo: ProjectFlockKandangRepo,
|
||||||
|
ApprovalSvc: approvalSvc,
|
||||||
|
approvalWorkflow: utils.ApprovalWorkflowProjectFlock,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -641,55 +649,48 @@ func (s projectflockService) DeleteOne(c *fiber.Ctx, id uint) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s projectflockService) GetProjectFlockKandang(ctx *fiber.Ctx, id uint) (*entity.ProjectFlockKandang, error) {
|
func (s projectflockService) GetProjectFlockKandangByProjectAndKandang(ctx *fiber.Ctx, projectFlockID uint, kandangID uint) (*entity.ProjectFlockKandang, int, error) {
|
||||||
// keep for backward compatibility; delegate to new consolidated method
|
|
||||||
return s.GetProjectFlockKandangByParams(ctx, fmt.Sprintf("%d", id), "", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s projectflockService) GetProjectFlockKandangByProjectAndKandang(ctx *fiber.Ctx, projectFlockID uint, kandangID uint) (*entity.ProjectFlockKandang, error) {
|
availableStock, err := s.GetAvailableDocQuantity(ctx, kandangID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
pfk, err := s.PivotRepo.GetByProjectFlockAndKandang(ctx.Context(), projectFlockID, kandangID)
|
projectFlockKandang, err := s.ProjectFlockKandangRepo.GetByProjectFlockAndKandang(ctx.Context(), projectFlockID, kandangID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
return nil, fiber.NewError(fiber.StatusNotFound, "ProjectFlockKandang not found")
|
return nil, 0, fiber.NewError(fiber.StatusNotFound, "ProjectFlockKandang not found")
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, 0, err
|
||||||
}
|
}
|
||||||
return pfk, nil
|
|
||||||
|
return projectFlockKandang, int(availableStock), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s projectflockService) GetProjectFlockKandangByParams(ctx *fiber.Ctx, idStr string, projectFlockIdStr string, kandangIdStr string) (*entity.ProjectFlockKandang, error) {
|
func (s projectflockService) GetAvailableDocQuantity(ctx *fiber.Ctx, kandangID uint) (float64, error) {
|
||||||
idStr = strings.TrimSpace(idStr)
|
|
||||||
projectFlockIdStr = strings.TrimSpace(projectFlockIdStr)
|
|
||||||
kandangIdStr = strings.TrimSpace(kandangIdStr)
|
|
||||||
|
|
||||||
if idStr != "" {
|
wh, err := s.WarehouseRepo.GetByKandangID(ctx.Context(), kandangID)
|
||||||
id, err := strconv.Atoi(idStr)
|
if err != nil {
|
||||||
if err != nil || id <= 0 {
|
return 0, err
|
||||||
return nil, fiber.NewError(fiber.StatusBadRequest, "Invalid Id")
|
|
||||||
}
|
|
||||||
pfk, err := s.PivotRepo.GetByID(ctx.Context(), uint(id))
|
|
||||||
if err != nil {
|
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
||||||
return nil, fiber.NewError(fiber.StatusNotFound, "ProjectFlockKandang not found")
|
|
||||||
}
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return pfk, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if projectFlockIdStr == "" || kandangIdStr == "" {
|
var productWarehouses []entity.ProductWarehouse
|
||||||
return nil, fiber.NewError(fiber.StatusBadRequest, "Missing lookup parameters")
|
err = s.ProductWarehouseRepo.DB().
|
||||||
|
WithContext(ctx.Context()).
|
||||||
|
Joins("JOIN products ON products.id = product_warehouses.product_id").
|
||||||
|
Joins("JOIN product_categories ON product_categories.id = products.product_category_id").
|
||||||
|
Where("product_categories.code = ? AND product_warehouses.warehouse_id = ?", "DOC", wh.Id).
|
||||||
|
Order("created_at DESC").
|
||||||
|
Find(&productWarehouses).Error
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
}
|
}
|
||||||
pfid, err := strconv.Atoi(projectFlockIdStr)
|
|
||||||
if err != nil || pfid <= 0 {
|
total := 0.0
|
||||||
return nil, fiber.NewError(fiber.StatusBadRequest, "Invalid project_flock_id")
|
for _, pw := range productWarehouses {
|
||||||
|
total += pw.Quantity
|
||||||
}
|
}
|
||||||
kid, err := strconv.Atoi(kandangIdStr)
|
return total, nil
|
||||||
if err != nil || kid <= 0 {
|
|
||||||
return nil, fiber.NewError(fiber.StatusBadRequest, "Invalid kandang_id")
|
|
||||||
}
|
|
||||||
return s.GetProjectFlockKandangByProjectAndKandang(ctx, uint(pfid), uint(kid))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s projectflockService) GetFlockPeriodSummary(c *fiber.Ctx, flockID uint) (*FlockPeriodSummary, error) {
|
func (s projectflockService) GetFlockPeriodSummary(c *fiber.Ctx, flockID uint) (*FlockPeriodSummary, error) {
|
||||||
@@ -784,7 +785,7 @@ func (s projectflockService) attachKandangs(ctx context.Context, dbTransaction *
|
|||||||
return fiber.NewError(fiber.StatusInternalServerError, "Failed to update kandangs")
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to update kandangs")
|
||||||
}
|
}
|
||||||
|
|
||||||
pivotRepo := s.pivotRepoWithTx(dbTransaction)
|
ProjectFlockKandangRepo := s.ProjectFlockKandangRepoWithTx(dbTransaction)
|
||||||
records := make([]*entity.ProjectFlockKandang, len(kandangIDs))
|
records := make([]*entity.ProjectFlockKandang, len(kandangIDs))
|
||||||
for i, id := range kandangIDs {
|
for i, id := range kandangIDs {
|
||||||
records[i] = &entity.ProjectFlockKandang{
|
records[i] = &entity.ProjectFlockKandang{
|
||||||
@@ -792,7 +793,7 @@ func (s projectflockService) attachKandangs(ctx context.Context, dbTransaction *
|
|||||||
KandangId: id,
|
KandangId: id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := pivotRepo.CreateMany(ctx, records); err != nil {
|
if err := ProjectFlockKandangRepo.CreateMany(ctx, records); err != nil {
|
||||||
return fiber.NewError(fiber.StatusInternalServerError, "Failed to persist project flock history")
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to persist project flock history")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@@ -814,15 +815,15 @@ func (s projectflockService) detachKandangs(ctx context.Context, dbTransaction *
|
|||||||
return fiber.NewError(fiber.StatusInternalServerError, "Failed to update kandangs")
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to update kandangs")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := s.pivotRepoWithTx(dbTransaction).DeleteMany(ctx, projectFlockID, kandangIDs); err != nil {
|
if err := s.ProjectFlockKandangRepoWithTx(dbTransaction).DeleteMany(ctx, projectFlockID, kandangIDs); err != nil {
|
||||||
return fiber.NewError(fiber.StatusInternalServerError, "Failed to persist project flock history")
|
return fiber.NewError(fiber.StatusInternalServerError, "Failed to persist project flock history")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s projectflockService) pivotRepoWithTx(dbTransaction *gorm.DB) repository.ProjectFlockKandangRepository {
|
func (s projectflockService) ProjectFlockKandangRepoWithTx(dbTransaction *gorm.DB) repository.ProjectFlockKandangRepository {
|
||||||
if s.PivotRepo == nil {
|
if s.ProjectFlockKandangRepo == nil {
|
||||||
return repository.NewProjectFlockKandangRepository(dbTransaction)
|
return repository.NewProjectFlockKandangRepository(dbTransaction)
|
||||||
}
|
}
|
||||||
return s.PivotRepo.WithTx(dbTransaction)
|
return s.ProjectFlockKandangRepo.WithTx(dbTransaction)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user