""" Options: Date: 2026-07-03 06:38:10 Version: 6.10 Tip: To override a DTO option, remove "#" prefix before updating BaseUrl: https://stubbur-app.azurewebsites.net #GlobalNamespace: #AddServiceStackTypes: True #AddResponseStatus: False #AddImplicitVersion: #AddDescriptionAsComments: True IncludeTypes: SalesOverviewRequest.* #ExcludeTypes: #DefaultImports: datetime,decimal,marshmallow.fields:*,servicestack:*,typing:*,dataclasses:dataclass/field,dataclasses_json:dataclass_json/LetterCase/Undefined/config,enum:Enum/IntEnum #DataClass: #DataClassJson: """ import datetime import decimal from marshmallow.fields import * from servicestack import * from typing import * from dataclasses import dataclass, field from dataclasses_json import dataclass_json, LetterCase, Undefined, config from enum import Enum, IntEnum @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SalesKpis: gross_net: Decimal = decimal.Decimal(0) refunded: Decimal = decimal.Decimal(0) tickets_all_real: int = 0 tickets_paid: int = 0 orders: int = 0 aov: Decimal = decimal.Decimal(0) @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class KpiDelta: abs: Decimal = decimal.Decimal(0) pct: Optional[float] = None dir: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SalesDeltas: gross_net: Optional[KpiDelta] = None refunded: Optional[KpiDelta] = None tickets_all_real: Optional[KpiDelta] = None tickets_paid: Optional[KpiDelta] = None orders: Optional[KpiDelta] = None aov: Optional[KpiDelta] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SalesTrendBucket: bucket: datetime.datetime = datetime.datetime(1, 1, 1) revenue: Decimal = decimal.Decimal(0) tickets: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SalesTopEvent: event_id: int = 0 event_name: Optional[str] = None event_date: Optional[datetime.datetime] = None gross_net: Decimal = decimal.Decimal(0) paid_tickets: int = 0 real_tickets: int = 0 orders: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SalesRecentOrder: ticket_id: int = 0 created_at: datetime.datetime = datetime.datetime(1, 1, 1) event_name: Optional[str] = None amount: Decimal = decimal.Decimal(0) ticket_count: int = 0 buyer_name: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SalesHourBucket: hour: int = 0 revenue: Decimal = decimal.Decimal(0) orders: int = 0 tickets: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SalesDowBucket: dow: int = 0 revenue: Decimal = decimal.Decimal(0) orders: int = 0 tickets: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SalesProduct: ticket_name: Optional[str] = None tickets: int = 0 revenue: Decimal = decimal.Decimal(0) orders: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SalesOverviewResult: current: Optional[SalesKpis] = None previous: Optional[SalesKpis] = None delta: Optional[SalesDeltas] = None trend: Optional[List[SalesTrendBucket]] = None previous_trend: Optional[List[SalesTrendBucket]] = None top_events: Optional[List[SalesTopEvent]] = None recent_orders: Optional[List[SalesRecentOrder]] = None by_hour_of_day: Optional[List[SalesHourBucket]] = None by_day_of_week: Optional[List[SalesDowBucket]] = None top_products: Optional[List[SalesProduct]] = None has_any_data_ever: bool = False owners: Optional[List[int]] = None bucket: Optional[str] = None freshness_utc: datetime.datetime = datetime.datetime(1, 1, 1) status_code: int = 0 message: Optional[str] = None # @Route("/sales/overview", "POST") @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SalesOverviewRequest(IReturn[SalesOverviewResult]): event_owner_id: int = 0 additional_owner_ids: Optional[List[int]] = None event_id: Optional[int] = None from_utc: datetime.datetime = datetime.datetime(1, 1, 1) to_utc: datetime.datetime = datetime.datetime(1, 1, 1) compare_from_utc: Optional[datetime.datetime] = None compare_to_utc: Optional[datetime.datetime] = None bucket: Optional[str] = None top_events_limit: int = 0 recent_orders_limit: int = 0