apskel-pos-backend/internal/processor/omset_tracker_processor.go
2025-09-17 19:30:17 +07:00

164 lines
4.7 KiB
Go

package processor
import (
"apskel-pos-be/internal/entities"
"apskel-pos-be/internal/mappers"
"apskel-pos-be/internal/models"
"apskel-pos-be/internal/repository"
"context"
"fmt"
"time"
"github.com/google/uuid"
)
type OmsetTrackerProcessor struct {
omsetTrackerRepo *repository.OmsetTrackerRepository
}
func NewOmsetTrackerProcessor(omsetTrackerRepo *repository.OmsetTrackerRepository) *OmsetTrackerProcessor {
return &OmsetTrackerProcessor{
omsetTrackerRepo: omsetTrackerRepo,
}
}
// CreateOmsetTracker creates a new omset tracker record
func (p *OmsetTrackerProcessor) CreateOmsetTracker(ctx context.Context, req *models.CreateOmsetTrackerRequest) (*models.OmsetTrackerResponse, error) {
// Convert request to entity
omsetTracker := mappers.ToOmsetTrackerEntity(req)
// Create omset tracker
err := p.omsetTrackerRepo.Create(ctx, omsetTracker)
if err != nil {
return nil, fmt.Errorf("failed to create omset tracker: %w", err)
}
return mappers.ToOmsetTrackerResponse(omsetTracker), nil
}
// GetOmsetTracker retrieves an omset tracker by ID
func (p *OmsetTrackerProcessor) GetOmsetTracker(ctx context.Context, id uuid.UUID) (*models.OmsetTrackerResponse, error) {
omsetTracker, err := p.omsetTrackerRepo.GetByID(ctx, id)
if err != nil {
return nil, fmt.Errorf("omset tracker not found: %w", err)
}
return mappers.ToOmsetTrackerResponse(omsetTracker), nil
}
// ListOmsetTrackers retrieves omset trackers with pagination and filtering
func (p *OmsetTrackerProcessor) ListOmsetTrackers(ctx context.Context, query *models.ListOmsetTrackerQuery) (*models.PaginatedResponse[models.OmsetTrackerResponse], error) {
// Set default values
if query.Page <= 0 {
query.Page = 1
}
if query.Limit <= 0 {
query.Limit = 10
}
if query.Limit > 100 {
query.Limit = 100
}
offset := (query.Page - 1) * query.Limit
// Get omset trackers from repository
omsetTrackers, total, err := p.omsetTrackerRepo.List(
ctx,
offset,
query.Limit,
query.Search,
query.PeriodType,
query.GameID,
query.From,
query.To,
query.SortBy,
query.SortOrder,
)
if err != nil {
return nil, fmt.Errorf("failed to list omset trackers: %w", err)
}
// Convert to responses
responses := mappers.ToOmsetTrackerResponses(omsetTrackers)
// Calculate pagination info
totalPages := int((total + int64(query.Limit) - 1) / int64(query.Limit))
return &models.PaginatedResponse[models.OmsetTrackerResponse]{
Data: responses,
Pagination: models.Pagination{
Page: query.Page,
Limit: query.Limit,
Total: total,
TotalPages: totalPages,
},
}, nil
}
// UpdateOmsetTracker updates an existing omset tracker
func (p *OmsetTrackerProcessor) UpdateOmsetTracker(ctx context.Context, id uuid.UUID, req *models.UpdateOmsetTrackerRequest) (*models.OmsetTrackerResponse, error) {
// Get existing omset tracker
omsetTracker, err := p.omsetTrackerRepo.GetByID(ctx, id)
if err != nil {
return nil, fmt.Errorf("omset tracker not found: %w", err)
}
// Update omset tracker fields
mappers.UpdateOmsetTrackerEntity(omsetTracker, req)
// Save updated omset tracker
err = p.omsetTrackerRepo.Update(ctx, omsetTracker)
if err != nil {
return nil, fmt.Errorf("failed to update omset tracker: %w", err)
}
return mappers.ToOmsetTrackerResponse(omsetTracker), nil
}
// DeleteOmsetTracker deletes an omset tracker
func (p *OmsetTrackerProcessor) DeleteOmsetTracker(ctx context.Context, id uuid.UUID) error {
// Get existing omset tracker
_, err := p.omsetTrackerRepo.GetByID(ctx, id)
if err != nil {
return fmt.Errorf("omset tracker not found: %w", err)
}
// Delete omset tracker
err = p.omsetTrackerRepo.Delete(ctx, id)
if err != nil {
return fmt.Errorf("failed to delete omset tracker: %w", err)
}
return nil
}
// AddOmset adds omset to a specific period
func (p *OmsetTrackerProcessor) AddOmset(ctx context.Context, periodType string, periodStart, periodEnd time.Time, amount int64, gameID *uuid.UUID) (*models.OmsetTrackerResponse, error) {
if amount <= 0 {
return nil, fmt.Errorf("amount must be greater than 0")
}
// Convert string to PeriodType
periodTypeEnum := entities.PeriodType(periodType)
// Get or create period tracker
omsetTracker, err := p.omsetTrackerRepo.GetOrCreatePeriod(ctx, periodTypeEnum, periodStart, periodEnd, gameID)
if err != nil {
return nil, fmt.Errorf("failed to get or create period tracker: %w", err)
}
// Add omset
err = p.omsetTrackerRepo.AddOmset(ctx, periodTypeEnum, periodStart, periodEnd, amount, gameID)
if err != nil {
return nil, fmt.Errorf("failed to add omset: %w", err)
}
// Get updated tracker
updatedTracker, err := p.omsetTrackerRepo.GetByID(ctx, omsetTracker.ID)
if err != nil {
return nil, fmt.Errorf("failed to get updated tracker: %w", err)
}
return mappers.ToOmsetTrackerResponse(updatedTracker), nil
}