mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-24 23:35:43 +00:00
feat: refactor module adjusment stock, adjust constant, adjust table migration and create command reflow and delete module adjusment stock
This commit is contained in:
@@ -2,6 +2,7 @@ package repositories
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -14,11 +15,35 @@ import (
|
||||
type AdjustmentStockRepository interface {
|
||||
CreateOne(ctx context.Context, data *entity.AdjustmentStock, modifier func(*gorm.DB) *gorm.DB) error
|
||||
GetByID(ctx context.Context, id uint, modifier func(*gorm.DB) *gorm.DB) (*entity.AdjustmentStock, error)
|
||||
FindKandangIDByProjectFlockKandangID(ctx context.Context, projectFlockKandangID uint) (uint, error)
|
||||
FindRoutesByFunctionCode(ctx context.Context, productID uint, functionCode string) ([]AdjustmentRouteResolution, error)
|
||||
FindOverconsumeRule(ctx context.Context, lane, flagGroupCode, functionCode string) (*bool, error)
|
||||
FindHistory(ctx context.Context, filter AdjustmentHistoryFilter, modifier func(*gorm.DB) *gorm.DB) ([]*entity.AdjustmentStock, int64, error)
|
||||
WithTx(tx *gorm.DB) AdjustmentStockRepository
|
||||
DB() *gorm.DB
|
||||
GenerateSequentialNumber(ctx context.Context, prefix string) (string, error)
|
||||
}
|
||||
|
||||
type AdjustmentRouteResolution struct {
|
||||
FlagGroupCode string `gorm:"column:flag_group_code"`
|
||||
Lane string `gorm:"column:lane"`
|
||||
FunctionCode string `gorm:"column:function_code"`
|
||||
SourceTable string `gorm:"column:source_table"`
|
||||
LegacyTypeKey string `gorm:"column:legacy_type_key"`
|
||||
AllowPendingDefault bool `gorm:"column:allow_pending_default"`
|
||||
}
|
||||
|
||||
type AdjustmentHistoryFilter struct {
|
||||
ProductID uint
|
||||
WarehouseID uint
|
||||
TransactionType string
|
||||
FunctionCode string
|
||||
ScopeRestrict bool
|
||||
ScopeIDs []uint
|
||||
Offset int
|
||||
Limit int
|
||||
}
|
||||
|
||||
type adjustmentStockRepositoryImpl struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
@@ -48,6 +73,151 @@ func (r *adjustmentStockRepositoryImpl) GetByID(ctx context.Context, id uint, mo
|
||||
return &record, nil
|
||||
}
|
||||
|
||||
func (r *adjustmentStockRepositoryImpl) FindKandangIDByProjectFlockKandangID(ctx context.Context, projectFlockKandangID uint) (uint, error) {
|
||||
type pfkRow struct {
|
||||
KandangID uint `gorm:"column:kandang_id"`
|
||||
}
|
||||
|
||||
var pfk pfkRow
|
||||
err := r.db.WithContext(ctx).
|
||||
Table("project_flock_kandangs pfk").
|
||||
Select("pfk.kandang_id").
|
||||
Where("pfk.id = ?", projectFlockKandangID).
|
||||
Where("pfk.closed_at IS NULL").
|
||||
Take(&pfk).Error
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return pfk.KandangID, nil
|
||||
}
|
||||
|
||||
func (r *adjustmentStockRepositoryImpl) FindRoutesByFunctionCode(
|
||||
ctx context.Context,
|
||||
productID uint,
|
||||
functionCode string,
|
||||
) ([]AdjustmentRouteResolution, error) {
|
||||
var rows []AdjustmentRouteResolution
|
||||
err := r.db.WithContext(ctx).
|
||||
Table("fifo_stock_v2_route_rules rr").
|
||||
Select("rr.flag_group_code, rr.lane, rr.function_code, rr.source_table, rr.legacy_type_key, rr.allow_pending_default").
|
||||
Joins("JOIN fifo_stock_v2_flag_groups fg ON fg.code = rr.flag_group_code AND fg.is_active = TRUE").
|
||||
Where("rr.is_active = TRUE").
|
||||
Where("rr.function_code = ?", functionCode).
|
||||
Where(`
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM flags f
|
||||
JOIN fifo_stock_v2_flag_members fm ON fm.flag_name = f.name AND fm.is_active = TRUE
|
||||
WHERE f.flagable_type = ?
|
||||
AND f.flagable_id = ?
|
||||
AND fm.flag_group_code = rr.flag_group_code
|
||||
)
|
||||
`, entity.FlagableTypeProduct, productID).
|
||||
Order("CASE WHEN rr.source_table = 'adjustment_stocks' THEN 0 ELSE 1 END ASC").
|
||||
Order("rr.id ASC").
|
||||
Find(&rows).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rows, nil
|
||||
}
|
||||
|
||||
func (r *adjustmentStockRepositoryImpl) FindOverconsumeRule(
|
||||
ctx context.Context,
|
||||
lane string,
|
||||
flagGroupCode string,
|
||||
functionCode string,
|
||||
) (*bool, error) {
|
||||
type selectedRow struct {
|
||||
AllowOverconsume bool `gorm:"column:allow_overconsume"`
|
||||
}
|
||||
|
||||
var selected selectedRow
|
||||
err := r.db.WithContext(ctx).
|
||||
Table("fifo_stock_v2_overconsume_rules").
|
||||
Select("allow_overconsume").
|
||||
Where("is_active = TRUE").
|
||||
Where("lane = ?", lane).
|
||||
Where("(flag_group_code IS NULL OR flag_group_code = ?)", flagGroupCode).
|
||||
Where("(function_code IS NULL OR function_code = ?)", functionCode).
|
||||
Order("CASE WHEN flag_group_code IS NULL THEN 1 ELSE 0 END ASC").
|
||||
Order("CASE WHEN function_code IS NULL THEN 1 ELSE 0 END ASC").
|
||||
Order("priority ASC, id ASC").
|
||||
Limit(1).
|
||||
Take(&selected).Error
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &selected.AllowOverconsume, nil
|
||||
}
|
||||
|
||||
func (r *adjustmentStockRepositoryImpl) FindHistory(
|
||||
ctx context.Context,
|
||||
filter AdjustmentHistoryFilter,
|
||||
modifier func(*gorm.DB) *gorm.DB,
|
||||
) ([]*entity.AdjustmentStock, int64, error) {
|
||||
q := r.db.WithContext(ctx).Model(&entity.AdjustmentStock{}).
|
||||
Preload("ProductWarehouse").
|
||||
Preload("ProductWarehouse.Product").
|
||||
Preload("ProductWarehouse.Warehouse").
|
||||
Preload("ProductWarehouse.Warehouse.Location").
|
||||
Preload("ProductWarehouse.ProjectFlockKandang").
|
||||
Preload("ProductWarehouse.ProjectFlockKandang.ProjectFlock").
|
||||
Preload("StockLog.CreatedUser")
|
||||
|
||||
if modifier != nil {
|
||||
q = modifier(q)
|
||||
}
|
||||
|
||||
if filter.ScopeRestrict {
|
||||
q = q.Joins("JOIN product_warehouses pw_scope ON pw_scope.id = adjustment_stocks.product_warehouse_id").
|
||||
Joins("JOIN warehouses w_scope ON w_scope.id = pw_scope.warehouse_id")
|
||||
if len(filter.ScopeIDs) == 0 {
|
||||
q = q.Where("1 = 0")
|
||||
} else {
|
||||
q = q.Where("w_scope.location_id IN ?", filter.ScopeIDs)
|
||||
}
|
||||
}
|
||||
|
||||
if filter.ProductID > 0 || filter.WarehouseID > 0 {
|
||||
q = q.Joins("JOIN product_warehouses pw_filter ON pw_filter.id = adjustment_stocks.product_warehouse_id")
|
||||
if filter.ProductID > 0 {
|
||||
q = q.Where("pw_filter.product_id = ?", filter.ProductID)
|
||||
}
|
||||
if filter.WarehouseID > 0 {
|
||||
q = q.Where("pw_filter.warehouse_id = ?", filter.WarehouseID)
|
||||
}
|
||||
}
|
||||
|
||||
if strings.TrimSpace(filter.TransactionType) != "" {
|
||||
q = q.Where("UPPER(adjustment_stocks.transaction_type) = ?", strings.ToUpper(strings.TrimSpace(filter.TransactionType)))
|
||||
}
|
||||
|
||||
if strings.TrimSpace(filter.FunctionCode) != "" {
|
||||
q = q.Where("adjustment_stocks.function_code = ?", strings.ToUpper(strings.TrimSpace(filter.FunctionCode)))
|
||||
}
|
||||
|
||||
var total int64
|
||||
if err := q.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
var rows []entity.AdjustmentStock
|
||||
if err := q.Offset(filter.Offset).Limit(filter.Limit).Order("created_at DESC").Find(&rows).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
result := make([]*entity.AdjustmentStock, len(rows))
|
||||
for i := range rows {
|
||||
result[i] = &rows[i]
|
||||
}
|
||||
return result, total, nil
|
||||
}
|
||||
|
||||
func (r *adjustmentStockRepositoryImpl) WithTx(tx *gorm.DB) AdjustmentStockRepository {
|
||||
return &adjustmentStockRepositoryImpl{db: tx}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user