Add item_expense

This commit is contained in:
2026-05-25 16:19:36 +07:00
parent da87d659df
commit b8be29e110
12 changed files with 439 additions and 181 deletions
+61 -21
View File
@@ -31,11 +31,6 @@ func NewExpenseProcessorImpl(expenseRepo ExpenseRepository) *ExpenseProcessorImp
}
func (p *ExpenseProcessorImpl) CreateExpense(ctx context.Context, organizationID uuid.UUID, req *models.CreateExpenseRequest) (*models.ExpenseResponse, error) {
chartOfAccountID, err := uuid.Parse(req.ChartOfAccountID)
if err != nil {
return nil, fmt.Errorf("invalid chart_of_account_id: %w", err)
}
outletID, err := uuid.Parse(req.OutletID)
if err != nil {
return nil, fmt.Errorf("invalid outlet_id: %w", err)
@@ -47,15 +42,14 @@ func (p *ExpenseProcessorImpl) CreateExpense(ctx context.Context, organizationID
}
expenseEntity := &entities.Expense{
OrganizationID: organizationID,
OutletID: outletID,
Receiver: req.Receiver,
TransactionDate: transactionDate,
CodeNumber: req.CodeNumber,
ChartOfAccountID: chartOfAccountID,
Description: req.Description,
Tax: req.Tax,
Total: req.Total,
OrganizationID: organizationID,
OutletID: outletID,
Receiver: req.Receiver,
TransactionDate: transactionDate,
CodeNumber: req.CodeNumber,
Description: req.Description,
Tax: req.Tax,
Total: req.Total,
}
err = p.expenseRepo.Create(ctx, expenseEntity)
@@ -63,6 +57,25 @@ func (p *ExpenseProcessorImpl) CreateExpense(ctx context.Context, organizationID
return nil, fmt.Errorf("failed to create expense: %w", err)
}
for _, itemReq := range req.Items {
chartOfAccountID, err := uuid.Parse(itemReq.ChartOfAccountID)
if err != nil {
return nil, fmt.Errorf("invalid chart_of_account_id for item: %w", err)
}
itemEntity := &entities.ExpenseItem{
ExpenseID: expenseEntity.ID,
ChartOfAccountID: chartOfAccountID,
Description: itemReq.Description,
Amount: itemReq.Amount,
}
err = p.expenseRepo.CreateItem(ctx, itemEntity)
if err != nil {
return nil, fmt.Errorf("failed to create expense item: %w", err)
}
}
created, err := p.expenseRepo.GetByID(ctx, expenseEntity.ID)
if err != nil {
return mappers.ExpenseEntityToResponse(expenseEntity), nil
@@ -90,13 +103,6 @@ func (p *ExpenseProcessorImpl) UpdateExpense(ctx context.Context, id, organizati
if req.CodeNumber != nil {
expenseEntity.CodeNumber = *req.CodeNumber
}
if req.ChartOfAccountID != nil {
chartOfAccountID, err := uuid.Parse(*req.ChartOfAccountID)
if err != nil {
return nil, fmt.Errorf("invalid chart_of_account_id: %w", err)
}
expenseEntity.ChartOfAccountID = chartOfAccountID
}
if req.OutletID != nil {
outletID, err := uuid.Parse(*req.OutletID)
if err != nil {
@@ -117,6 +123,40 @@ func (p *ExpenseProcessorImpl) UpdateExpense(ctx context.Context, id, organizati
expenseEntity.Reserved1 = req.Reserved1
}
if req.Items != nil {
err = p.expenseRepo.DeleteItemsByExpenseID(ctx, expenseEntity.ID)
if err != nil {
return nil, fmt.Errorf("failed to delete existing items: %w", err)
}
for _, itemReq := range req.Items {
chartOfAccountID := uuid.Nil
if itemReq.ChartOfAccountID != nil {
chartOfAccountID, err = uuid.Parse(*itemReq.ChartOfAccountID)
if err != nil {
return nil, fmt.Errorf("invalid chart_of_account_id for item: %w", err)
}
}
amount := 0.0
if itemReq.Amount != nil {
amount = *itemReq.Amount
}
itemEntity := &entities.ExpenseItem{
ExpenseID: expenseEntity.ID,
ChartOfAccountID: chartOfAccountID,
Description: itemReq.Description,
Amount: amount,
}
err = p.expenseRepo.CreateItem(ctx, itemEntity)
if err != nil {
return nil, fmt.Errorf("failed to create expense item: %w", err)
}
}
}
err = p.expenseRepo.Update(ctx, expenseEntity)
if err != nil {
return nil, fmt.Errorf("failed to update expense: %w", err)
+2
View File
@@ -14,4 +14,6 @@ type ExpenseRepository interface {
Update(ctx context.Context, expense *entities.Expense) error
Delete(ctx context.Context, id uuid.UUID) error
List(ctx context.Context, organizationID uuid.UUID, filters map[string]interface{}, limit, offset int) ([]*entities.Expense, int64, error)
CreateItem(ctx context.Context, item *entities.ExpenseItem) error
DeleteItemsByExpenseID(ctx context.Context, expenseID uuid.UUID) error
}