mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
126 lines
3.6 KiB
Go
126 lines
3.6 KiB
Go
package service
|
|
|
|
import (
|
|
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
|
m "gitlab.com/mbugroup/lti-api.git/internal/middleware"
|
|
validation "gitlab.com/mbugroup/lti-api.git/internal/modules/inventory/stock-logs/validations"
|
|
stockLogRepo "gitlab.com/mbugroup/lti-api.git/internal/modules/shared/repositories"
|
|
"gitlab.com/mbugroup/lti-api.git/internal/utils"
|
|
|
|
"github.com/go-playground/validator/v10"
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/sirupsen/logrus"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type StockLogService interface {
|
|
GetAll(ctx *fiber.Ctx, params *validation.Query) ([]entity.StockLog, int64, error)
|
|
GetAllForExport(ctx *fiber.Ctx, productWarehouseID uint) ([]entity.StockLog, error)
|
|
}
|
|
|
|
type stockLogService struct {
|
|
Log *logrus.Logger
|
|
Validate *validator.Validate
|
|
StockLogRepo stockLogRepo.StockLogRepository
|
|
}
|
|
|
|
func NewStockLogService(
|
|
stockLogRepo stockLogRepo.StockLogRepository,
|
|
validate *validator.Validate,
|
|
) StockLogService {
|
|
return &stockLogService{
|
|
Log: utils.Log,
|
|
Validate: validate,
|
|
StockLogRepo: stockLogRepo,
|
|
}
|
|
}
|
|
|
|
func (s *stockLogService) GetAll(c *fiber.Ctx, params *validation.Query) ([]entity.StockLog, int64, error) {
|
|
if err := s.Validate.Struct(params); err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
locationScope, areaScope, err := m.ResolveLocationAreaScopes(c, s.StockLogRepo.DB())
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
offset := (params.Page - 1) * params.Limit
|
|
|
|
stockLogs, total, err := s.StockLogRepo.GetAll(c.Context(), offset, params.Limit, func(db *gorm.DB) *gorm.DB {
|
|
db = db.Where("product_warehouse_id = ?", params.ProductWarehouseID)
|
|
|
|
if locationScope.Restrict || areaScope.Restrict {
|
|
if (locationScope.Restrict && len(locationScope.IDs) == 0) || (areaScope.Restrict && len(areaScope.IDs) == 0) {
|
|
return db.Where("1 = 0")
|
|
}
|
|
db = db.
|
|
Joins("JOIN product_warehouses pw ON pw.id = stock_logs.product_warehouse_id").
|
|
Joins("JOIN warehouses w ON w.id = pw.warehouse_id")
|
|
if locationScope.Restrict {
|
|
db = db.Where("w.location_id IN ?", locationScope.IDs)
|
|
}
|
|
if areaScope.Restrict {
|
|
db = db.Where("w.area_id IN ?", areaScope.IDs)
|
|
}
|
|
}
|
|
|
|
db = db.
|
|
Preload("CreatedUser").
|
|
Order("stock_logs.created_at DESC")
|
|
|
|
return db
|
|
})
|
|
if err != nil {
|
|
s.Log.Errorf("Failed to get stock logs: %+v", err)
|
|
return nil, 0, err
|
|
}
|
|
|
|
if total == 0 {
|
|
return []entity.StockLog{}, 0, nil
|
|
}
|
|
|
|
return stockLogs, total, nil
|
|
}
|
|
|
|
func (s *stockLogService) GetAllForExport(c *fiber.Ctx, productWarehouseID uint) ([]entity.StockLog, error) {
|
|
locationScope, areaScope, err := m.ResolveLocationAreaScopes(c, s.StockLogRepo.DB())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
stockLogs, _, err := s.StockLogRepo.GetAll(c.Context(), 0, -1, func(db *gorm.DB) *gorm.DB {
|
|
db = db.Where("product_warehouse_id = ?", productWarehouseID)
|
|
|
|
if locationScope.Restrict || areaScope.Restrict {
|
|
if (locationScope.Restrict && len(locationScope.IDs) == 0) || (areaScope.Restrict && len(areaScope.IDs) == 0) {
|
|
return db.Where("1 = 0")
|
|
}
|
|
db = db.
|
|
Joins("JOIN product_warehouses pw ON pw.id = stock_logs.product_warehouse_id").
|
|
Joins("JOIN warehouses w ON w.id = pw.warehouse_id")
|
|
if locationScope.Restrict {
|
|
db = db.Where("w.location_id IN ?", locationScope.IDs)
|
|
}
|
|
if areaScope.Restrict {
|
|
db = db.Where("w.area_id IN ?", areaScope.IDs)
|
|
}
|
|
}
|
|
|
|
db = db.
|
|
Preload("CreatedUser").
|
|
Preload("ProductWarehouse").
|
|
Preload("ProductWarehouse.Warehouse").
|
|
Order("stock_logs.created_at ASC")
|
|
|
|
return db
|
|
})
|
|
if err != nil {
|
|
s.Log.Errorf("Failed to get stock logs for export: %+v", err)
|
|
return nil, err
|
|
}
|
|
|
|
return stockLogs, nil
|
|
}
|
|
|