Files
zarinpal-analytics-backend/internal/growth/types.go

177 lines
6.2 KiB
Go

package growth
import "time"
const (
AnalyticsVersion = "1.4.0"
DefaultModelConfigVersion = "avalai-responses-v1-ranked-events-tools4-turns2-output1600"
MinBaselineObservations = 4
MinBaselineSessions = 100
MaterialChangeBPS = 2_000
MinSimilarityBPS = 6_000
)
type Confidence string
const (
ConfidenceHigh Confidence = "HIGH"
ConfidenceMedium Confidence = "MEDIUM"
ConfidenceLow Confidence = "LOW"
ConfidenceInsufficientData Confidence = "INSUFFICIENT_DATA"
)
type SuppressionReason string
const (
SuppressionInsufficientObservations SuppressionReason = "INSUFFICIENT_BASELINE_OBSERVATIONS"
SuppressionInsufficientBaselineSessions SuppressionReason = "INSUFFICIENT_BASELINE_SESSIONS"
SuppressionInsufficientHistory SuppressionReason = "INSUFFICIENT_HISTORY"
SuppressionIncompleteEventWindow SuppressionReason = "INCOMPLETE_EVENT_WINDOW"
SuppressionInsufficientCohort SuppressionReason = "INSUFFICIENT_COHORT"
SuppressionTerminalScope SuppressionReason = "TERMINAL_SCOPE_UNSUPPORTED"
)
type DailyPoint struct {
Date time.Time `json:"date"`
SessionCount int64 `json:"sessionCount"`
PaidSessionCount int64 `json:"paidSessionCount"`
PaidAmountRial int64 `json:"paidAmountRial"`
EventIDs []string `json:"eventIds,omitempty"`
}
type EventKind string
const (
EventOfficial EventKind = "OFFICIAL"
EventCommercial EventKind = "COMMERCIAL"
)
type Event struct {
ID string `json:"id"`
OccasionKey string `json:"occasionKey"`
EventVariant string `json:"eventVariant"`
TitleFA string `json:"titleFa"`
StartDate time.Time `json:"startDate"`
EndDate time.Time `json:"endDate"`
Family string `json:"family"`
Tags []string `json:"tags"`
Source string `json:"source"`
SourceVersion string `json:"sourceVersion"`
Categories []string `json:"categories"`
Kind EventKind `json:"kind"`
OfficialHoliday bool `json:"officialHoliday"`
Universal bool `json:"universal"`
Tone string `json:"tone,omitempty"`
CommercialPosture string `json:"commercialPosture,omitempty"`
LeadDays int `json:"leadDays,omitempty"`
RelevanceBPS int64 `json:"relevanceBps,omitempty"`
ConfidenceBPS int64 `json:"confidenceBps,omitempty"`
ImportanceBPS int64 `json:"importanceBps,omitempty"`
}
type RankInput struct {
MerchantTerms []string
WithinPreparationWindow bool
HistoricalUpliftBPS int64
HistoricalEligible bool
}
type EventRank struct {
ScoreBPS int64
Factors []string
Promotable bool
}
type EventEffect struct {
EvidenceID string `json:"evidenceId"`
EventID string `json:"eventId"`
Eligible bool `json:"eligible"`
SuppressionReason SuppressionReason `json:"suppressionReason,omitempty"`
ObservationCount int `json:"observationCount"`
BaselineSessionCount int64 `json:"baselineSessionCount"`
BaselinePaidSessions int64 `json:"baselinePaidSessions"`
BaselineAmountRial int64 `json:"baselineAmountRial"`
ActualSessionCount int64 `json:"actualSessionCount"`
ActualPaidSessions int64 `json:"actualPaidSessions"`
ActualAmountRial int64 `json:"actualAmountRial"`
SessionUpliftBPS int64 `json:"sessionUpliftBps"`
PaidSessionUpliftBPS int64 `json:"paidSessionUpliftBps"`
AmountUpliftBPS int64 `json:"amountUpliftBps"`
MaterialWin bool `json:"materialWin"`
MaterialDecline bool `json:"materialDecline"`
}
type EventMatch struct {
Event Event `json:"event"`
ScoreBPS int64 `json:"scoreBps"`
MatchBasis string `json:"matchBasis"`
}
type Range struct {
P10 int64 `json:"p10"`
P50 int64 `json:"p50"`
P90 int64 `json:"p90"`
}
type ForecastPoint struct {
Date time.Time `json:"date"`
BaselineSessions int64 `json:"baselineSessions"`
BaselineAmountRial int64 `json:"baselineAmountRial"`
PaidSessions Range `json:"paidSessions"`
PaidAmountRial Range `json:"paidAmountRial"`
EventIDs []string `json:"eventIds,omitempty"`
}
type BacktestResult struct {
Origins int `json:"origins"`
SessionMAPEBPS int64 `json:"sessionMapeBps"`
AmountMAPEBPS int64 `json:"amountMapeBps"`
IntervalCoverageBPS int64 `json:"intervalCoverageBps"`
}
type Forecast struct {
StartDate time.Time `json:"startDate"`
HorizonDays int `json:"horizonDays"`
Confidence Confidence `json:"confidence"`
SuppressionReason SuppressionReason `json:"suppressionReason,omitempty"`
Points []ForecastPoint `json:"points"`
Backtest BacktestResult `json:"backtest"`
}
type Opportunity struct {
EvidenceID string `json:"evidenceId"`
EventID string `json:"eventId"`
EventTitleFA string `json:"eventTitleFa"`
Date time.Time `json:"date"`
SimilarityBPS int64 `json:"similarityBps"`
ExpectedSessions Range `json:"expectedSessions"`
ExpectedAmountRial Range `json:"expectedAmountRial"`
HistoricalEvidenceID string `json:"historicalEvidenceId"`
}
type Risk struct {
EvidenceID string `json:"evidenceId"`
Date time.Time `json:"date"`
EndDate time.Time `json:"endDate"`
SessionDeclineBPS int64 `json:"sessionDeclineBps"`
AmountDeclineBPS int64 `json:"amountDeclineBps"`
ExpectedSessions Range `json:"expectedSessions"`
ExpectedAmountRial Range `json:"expectedAmountRial"`
}
type EvidenceBundle struct {
Opportunities []Opportunity `json:"opportunities"`
Risks []Risk `json:"risks"`
}
type CampaignBrief struct {
HeadlineFA string `json:"headlineFa"`
GuidanceFA string `json:"guidanceFa"`
OfferFA string `json:"offerFa"`
MessageFA string `json:"messageFa"`
PreparationFA string `json:"preparationFa"`
LimitationFA string `json:"limitationFa"`
EvidenceIDs []string `json:"evidenceIds"`
}