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 }