diff --git a/internal/modules/production/chickins/controllers/chickin.controller.go b/internal/modules/production/chickins/controllers/chickin.controller.go index f4425206..c5cd79bd 100644 --- a/internal/modules/production/chickins/controllers/chickin.controller.go +++ b/internal/modules/production/chickins/controllers/chickin.controller.go @@ -172,6 +172,23 @@ func (u *ChickinController) DeleteOne(c *fiber.Ctx) error { }) } +func (u *ChickinController) UpdateChickInDate(c *fiber.Ctx) error { + req := new(validation.UpdateChickInDate) + if err := c.BodyParser(req); err != nil { + return fiber.NewError(fiber.StatusBadRequest, "Invalid request body") + } + + if err := u.ChickinService.UpdateChickInDate(c, req); err != nil { + return err + } + + return c.Status(fiber.StatusOK).JSON(response.Common{ + Code: fiber.StatusOK, + Status: "success", + Message: "Chick in date berhasil diperbarui", + }) +} + func (u *ChickinController) Approval(c *fiber.Ctx) error { req := new(validation.Approve) diff --git a/internal/modules/production/chickins/repositories/project_chickin.repository.go b/internal/modules/production/chickins/repositories/project_chickin.repository.go index 7f56a261..9d4daf22 100644 --- a/internal/modules/production/chickins/repositories/project_chickin.repository.go +++ b/internal/modules/production/chickins/repositories/project_chickin.repository.go @@ -2,6 +2,7 @@ package repository import ( "context" + "time" "gitlab.com/mbugroup/lti-api.git/internal/common/repository" entity "gitlab.com/mbugroup/lti-api.git/internal/entities" @@ -18,6 +19,7 @@ type ProjectChickinRepository interface { GetTotalChickinQtyByProjectFlockID(ctx context.Context, projectFlockID uint) (float64, error) GetByProjectFlockKandangIDForUpdate(ctx context.Context, projectFlockKandangID uint) ([]entity.ProjectChickin, error) UpdateUsageFields(ctx context.Context, tx *gorm.DB, chickinID uint, usageQty, pendingUsageQty float64) error + UpdateChickInDateByProjectFlockKandangID(ctx context.Context, tx *gorm.DB, pfkID uint, newDate time.Time) error } type ChickinRepositoryImpl struct { @@ -134,3 +136,10 @@ func (r *ChickinRepositoryImpl) UpdateUsageFields(ctx context.Context, tx *gorm. "pending_usage_qty": pendingUsageQty, }).Error } + +func (r *ChickinRepositoryImpl) UpdateChickInDateByProjectFlockKandangID(ctx context.Context, tx *gorm.DB, pfkID uint, newDate time.Time) error { + return tx.WithContext(ctx). + Model(&entity.ProjectChickin{}). + Where("project_flock_kandang_id = ? AND deleted_at IS NULL", pfkID). + Update("chick_in_date", newDate).Error +} diff --git a/internal/modules/production/chickins/route.go b/internal/modules/production/chickins/route.go index 4243a602..dbb6d5ce 100644 --- a/internal/modules/production/chickins/route.go +++ b/internal/modules/production/chickins/route.go @@ -17,8 +17,9 @@ func ChickinRoutes(v1 fiber.Router, u user.UserService, s chickin.ChickinService route.Get("/", m.RequirePermissions(m.P_ChickinsGetAll), ctrl.GetAll) route.Post("/", m.RequirePermissions(m.P_ChickinsCreateOne), ctrl.CreateOne) - route.Get("/:id",m.RequirePermissions(m.P_ChickinsGetOne), ctrl.GetOne) + route.Patch("/chick-in-date", m.RequirePermissions(m.P_ChickinsCreateOne), ctrl.UpdateChickInDate) + route.Get("/:id", m.RequirePermissions(m.P_ChickinsGetOne), ctrl.GetOne) // route.Patch("/:id", ctrl.UpdateOne) route.Delete("/:id", ctrl.DeleteOne) - route.Post("/approvals",m.RequirePermissions(m.P_ChickinsApproval), ctrl.Approval) + route.Post("/approvals", m.RequirePermissions(m.P_ChickinsApproval), ctrl.Approval) } diff --git a/internal/modules/production/chickins/services/chickin.service.go b/internal/modules/production/chickins/services/chickin.service.go index 09c617f8..d8c9f18f 100644 --- a/internal/modules/production/chickins/services/chickin.service.go +++ b/internal/modules/production/chickins/services/chickin.service.go @@ -48,6 +48,7 @@ type ChickinService interface { DeleteOne(ctx *fiber.Ctx, id uint) error Approval(ctx *fiber.Ctx, req *validation.Approve) ([]entity.ProjectChickin, error) EnsureChickInExists(ctx context.Context, projectFlockKandangID uint) error + UpdateChickInDate(ctx *fiber.Ctx, req *validation.UpdateChickInDate) error } type chickinService struct { @@ -2110,3 +2111,33 @@ func (s chickinService) EnsureChickInExists(ctx context.Context, projectFlockKan return fiber.NewError(fiber.StatusBadRequest, "Chick in project flock belum disetujui sehingga belum dapat membuat recording") } + +func (s chickinService) UpdateChickInDate(ctx *fiber.Ctx, req *validation.UpdateChickInDate) error { + if err := s.Validate.Struct(req); err != nil { + return err + } + + newDate, err := time.Parse("2006-01-02", req.ChickInDate) + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, "Format tanggal tidak valid, gunakan YYYY-MM-DD") + } + + _, err = s.ProjectflockKandangRepo.GetByID(ctx.Context(), req.ProjectFlockKandangId) + if err != nil { + return fiber.NewError(fiber.StatusNotFound, "Project flock kandang tidak ditemukan") + } + + return s.Repository.DB().WithContext(ctx.Context()).Transaction(func(tx *gorm.DB) error { + if err := s.Repository.UpdateChickInDateByProjectFlockKandangID(ctx.Context(), tx, req.ProjectFlockKandangId, newDate); err != nil { + return err + } + + return tx.Exec(` + UPDATE recordings + SET day = GREATEST(0, (record_datetime::date - ?::date)::int), + updated_at = NOW() + WHERE project_flock_kandangs_id = ? + AND deleted_at IS NULL + `, req.ChickInDate, req.ProjectFlockKandangId).Error + }) +} diff --git a/internal/modules/production/chickins/validations/chickin.validation.go b/internal/modules/production/chickins/validations/chickin.validation.go index ebc6487f..0b8e1d71 100644 --- a/internal/modules/production/chickins/validations/chickin.validation.go +++ b/internal/modules/production/chickins/validations/chickin.validation.go @@ -27,3 +27,8 @@ type Approve struct { ApprovableIds []uint `json:"approvable_ids" validate:"required_strict,min=1,dive,gt=0"` Notes *string `json:"notes,omitempty" validate:"omitempty,max=500"` } + +type UpdateChickInDate struct { + ProjectFlockKandangId uint `json:"project_flock_kandang_id" validate:"required,gt=0"` + ChickInDate string `json:"chick_in_date" validate:"required,datetime=2006-01-02"` +}