206 lines
8.2 KiB
Go
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
|
||
|
|
}
|