164 lines
4.7 KiB
Go
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
|
|
}
|