apskel-pos-backend/internal/repository/expense_repository.go
2026-05-25 16:19:36 +07:00

102 lines
2.8 KiB
Go

package repository
import (
"context"
"strings"
"github.com/google/uuid"
"apskel-pos-be/internal/entities"
"gorm.io/gorm"
)
type ExpenseRepositoryImpl struct {
db *gorm.DB
}
func NewExpenseRepositoryImpl(db *gorm.DB) *ExpenseRepositoryImpl {
return &ExpenseRepositoryImpl{
db: db,
}
}
func (r *ExpenseRepositoryImpl) Create(ctx context.Context, expense *entities.Expense) error {
return r.db.WithContext(ctx).Create(expense).Error
}
func (r *ExpenseRepositoryImpl) GetByID(ctx context.Context, id uuid.UUID) (*entities.Expense, error) {
var expense entities.Expense
err := r.db.WithContext(ctx).
Preload("Items.ChartOfAccount").
First(&expense, "id = ?", id).Error
if err != nil {
return nil, err
}
return &expense, nil
}
func (r *ExpenseRepositoryImpl) GetByIDAndOrganizationID(ctx context.Context, id, organizationID uuid.UUID) (*entities.Expense, error) {
var expense entities.Expense
err := r.db.WithContext(ctx).
Preload("Items.ChartOfAccount").
Where("id = ? AND organization_id = ?", id, organizationID).
First(&expense).Error
if err != nil {
return nil, err
}
return &expense, nil
}
func (r *ExpenseRepositoryImpl) Update(ctx context.Context, expense *entities.Expense) error {
return r.db.WithContext(ctx).Save(expense).Error
}
func (r *ExpenseRepositoryImpl) Delete(ctx context.Context, id uuid.UUID) error {
return r.db.WithContext(ctx).Delete(&entities.Expense{}, "id = ?", id).Error
}
func (r *ExpenseRepositoryImpl) List(ctx context.Context, organizationID uuid.UUID, filters map[string]interface{}, limit, offset int) ([]*entities.Expense, int64, error) {
var expenses []*entities.Expense
var total int64
query := r.db.WithContext(ctx).Model(&entities.Expense{}).Where("organization_id = ?", organizationID)
for key, value := range filters {
switch key {
case "search":
if searchStr, ok := value.(string); ok && searchStr != "" {
searchPattern := "%" + strings.ToLower(searchStr) + "%"
query = query.Where("LOWER(receiver) LIKE ? OR LOWER(code_number) LIKE ? OR LOWER(description) LIKE ?",
searchPattern, searchPattern, searchPattern)
}
case "outlet_id":
if outletID, ok := value.(uuid.UUID); ok {
query = query.Where("outlet_id = ?", outletID)
}
default:
query = query.Where(key+" = ?", value)
}
}
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
err := query.
Preload("Items.ChartOfAccount").
Order("created_at DESC").
Limit(limit).
Offset(offset).
Find(&expenses).Error
return expenses, total, err
}
func (r *ExpenseRepositoryImpl) CreateItem(ctx context.Context, item *entities.ExpenseItem) error {
return r.db.WithContext(ctx).Create(item).Error
}
func (r *ExpenseRepositoryImpl) DeleteItemsByExpenseID(ctx context.Context, expenseID uuid.UUID) error {
return r.db.WithContext(ctx).Delete(&entities.ExpenseItem{}, "expense_id = ?", expenseID).Error
}