Files
apskel-pos-backend/internal/repository/expense_repository.go
T

111 lines
3.2 KiB
Go
Raw Normal View History

2026-05-25 14:59:40 +07:00
package repository
import (
"context"
"strings"
2026-05-28 11:52:16 +07:00
"time"
2026-05-25 14:59:40 +07:00
"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
2026-05-25 16:19:36 +07:00
err := r.db.WithContext(ctx).
Preload("Items.ChartOfAccount").
First(&expense, "id = ?", id).Error
2026-05-25 14:59:40 +07:00
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
2026-05-25 16:19:36 +07:00
err := r.db.WithContext(ctx).
Preload("Items.ChartOfAccount").
Where("id = ? AND organization_id = ?", id, organizationID).
First(&expense).Error
2026-05-25 14:59:40 +07:00
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) + "%"
2026-05-26 15:25:47 +07:00
query = query.Where("LOWER(expense_name) LIKE ? OR LOWER(receiver) LIKE ? OR LOWER(code_number) LIKE ? OR LOWER(description) LIKE ?",
searchPattern, searchPattern, searchPattern, searchPattern)
2026-05-25 14:59:40 +07:00
}
case "outlet_id":
if outletID, ok := value.(uuid.UUID); ok {
query = query.Where("outlet_id = ?", outletID)
}
2026-05-28 11:52:16 +07:00
case "start_date":
if startDate, ok := value.(time.Time); ok {
query = query.Where("transaction_date >= ?", startDate)
}
case "end_date":
if endDate, ok := value.(time.Time); ok {
query = query.Where("transaction_date <= ?", endDate)
}
2026-05-25 14:59:40 +07:00
default:
query = query.Where(key+" = ?", value)
}
}
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
2026-05-25 16:19:36 +07:00
err := query.
Preload("Items.ChartOfAccount").
Order("created_at DESC").
Limit(limit).
Offset(offset).
Find(&expenses).Error
2026-05-25 14:59:40 +07:00
return expenses, total, err
}
2026-05-25 16:19:36 +07:00
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
}