""" Options: Date: 2025-12-14 05:13:29 Version: 8.80 Tip: To override a DTO option, remove "#" prefix before updating BaseUrl: https://api.bokamera.se #GlobalNamespace: #AddServiceStackTypes: True #AddResponseStatus: False #AddImplicitVersion: #AddDescriptionAsComments: True IncludeTypes: CreateVossUsage.* #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 class CreditKindEnum(str, Enum): NORMAL = 'Normal' INTERNAL = 'Internal' class ProductTypeEnum(str, Enum): MAIN = 'Main' ADDON = 'Addon' LICENSE = 'License' USAGE = 'Usage' class SubscriptionBehaviourEnum(str, Enum): PRORATE = 'Prorate' FULL = 'Full' NONE = 'None' @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SubscriptionItemTerminationReasonDto: reason_id: Optional[str] = None reason_name: Optional[str] = None reason_external_id: Optional[str] = None sub_reason_id: Optional[str] = None sub_reason_name: Optional[str] = None sub_reason_external_id: Optional[str] = None comment: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CustomerBalanceChangeItemDto: product_type: Optional[ProductTypeEnum] = None id: Optional[str] = None name: Optional[str] = None product_group_id: Optional[str] = None product_group_name: Optional[str] = None quantity: float = 0.0 amount: float = 0.0 discount_amount: float = 0.0 total_amount: float = 0.0 invoice_recipient_customer_id: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CustomerBalanceChangeDto: items: List[CustomerBalanceChangeItemDto] = field(default_factory=list) total_amount: float = 0.0 total_discount_amount: float = 0.0 class ProductGroupTypeEnum(str, Enum): OPTIONAL = 'Optional' INCLUDED = 'Included' class StatusEnum(str, Enum): ACTIVE = 'Active' TERMINATED = 'Terminated' @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SubscriptionProductGroupProductResultDto: id: Optional[str] = None name: Optional[str] = None external_id: Optional[str] = None article_number: Optional[str] = None class TypeEnum(str, Enum): AT_SUBSCRIPTION_BILLING_PERIOD_END = 'AtSubscriptionBillingPeriodEnd' AT_BINDING_PERIOD_END = 'AtBindingPeriodEnd' IMMEDIATELY = 'Immediately' class SourceEnum(str, Enum): DIRECT = 'Direct' PLAN = 'Plan' CUSTOMER_EXPIRATION = 'CustomerExpiration' UPDATE = 'Update' UNPAID = 'Unpaid' @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CreditOptionsDto: subscription_behaviour: Optional[SubscriptionBehaviourEnum] = None credit_kind: Optional[CreditKindEnum] = None prorate_time_anchor: Optional[datetime.datetime] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class SubscriptionItemTerminationDto: type: Optional[TypeEnum] = None source: Optional[SourceEnum] = None scheduled_date: datetime.datetime = datetime.datetime(1, 1, 1) reason: Optional[SubscriptionItemTerminationReasonDto] = None credit_options: Optional[CreditOptionsDto] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CreateSubscriptionProductGroupResult: product_group_type: Optional[ProductGroupTypeEnum] = None status: Optional[StatusEnum] = None id: Optional[str] = None name: Optional[str] = None products: List[SubscriptionProductGroupProductResultDto] = field(default_factory=list) termination: Optional[SubscriptionItemTerminationDto] = None created: datetime.datetime = datetime.datetime(1, 1, 1) customer_balance_change: Optional[CustomerBalanceChangeDto] = None # @Route("/voss/usage", "POST") # @ApiResponse(Description="You were unauthorized to call this service", StatusCode=401) # @ValidateRequest(Validator="IsAuthenticated") @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CreateVossUsage(IReturn[CreateSubscriptionProductGroupResult]): # @ApiMember(Description="The company id", IsRequired=true) company_id: Optional[str] = None """ The company id """ # @ApiMember(Description="Article number. Can be fetched from products", IsRequired=true) article_number: Optional[str] = None """ Article number. Can be fetched from products """ # @ApiMember(Description="Example: developer worked 6 hours", IsRequired=true) quantity: int = 0 """ Example: developer worked 6 hours """