feat[BE-127] add source and target project flock to transfer laying API

This commit is contained in:
aguhh18
2025-11-11 14:32:55 +07:00
parent 6b5d27ae8e
commit 762dfa9fb9
4 changed files with 94 additions and 18 deletions
@@ -2,6 +2,7 @@ package service
import (
"errors"
"time"
commonSvc "gitlab.com/mbugroup/lti-api.git/internal/common/service"
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
@@ -106,18 +107,68 @@ func (s *salesOrdersService) CreateOne(c *fiber.Ctx, req *validation.Create) (*e
}
}
createBody := &entity.Marketing{
CustomerId: req.CustomerId,
// parse date
soDate, err := utils.ParseDateString(req.Date)
if err != nil {
return nil, fiber.NewError(fiber.StatusBadRequest, "Invalid date format")
}
err := s.MarketingRepo.DB().WithContext(c.Context()).Transaction(func(dbTransaction *gorm.DB) error {
marketingRepoTx := repository.NewMarketingRepository(dbTransaction)
// generate SO number
soNumber := "SO-" + time.Now().Format("20060102150405")
if err := marketingRepoTx.CreateOne(c.Context(), createBody, nil); err != nil {
var marketing *entity.Marketing
err = s.Repository.DB().WithContext(c.Context()).Transaction(func(dbTransaction *gorm.DB) error {
// create marketing directly (tanpa create SalesOrders)
marketingRepoTx := repository.NewMarketingRepository(dbTransaction)
marketing = &entity.Marketing{
CustomerId: req.CustomerId,
SoNumber: soNumber,
SoDate: soDate,
SalesPersonId: 1,
Notes: req.Notes,
CreatedBy: 1,
}
if err := marketingRepoTx.CreateOne(c.Context(), marketing, nil); err != nil {
s.Log.Errorf("Failed to create marketing: %+v", err)
return err
}
// Create MarketingProducts and MarketingDeliveryProducts
if len(req.MarketingProducts) > 0 {
for _, product := range req.MarketingProducts {
marketingProduct := &entity.MarketingProduct{
MarketingId: marketing.Id,
ProductWarehouseId: product.ProductWarehouseId,
Qty: product.Qty,
UnitPrice: product.UnitPrice,
AvgWeight: product.AvgWeight,
TotalWeight: product.TotalWeight,
TotalPrice: product.TotalPrice,
}
if err := dbTransaction.Create(marketingProduct).Error; err != nil {
s.Log.Errorf("Failed to create marketing product: %+v", err)
return err
}
// create delivery product with zeroed numeric fields and nil delivery date
marketingDeliveryProduct := &entity.MarketingDeliveryProduct{
MarketingProductId: marketingProduct.Id,
Qty: 0,
UnitPrice: 0,
TotalWeight: 0,
AvgWeight: 0,
TotalPrice: 0,
DeliveryDate: nil,
VehicleNumber: product.VehicleNumber,
}
if err := dbTransaction.Create(marketingDeliveryProduct).Error; err != nil {
s.Log.Errorf("Failed to create marketing delivery product: %+v", err)
return err
}
}
}
return nil
})
if err != nil {
@@ -127,7 +178,16 @@ func (s *salesOrdersService) CreateOne(c *fiber.Ctx, req *validation.Create) (*e
return nil, fiber.NewError(fiber.StatusInternalServerError, "Failed to create salesOrders")
}
return s.GetOne(c, createBody.Id)
createdMarketing, err := s.MarketingRepo.GetByID(c.Context(), marketing.Id, nil)
if err != nil {
s.Log.Errorf("Failed to fetch created marketing: %+v", err)
return nil, fiber.NewError(fiber.StatusInternalServerError, "Failed to fetch created marketing")
}
return &entity.SalesOrders{
Id: createdMarketing.Id,
Name: createdMarketing.SoNumber,
}, nil
}
func (s salesOrdersService) UpdateOne(c *fiber.Ctx, req *validation.Update, id uint) (*entity.SalesOrders, error) {