186 lines
5.6 KiB
Go
186 lines
5.6 KiB
Go
|
|
package mappers
|
||
|
|
|
||
|
|
import (
|
||
|
|
"apskel-pos-be/internal/entities"
|
||
|
|
"apskel-pos-be/internal/models"
|
||
|
|
|
||
|
|
"github.com/google/uuid"
|
||
|
|
)
|
||
|
|
|
||
|
|
func MapOrderIngredientTransactionEntityToModel(entity *entities.OrderIngredientTransaction) *models.OrderIngredientTransaction {
|
||
|
|
if entity == nil {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
return &models.OrderIngredientTransaction{
|
||
|
|
ID: entity.ID,
|
||
|
|
OrganizationID: entity.OrganizationID,
|
||
|
|
OutletID: entity.OutletID,
|
||
|
|
OrderID: entity.OrderID,
|
||
|
|
OrderItemID: entity.OrderItemID,
|
||
|
|
ProductID: entity.ProductID,
|
||
|
|
ProductVariantID: entity.ProductVariantID,
|
||
|
|
IngredientID: entity.IngredientID,
|
||
|
|
GrossQty: entity.GrossQty,
|
||
|
|
NetQty: entity.NetQty,
|
||
|
|
WasteQty: entity.WasteQty,
|
||
|
|
Unit: entity.Unit,
|
||
|
|
TransactionDate: entity.TransactionDate,
|
||
|
|
CreatedBy: entity.CreatedBy,
|
||
|
|
CreatedAt: entity.CreatedAt,
|
||
|
|
UpdatedAt: entity.UpdatedAt,
|
||
|
|
Organization: nil,
|
||
|
|
Outlet: nil,
|
||
|
|
Order: nil,
|
||
|
|
OrderItem: nil,
|
||
|
|
Product: nil,
|
||
|
|
ProductVariant: nil,
|
||
|
|
Ingredient: nil,
|
||
|
|
CreatedByUser: nil,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func MapOrderIngredientTransactionModelToEntity(model *models.OrderIngredientTransaction) *entities.OrderIngredientTransaction {
|
||
|
|
if model == nil {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
return &entities.OrderIngredientTransaction{
|
||
|
|
ID: model.ID,
|
||
|
|
OrganizationID: model.OrganizationID,
|
||
|
|
OutletID: model.OutletID,
|
||
|
|
OrderID: model.OrderID,
|
||
|
|
OrderItemID: model.OrderItemID,
|
||
|
|
ProductID: model.ProductID,
|
||
|
|
ProductVariantID: model.ProductVariantID,
|
||
|
|
IngredientID: model.IngredientID,
|
||
|
|
GrossQty: model.GrossQty,
|
||
|
|
NetQty: model.NetQty,
|
||
|
|
WasteQty: model.WasteQty,
|
||
|
|
Unit: model.Unit,
|
||
|
|
TransactionDate: model.TransactionDate,
|
||
|
|
CreatedBy: model.CreatedBy,
|
||
|
|
CreatedAt: model.CreatedAt,
|
||
|
|
UpdatedAt: model.UpdatedAt,
|
||
|
|
Organization: entities.Organization{},
|
||
|
|
Outlet: nil,
|
||
|
|
Order: entities.Order{},
|
||
|
|
OrderItem: nil,
|
||
|
|
Product: entities.Product{},
|
||
|
|
ProductVariant: nil,
|
||
|
|
Ingredient: entities.Ingredient{},
|
||
|
|
CreatedByUser: entities.User{},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func MapOrderIngredientTransactionEntitiesToModels(entities []*entities.OrderIngredientTransaction) []*models.OrderIngredientTransaction {
|
||
|
|
if entities == nil {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
models := make([]*models.OrderIngredientTransaction, len(entities))
|
||
|
|
for i, entity := range entities {
|
||
|
|
models[i] = MapOrderIngredientTransactionEntityToModel(entity)
|
||
|
|
}
|
||
|
|
|
||
|
|
return models
|
||
|
|
}
|
||
|
|
|
||
|
|
func MapOrderIngredientTransactionModelsToEntities(models []*models.OrderIngredientTransaction) []*entities.OrderIngredientTransaction {
|
||
|
|
if models == nil {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
entities := make([]*entities.OrderIngredientTransaction, len(models))
|
||
|
|
for i, model := range models {
|
||
|
|
entities[i] = MapOrderIngredientTransactionModelToEntity(model)
|
||
|
|
}
|
||
|
|
|
||
|
|
return entities
|
||
|
|
}
|
||
|
|
|
||
|
|
func MapOrderIngredientTransactionEntityToResponse(entity *entities.OrderIngredientTransaction) *models.OrderIngredientTransactionResponse {
|
||
|
|
if entity == nil {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
return &models.OrderIngredientTransactionResponse{
|
||
|
|
ID: entity.ID,
|
||
|
|
OrganizationID: entity.OrganizationID,
|
||
|
|
OutletID: entity.OutletID,
|
||
|
|
OrderID: entity.OrderID,
|
||
|
|
OrderItemID: entity.OrderItemID,
|
||
|
|
ProductID: entity.ProductID,
|
||
|
|
ProductVariantID: entity.ProductVariantID,
|
||
|
|
IngredientID: entity.IngredientID,
|
||
|
|
GrossQty: entity.GrossQty,
|
||
|
|
NetQty: entity.NetQty,
|
||
|
|
WasteQty: entity.WasteQty,
|
||
|
|
Unit: entity.Unit,
|
||
|
|
TransactionDate: entity.TransactionDate,
|
||
|
|
CreatedBy: entity.CreatedBy,
|
||
|
|
CreatedAt: entity.CreatedAt,
|
||
|
|
UpdatedAt: entity.UpdatedAt,
|
||
|
|
Organization: nil,
|
||
|
|
Outlet: nil,
|
||
|
|
Order: nil,
|
||
|
|
OrderItem: nil,
|
||
|
|
Product: nil,
|
||
|
|
ProductVariant: nil,
|
||
|
|
Ingredient: nil,
|
||
|
|
CreatedByUser: nil,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func MapOrderIngredientTransactionEntitiesToResponses(entities []*entities.OrderIngredientTransaction) []*models.OrderIngredientTransactionResponse {
|
||
|
|
if entities == nil {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
responses := make([]*models.OrderIngredientTransactionResponse, len(entities))
|
||
|
|
for i, entity := range entities {
|
||
|
|
responses[i] = MapOrderIngredientTransactionEntityToResponse(entity)
|
||
|
|
}
|
||
|
|
|
||
|
|
return responses
|
||
|
|
}
|
||
|
|
|
||
|
|
func MapOrderIngredientTransactionSummary(transactions []*entities.OrderIngredientTransaction) []*models.OrderIngredientTransactionSummary {
|
||
|
|
if transactions == nil || len(transactions) == 0 {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// Group by ingredient ID
|
||
|
|
ingredientMap := make(map[uuid.UUID]*models.OrderIngredientTransactionSummary)
|
||
|
|
|
||
|
|
for _, transaction := range transactions {
|
||
|
|
ingredientID := transaction.IngredientID
|
||
|
|
|
||
|
|
if summary, exists := ingredientMap[ingredientID]; exists {
|
||
|
|
summary.TotalGrossQty += transaction.GrossQty
|
||
|
|
summary.TotalNetQty += transaction.NetQty
|
||
|
|
summary.TotalWasteQty += transaction.WasteQty
|
||
|
|
} else {
|
||
|
|
ingredientMap[ingredientID] = &models.OrderIngredientTransactionSummary{
|
||
|
|
IngredientID: ingredientID,
|
||
|
|
IngredientName: transaction.Ingredient.Name,
|
||
|
|
TotalGrossQty: transaction.GrossQty,
|
||
|
|
TotalNetQty: transaction.NetQty,
|
||
|
|
TotalWasteQty: transaction.WasteQty,
|
||
|
|
Unit: transaction.Unit,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Convert map to slice and calculate waste percentage
|
||
|
|
var summaries []*models.OrderIngredientTransactionSummary
|
||
|
|
for _, summary := range ingredientMap {
|
||
|
|
if summary.TotalGrossQty > 0 {
|
||
|
|
summary.WastePercentage = (summary.TotalWasteQty / summary.TotalGrossQty) * 100
|
||
|
|
}
|
||
|
|
summaries = append(summaries, summary)
|
||
|
|
}
|
||
|
|
|
||
|
|
return summaries
|
||
|
|
}
|