173 lines
4.5 KiB
Go
173 lines
4.5 KiB
Go
|
|
package repository
|
||
|
|
|
||
|
|
import (
|
||
|
|
"apskel-pos-be/internal/entities"
|
||
|
|
"context"
|
||
|
|
"fmt"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/google/uuid"
|
||
|
|
"gorm.io/gorm"
|
||
|
|
)
|
||
|
|
|
||
|
|
type TableRepository struct {
|
||
|
|
db *gorm.DB
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewTableRepository(db *gorm.DB) *TableRepository {
|
||
|
|
return &TableRepository{db: db}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) Create(ctx context.Context, table *entities.Table) error {
|
||
|
|
return r.db.WithContext(ctx).Create(table).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) GetByID(ctx context.Context, id uuid.UUID) (*entities.Table, error) {
|
||
|
|
var table entities.Table
|
||
|
|
err := r.db.WithContext(ctx).
|
||
|
|
Preload("Organization").
|
||
|
|
Preload("Outlet").
|
||
|
|
Preload("Order").
|
||
|
|
Where("id = ?", id).
|
||
|
|
First(&table).Error
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
return &table, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) GetByOutletID(ctx context.Context, outletID uuid.UUID) ([]entities.Table, error) {
|
||
|
|
var tables []entities.Table
|
||
|
|
err := r.db.WithContext(ctx).
|
||
|
|
Preload("Organization").
|
||
|
|
Preload("Outlet").
|
||
|
|
Preload("Order").
|
||
|
|
Where("outlet_id = ?", outletID).
|
||
|
|
Order("table_name").
|
||
|
|
Find(&tables).Error
|
||
|
|
return tables, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) GetByOrganizationID(ctx context.Context, organizationID uuid.UUID) ([]entities.Table, error) {
|
||
|
|
var tables []entities.Table
|
||
|
|
err := r.db.WithContext(ctx).
|
||
|
|
Preload("Organization").
|
||
|
|
Preload("Outlet").
|
||
|
|
Preload("Order").
|
||
|
|
Where("organization_id = ?", organizationID).
|
||
|
|
Order("table_name").
|
||
|
|
Find(&tables).Error
|
||
|
|
return tables, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) Update(ctx context.Context, table *entities.Table) error {
|
||
|
|
return r.db.WithContext(ctx).Save(table).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) Delete(ctx context.Context, id uuid.UUID) error {
|
||
|
|
return r.db.WithContext(ctx).Delete(&entities.Table{}, id).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) List(ctx context.Context, organizationID, outletID *uuid.UUID, status *string, isActive *bool, search string, page, limit int) ([]entities.Table, int64, error) {
|
||
|
|
var tables []entities.Table
|
||
|
|
var total int64
|
||
|
|
|
||
|
|
query := r.db.WithContext(ctx).
|
||
|
|
Preload("Organization").
|
||
|
|
Preload("Outlet").
|
||
|
|
Preload("Order")
|
||
|
|
|
||
|
|
if organizationID != nil {
|
||
|
|
query = query.Where("organization_id = ?", *organizationID)
|
||
|
|
}
|
||
|
|
|
||
|
|
if outletID != nil {
|
||
|
|
query = query.Where("outlet_id = ?", *outletID)
|
||
|
|
}
|
||
|
|
|
||
|
|
if status != nil {
|
||
|
|
query = query.Where("status = ?", *status)
|
||
|
|
}
|
||
|
|
|
||
|
|
if isActive != nil {
|
||
|
|
query = query.Where("is_active = ?", *isActive)
|
||
|
|
}
|
||
|
|
|
||
|
|
if search != "" {
|
||
|
|
searchTerm := fmt.Sprintf("%%%s%%", search)
|
||
|
|
query = query.Where("table_name ILIKE ?", searchTerm)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Count total
|
||
|
|
err := query.Model(&entities.Table{}).Count(&total).Error
|
||
|
|
if err != nil {
|
||
|
|
return nil, 0, err
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get paginated results
|
||
|
|
offset := (page - 1) * limit
|
||
|
|
err = query.Offset(offset).Limit(limit).Order("table_name").Find(&tables).Error
|
||
|
|
|
||
|
|
return tables, total, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) GetAvailableTables(ctx context.Context, outletID uuid.UUID) ([]entities.Table, error) {
|
||
|
|
var tables []entities.Table
|
||
|
|
err := r.db.WithContext(ctx).
|
||
|
|
Preload("Organization").
|
||
|
|
Preload("Outlet").
|
||
|
|
Where("outlet_id = ? AND status = ? AND is_active = ?", outletID, "available", true).
|
||
|
|
Order("table_name").
|
||
|
|
Find(&tables).Error
|
||
|
|
return tables, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) GetOccupiedTables(ctx context.Context, outletID uuid.UUID) ([]entities.Table, error) {
|
||
|
|
var tables []entities.Table
|
||
|
|
err := r.db.WithContext(ctx).
|
||
|
|
Preload("Organization").
|
||
|
|
Preload("Outlet").
|
||
|
|
Preload("Order").
|
||
|
|
Where("outlet_id = ? AND status = ? AND is_active = ?", outletID, "occupied", true).
|
||
|
|
Order("table_name").
|
||
|
|
Find(&tables).Error
|
||
|
|
return tables, err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) OccupyTable(ctx context.Context, tableID, orderID uuid.UUID, startTime *time.Time) error {
|
||
|
|
return r.db.WithContext(ctx).
|
||
|
|
Model(&entities.Table{}).
|
||
|
|
Where("id = ?", tableID).
|
||
|
|
Updates(map[string]interface{}{
|
||
|
|
"status": "occupied",
|
||
|
|
"order_id": orderID,
|
||
|
|
"start_time": startTime,
|
||
|
|
}).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) ReleaseTable(ctx context.Context, tableID uuid.UUID, paymentAmount float64) error {
|
||
|
|
return r.db.WithContext(ctx).
|
||
|
|
Model(&entities.Table{}).
|
||
|
|
Where("id = ?", tableID).
|
||
|
|
Updates(map[string]interface{}{
|
||
|
|
"status": "available",
|
||
|
|
"order_id": nil,
|
||
|
|
"start_time": nil,
|
||
|
|
"payment_amount": paymentAmount,
|
||
|
|
}).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *TableRepository) GetByOrderID(ctx context.Context, orderID uuid.UUID) (*entities.Table, error) {
|
||
|
|
var table entities.Table
|
||
|
|
err := r.db.WithContext(ctx).
|
||
|
|
Preload("Organization").
|
||
|
|
Preload("Outlet").
|
||
|
|
Preload("Order").
|
||
|
|
Where("order_id = ?", orderID).
|
||
|
|
First(&table).Error
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
return &table, nil
|
||
|
|
}
|