apskel-pos-backend/internal/service/order_ingredient_transaction_service.go
2025-09-12 15:37:19 +07:00

206 lines
8.2 KiB
Go

package service
import (
"apskel-pos-be/internal/appcontext"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/mappers"
"apskel-pos-be/internal/models"
"apskel-pos-be/internal/processor"
"apskel-pos-be/internal/repository"
"context"
"fmt"
"github.com/google/uuid"
)
type OrderIngredientTransactionService struct {
processor processor.OrderIngredientTransactionProcessor
txManager *repository.TxManager
}
func NewOrderIngredientTransactionService(processor processor.OrderIngredientTransactionProcessor, txManager *repository.TxManager) *OrderIngredientTransactionService {
return &OrderIngredientTransactionService{
processor: processor,
txManager: txManager,
}
}
func (s *OrderIngredientTransactionService) CreateOrderIngredientTransaction(ctx context.Context, req *contract.CreateOrderIngredientTransactionRequest) (*contract.OrderIngredientTransactionResponse, error) {
// Get organization and outlet from context
appCtx := appcontext.FromGinContext(ctx)
organizationID := appCtx.OrganizationID
outletID := appCtx.OutletID
createdBy := appCtx.UserID
// Convert contract to model
modelReq := mappers.ContractToModelCreateOrderIngredientTransactionRequest(req)
// Create transaction
response, err := s.processor.CreateOrderIngredientTransaction(ctx, modelReq, organizationID, outletID, createdBy)
if err != nil {
return nil, fmt.Errorf("failed to create order ingredient transaction: %w", err)
}
// Convert model to contract
contractResp := mappers.ModelToContractOrderIngredientTransactionResponse(response)
return contractResp, nil
}
func (s *OrderIngredientTransactionService) GetOrderIngredientTransactionByID(ctx context.Context, id uuid.UUID) (*contract.OrderIngredientTransactionResponse, error) {
// Get organization from context
appCtx := appcontext.FromGinContext(ctx)
organizationID := appCtx.OrganizationID
// Get transaction
response, err := s.processor.GetOrderIngredientTransactionByID(ctx, id, organizationID)
if err != nil {
return nil, fmt.Errorf("failed to get order ingredient transaction: %w", err)
}
// Convert model to contract
contractResp := mappers.ModelToContractOrderIngredientTransactionResponse(response)
return contractResp, nil
}
func (s *OrderIngredientTransactionService) UpdateOrderIngredientTransaction(ctx context.Context, id uuid.UUID, req *contract.UpdateOrderIngredientTransactionRequest) (*contract.OrderIngredientTransactionResponse, error) {
// Get organization from context
appCtx := appcontext.FromGinContext(ctx)
organizationID := appCtx.OrganizationID
// Convert contract to model
modelReq := mappers.ContractToModelUpdateOrderIngredientTransactionRequest(req)
// Update transaction
response, err := s.processor.UpdateOrderIngredientTransaction(ctx, id, modelReq, organizationID)
if err != nil {
return nil, fmt.Errorf("failed to update order ingredient transaction: %w", err)
}
// Convert model to contract
contractResp := mappers.ModelToContractOrderIngredientTransactionResponse(response)
return contractResp, nil
}
func (s *OrderIngredientTransactionService) DeleteOrderIngredientTransaction(ctx context.Context, id uuid.UUID) error {
// Get organization from context
appCtx := appcontext.FromGinContext(ctx)
organizationID := appCtx.OrganizationID
// Delete transaction
if err := s.processor.DeleteOrderIngredientTransaction(ctx, id, organizationID); err != nil {
return fmt.Errorf("failed to delete order ingredient transaction: %w", err)
}
return nil
}
func (s *OrderIngredientTransactionService) ListOrderIngredientTransactions(ctx context.Context, req *contract.ListOrderIngredientTransactionsRequest) ([]*contract.OrderIngredientTransactionResponse, int64, error) {
// Get organization from context
appCtx := appcontext.FromGinContext(ctx)
organizationID := appCtx.OrganizationID
// Convert contract to model
modelReq := mappers.ContractToModelListOrderIngredientTransactionsRequest(req)
// List transactions
responses, total, err := s.processor.ListOrderIngredientTransactions(ctx, modelReq, organizationID)
if err != nil {
return nil, 0, fmt.Errorf("failed to list order ingredient transactions: %w", err)
}
// Convert models to contracts
contractResponses := mappers.ModelToContractOrderIngredientTransactionResponses(responses)
return contractResponses, total, nil
}
func (s *OrderIngredientTransactionService) GetOrderIngredientTransactionsByOrder(ctx context.Context, orderID uuid.UUID) ([]*contract.OrderIngredientTransactionResponse, error) {
// Get organization from context
appCtx := appcontext.FromGinContext(ctx)
organizationID := appCtx.OrganizationID
// Get transactions by order
responses, err := s.processor.GetOrderIngredientTransactionsByOrder(ctx, orderID, organizationID)
if err != nil {
return nil, fmt.Errorf("failed to get order ingredient transactions by order: %w", err)
}
// Convert models to contracts
contractResponses := mappers.ModelToContractOrderIngredientTransactionResponses(responses)
return contractResponses, nil
}
func (s *OrderIngredientTransactionService) GetOrderIngredientTransactionsByOrderItem(ctx context.Context, orderItemID uuid.UUID) ([]*contract.OrderIngredientTransactionResponse, error) {
// Get organization from context
appCtx := appcontext.FromGinContext(ctx)
organizationID := appCtx.OrganizationID
// Get transactions by order item
responses, err := s.processor.GetOrderIngredientTransactionsByOrderItem(ctx, orderItemID, organizationID)
if err != nil {
return nil, fmt.Errorf("failed to get order ingredient transactions by order item: %w", err)
}
// Convert models to contracts
contractResponses := mappers.ModelToContractOrderIngredientTransactionResponses(responses)
return contractResponses, nil
}
func (s *OrderIngredientTransactionService) GetOrderIngredientTransactionsByIngredient(ctx context.Context, ingredientID uuid.UUID) ([]*contract.OrderIngredientTransactionResponse, error) {
// Get organization from context
appCtx := appcontext.FromGinContext(ctx)
organizationID := appCtx.OrganizationID
// Get transactions by ingredient
responses, err := s.processor.GetOrderIngredientTransactionsByIngredient(ctx, ingredientID, organizationID)
if err != nil {
return nil, fmt.Errorf("failed to get order ingredient transactions by ingredient: %w", err)
}
// Convert models to contracts
contractResponses := mappers.ModelToContractOrderIngredientTransactionResponses(responses)
return contractResponses, nil
}
func (s *OrderIngredientTransactionService) GetOrderIngredientTransactionSummary(ctx context.Context, req *contract.ListOrderIngredientTransactionsRequest) ([]*contract.OrderIngredientTransactionSummary, error) {
// Get organization from context
appCtx := appcontext.FromGinContext(ctx)
organizationID := appCtx.OrganizationID
// Convert contract to model
modelReq := mappers.ContractToModelListOrderIngredientTransactionsRequest(req)
// Get summary
summaries, err := s.processor.GetOrderIngredientTransactionSummary(ctx, modelReq, organizationID)
if err != nil {
return nil, fmt.Errorf("failed to get order ingredient transaction summary: %w", err)
}
// Convert models to contracts
contractSummaries := mappers.ModelToContractOrderIngredientTransactionSummaries(summaries)
return contractSummaries, nil
}
func (s *OrderIngredientTransactionService) BulkCreateOrderIngredientTransactions(ctx context.Context, transactions []*contract.CreateOrderIngredientTransactionRequest) ([]*contract.OrderIngredientTransactionResponse, error) {
// Get organization and outlet from context
appCtx := appcontext.FromGinContext(ctx)
organizationID := appCtx.OrganizationID
outletID := appCtx.OutletID
createdBy := appCtx.UserID
// Convert contracts to models
modelReqs := make([]*models.CreateOrderIngredientTransactionRequest, len(transactions))
for i, req := range transactions {
modelReqs[i] = mappers.ContractToModelCreateOrderIngredientTransactionRequest(req)
}
// Bulk create transactions
responses, err := s.processor.BulkCreateOrderIngredientTransactions(ctx, modelReqs, organizationID, outletID, createdBy)
if err != nil {
return nil, fmt.Errorf("failed to bulk create order ingredient transactions: %w", err)
}
// Convert models to contracts
contractResponses := mappers.ModelToContractOrderIngredientTransactionResponses(responses)
return contractResponses, nil
}