digitaluapi

<back to all web services

GetStripeSession

The following routes are available for this service:
All Verbs/stripe-session/{Id}
<?php namespace dtos;

use DateTime;
use Exception;
use DateInterval;
use JsonSerializable;
use ServiceStack\{IReturn,IReturnVoid,IGet,IPost,IPut,IDelete,IPatch,IMeta,IHasSessionId,IHasBearerToken,IHasVersion};
use ServiceStack\{ICrud,ICreateDb,IUpdateDb,IPatchDb,IDeleteDb,ISaveDb,AuditBase,QueryDb,QueryDb2,QueryData,QueryData2,QueryResponse};
use ServiceStack\{ResponseStatus,ResponseError,EmptyResponse,IdResponse,ArrayList,KeyValuePair2,StringResponse,StringsResponse,Tuple2,Tuple3,ByteArray};
use ServiceStack\{JsonConverters,Returns,TypeContext};


class StripeEntity implements IStripeEntity, JsonSerializable
{
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template T
 */
class StripeEntity1 extends StripeEntity implements JsonSerializable
{
    public array $genericArgs = [];
    public static function create(array $genericArgs=[]): StripeEntity1 {
        $to = new StripeEntity1();
        $to->genericArgs = $genericArgs;
        return $to;
    }

    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionAfterExpirationRecovery
 */
class SessionAfterExpirationRecovery extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var bool|null */
        public ?bool $AllowPromotionCodes=null,
        /** @var bool|null */
        public ?bool $Enabled=null,
        /** @var DateTime|null */
        public ?DateTime $ExpiresAt=null,
        /** @var string|null */
        public ?string $Url=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['AllowPromotionCodes'])) $this->AllowPromotionCodes = $o['AllowPromotionCodes'];
        if (isset($o['Enabled'])) $this->Enabled = $o['Enabled'];
        if (isset($o['ExpiresAt'])) $this->ExpiresAt = JsonConverters::from('DateTime', $o['ExpiresAt']);
        if (isset($o['Url'])) $this->Url = $o['Url'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->AllowPromotionCodes)) $o['AllowPromotionCodes'] = $this->AllowPromotionCodes;
        if (isset($this->Enabled)) $o['Enabled'] = $this->Enabled;
        if (isset($this->ExpiresAt)) $o['ExpiresAt'] = JsonConverters::to('DateTime', $this->ExpiresAt);
        if (isset($this->Url)) $o['Url'] = $this->Url;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionAfterExpiration
 */
class SessionAfterExpiration extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var SessionAfterExpirationRecovery|null */
        public ?SessionAfterExpirationRecovery $Recovery=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Recovery'])) $this->Recovery = JsonConverters::from('SessionAfterExpirationRecovery', $o['Recovery']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Recovery)) $o['Recovery'] = JsonConverters::to('SessionAfterExpirationRecovery', $this->Recovery);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionAutomaticTax
 */
class SessionAutomaticTax extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var bool|null */
        public ?bool $Enabled=null,
        /** @var string|null */
        public ?string $Status=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Enabled'])) $this->Enabled = $o['Enabled'];
        if (isset($o['Status'])) $this->Status = $o['Status'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Enabled)) $o['Enabled'] = $this->Enabled;
        if (isset($this->Status)) $o['Status'] = $this->Status;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionConsent
 */
class SessionConsent extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Promotions=null,
        /** @var string|null */
        public ?string $TermsOfService=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Promotions'])) $this->Promotions = $o['Promotions'];
        if (isset($o['TermsOfService'])) $this->TermsOfService = $o['TermsOfService'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Promotions)) $o['Promotions'] = $this->Promotions;
        if (isset($this->TermsOfService)) $o['TermsOfService'] = $this->TermsOfService;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionConsentCollection
 */
class SessionConsentCollection extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Promotions=null,
        /** @var string|null */
        public ?string $TermsOfService=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Promotions'])) $this->Promotions = $o['Promotions'];
        if (isset($o['TermsOfService'])) $this->TermsOfService = $o['TermsOfService'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Promotions)) $o['Promotions'] = $this->Promotions;
        if (isset($this->TermsOfService)) $o['TermsOfService'] = $this->TermsOfService;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomFieldDropdownOption
 */
class SessionCustomFieldDropdownOption extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Label=null,
        /** @var string|null */
        public ?string $Value=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Label'])) $this->Label = $o['Label'];
        if (isset($o['Value'])) $this->Value = $o['Value'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Label)) $o['Label'] = $this->Label;
        if (isset($this->Value)) $o['Value'] = $this->Value;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomFieldDropdown
 */
class SessionCustomFieldDropdown extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var array<SessionCustomFieldDropdownOption>|null */
        public ?array $Options=null,
        /** @var string|null */
        public ?string $Value=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Options'])) $this->Options = JsonConverters::fromArray('SessionCustomFieldDropdownOption', $o['Options']);
        if (isset($o['Value'])) $this->Value = $o['Value'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Options)) $o['Options'] = JsonConverters::toArray('SessionCustomFieldDropdownOption', $this->Options);
        if (isset($this->Value)) $o['Value'] = $this->Value;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomFieldLabel
 */
class SessionCustomFieldLabel extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Custom=null,
        /** @var string|null */
        public ?string $Type=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Custom'])) $this->Custom = $o['Custom'];
        if (isset($o['Type'])) $this->Type = $o['Type'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Custom)) $o['Custom'] = $this->Custom;
        if (isset($this->Type)) $o['Type'] = $this->Type;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomFieldNumeric
 */
class SessionCustomFieldNumeric extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Value=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Value'])) $this->Value = $o['Value'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Value)) $o['Value'] = $this->Value;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomFieldText
 */
class SessionCustomFieldText extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Value=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Value'])) $this->Value = $o['Value'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Value)) $o['Value'] = $this->Value;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomField
 */
class SessionCustomField extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var SessionCustomFieldDropdown|null */
        public ?SessionCustomFieldDropdown $Dropdown=null,
        /** @var string|null */
        public ?string $Key=null,
        /** @var SessionCustomFieldLabel|null */
        public ?SessionCustomFieldLabel $Label=null,
        /** @var SessionCustomFieldNumeric|null */
        public ?SessionCustomFieldNumeric $Numeric=null,
        /** @var bool|null */
        public ?bool $Optional=null,
        /** @var SessionCustomFieldText|null */
        public ?SessionCustomFieldText $Text=null,
        /** @var string|null */
        public ?string $Type=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Dropdown'])) $this->Dropdown = JsonConverters::from('SessionCustomFieldDropdown', $o['Dropdown']);
        if (isset($o['Key'])) $this->Key = $o['Key'];
        if (isset($o['Label'])) $this->Label = JsonConverters::from('SessionCustomFieldLabel', $o['Label']);
        if (isset($o['Numeric'])) $this->Numeric = JsonConverters::from('SessionCustomFieldNumeric', $o['Numeric']);
        if (isset($o['Optional'])) $this->Optional = $o['Optional'];
        if (isset($o['Text'])) $this->Text = JsonConverters::from('SessionCustomFieldText', $o['Text']);
        if (isset($o['Type'])) $this->Type = $o['Type'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Dropdown)) $o['Dropdown'] = JsonConverters::to('SessionCustomFieldDropdown', $this->Dropdown);
        if (isset($this->Key)) $o['Key'] = $this->Key;
        if (isset($this->Label)) $o['Label'] = JsonConverters::to('SessionCustomFieldLabel', $this->Label);
        if (isset($this->Numeric)) $o['Numeric'] = JsonConverters::to('SessionCustomFieldNumeric', $this->Numeric);
        if (isset($this->Optional)) $o['Optional'] = $this->Optional;
        if (isset($this->Text)) $o['Text'] = JsonConverters::to('SessionCustomFieldText', $this->Text);
        if (isset($this->Type)) $o['Type'] = $this->Type;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomTextShippingAddress
 */
class SessionCustomTextShippingAddress extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Message=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Message'])) $this->Message = $o['Message'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Message)) $o['Message'] = $this->Message;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomTextSubmit
 */
class SessionCustomTextSubmit extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Message=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Message'])) $this->Message = $o['Message'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Message)) $o['Message'] = $this->Message;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomText
 */
class SessionCustomText extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var SessionCustomTextShippingAddress|null */
        public ?SessionCustomTextShippingAddress $ShippingAddress=null,
        /** @var SessionCustomTextSubmit|null */
        public ?SessionCustomTextSubmit $Submit=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['ShippingAddress'])) $this->ShippingAddress = JsonConverters::from('SessionCustomTextShippingAddress', $o['ShippingAddress']);
        if (isset($o['Submit'])) $this->Submit = JsonConverters::from('SessionCustomTextSubmit', $o['Submit']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->ShippingAddress)) $o['ShippingAddress'] = JsonConverters::to('SessionCustomTextShippingAddress', $this->ShippingAddress);
        if (isset($this->Submit)) $o['Submit'] = JsonConverters::to('SessionCustomTextSubmit', $this->Submit);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of Address
 */
class Address extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $City=null,
        /** @var string|null */
        public ?string $Country=null,
        /** @var string|null */
        public ?string $Line1=null,
        /** @var string|null */
        public ?string $Line2=null,
        /** @var string|null */
        public ?string $PostalCode=null,
        /** @var string|null */
        public ?string $State=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['City'])) $this->City = $o['City'];
        if (isset($o['Country'])) $this->Country = $o['Country'];
        if (isset($o['Line1'])) $this->Line1 = $o['Line1'];
        if (isset($o['Line2'])) $this->Line2 = $o['Line2'];
        if (isset($o['PostalCode'])) $this->PostalCode = $o['PostalCode'];
        if (isset($o['State'])) $this->State = $o['State'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->City)) $o['City'] = $this->City;
        if (isset($this->Country)) $o['Country'] = $this->Country;
        if (isset($this->Line1)) $o['Line1'] = $this->Line1;
        if (isset($this->Line2)) $o['Line2'] = $this->Line2;
        if (isset($this->PostalCode)) $o['PostalCode'] = $this->PostalCode;
        if (isset($this->State)) $o['State'] = $this->State;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomerDetailsTaxId
 */
class SessionCustomerDetailsTaxId extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Type=null,
        /** @var string|null */
        public ?string $Value=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Type'])) $this->Type = $o['Type'];
        if (isset($o['Value'])) $this->Value = $o['Value'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Type)) $o['Type'] = $this->Type;
        if (isset($this->Value)) $o['Value'] = $this->Value;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionCustomerDetails
 */
class SessionCustomerDetails extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var Address|null */
        public ?Address $Address=null,
        /** @var string|null */
        public ?string $Email=null,
        /** @var string|null */
        public ?string $Name=null,
        /** @var string|null */
        public ?string $Phone=null,
        /** @var string|null */
        public ?string $TaxExempt=null,
        /** @var array<SessionCustomerDetailsTaxId>|null */
        public ?array $TaxIds=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Address'])) $this->Address = JsonConverters::from('Address', $o['Address']);
        if (isset($o['Email'])) $this->Email = $o['Email'];
        if (isset($o['Name'])) $this->Name = $o['Name'];
        if (isset($o['Phone'])) $this->Phone = $o['Phone'];
        if (isset($o['TaxExempt'])) $this->TaxExempt = $o['TaxExempt'];
        if (isset($o['TaxIds'])) $this->TaxIds = JsonConverters::fromArray('SessionCustomerDetailsTaxId', $o['TaxIds']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Address)) $o['Address'] = JsonConverters::to('Address', $this->Address);
        if (isset($this->Email)) $o['Email'] = $this->Email;
        if (isset($this->Name)) $o['Name'] = $this->Name;
        if (isset($this->Phone)) $o['Phone'] = $this->Phone;
        if (isset($this->TaxExempt)) $o['TaxExempt'] = $this->TaxExempt;
        if (isset($this->TaxIds)) $o['TaxIds'] = JsonConverters::toArray('SessionCustomerDetailsTaxId', $this->TaxIds);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionInvoiceCreationInvoiceDataCustomField
 */
class SessionInvoiceCreationInvoiceDataCustomField extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Name=null,
        /** @var string|null */
        public ?string $Value=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Name'])) $this->Name = $o['Name'];
        if (isset($o['Value'])) $this->Value = $o['Value'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Name)) $o['Name'] = $this->Name;
        if (isset($this->Value)) $o['Value'] = $this->Value;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionInvoiceCreationInvoiceDataRenderingOptions
 */
class SessionInvoiceCreationInvoiceDataRenderingOptions extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $AmountTaxDisplay=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['AmountTaxDisplay'])) $this->AmountTaxDisplay = $o['AmountTaxDisplay'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->AmountTaxDisplay)) $o['AmountTaxDisplay'] = $this->AmountTaxDisplay;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionInvoiceCreationInvoiceData
 */
class SessionInvoiceCreationInvoiceData extends StripeEntity1 implements IHasMetadata, JsonSerializable
{
    public function __construct(
        /** @var array<SessionInvoiceCreationInvoiceDataCustomField>|null */
        public ?array $CustomFields=null,
        /** @var string|null */
        public ?string $Description=null,
        /** @var string|null */
        public ?string $Footer=null,
        /** @var array<string,string>|null */
        public ?array $Metadata=null,
        /** @var SessionInvoiceCreationInvoiceDataRenderingOptions|null */
        public ?SessionInvoiceCreationInvoiceDataRenderingOptions $RenderingOptions=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['CustomFields'])) $this->CustomFields = JsonConverters::fromArray('SessionInvoiceCreationInvoiceDataCustomField', $o['CustomFields']);
        if (isset($o['Description'])) $this->Description = $o['Description'];
        if (isset($o['Footer'])) $this->Footer = $o['Footer'];
        if (isset($o['Metadata'])) $this->Metadata = JsonConverters::from(JsonConverters::context('Dictionary',genericArgs:['string','string']), $o['Metadata']);
        if (isset($o['RenderingOptions'])) $this->RenderingOptions = JsonConverters::from('SessionInvoiceCreationInvoiceDataRenderingOptions', $o['RenderingOptions']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->CustomFields)) $o['CustomFields'] = JsonConverters::toArray('SessionInvoiceCreationInvoiceDataCustomField', $this->CustomFields);
        if (isset($this->Description)) $o['Description'] = $this->Description;
        if (isset($this->Footer)) $o['Footer'] = $this->Footer;
        if (isset($this->Metadata)) $o['Metadata'] = JsonConverters::to(JsonConverters::context('Dictionary',genericArgs:['string','string']), $this->Metadata);
        if (isset($this->RenderingOptions)) $o['RenderingOptions'] = JsonConverters::to('SessionInvoiceCreationInvoiceDataRenderingOptions', $this->RenderingOptions);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionInvoiceCreation
 */
class SessionInvoiceCreation extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var bool|null */
        public ?bool $Enabled=null,
        /** @var SessionInvoiceCreationInvoiceData|null */
        public ?SessionInvoiceCreationInvoiceData $InvoiceData=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Enabled'])) $this->Enabled = $o['Enabled'];
        if (isset($o['InvoiceData'])) $this->InvoiceData = JsonConverters::from('SessionInvoiceCreationInvoiceData', $o['InvoiceData']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Enabled)) $o['Enabled'] = $this->Enabled;
        if (isset($this->InvoiceData)) $o['InvoiceData'] = JsonConverters::to('SessionInvoiceCreationInvoiceData', $this->InvoiceData);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of CouponAppliesTo
 */
class CouponAppliesTo extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var array<string>|null */
        public ?array $Products=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Products'])) $this->Products = JsonConverters::fromArray('string', $o['Products']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Products)) $o['Products'] = JsonConverters::toArray('string', $this->Products);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of CouponCurrencyOptions
 */
class CouponCurrencyOptions extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $AmountOff=0
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['AmountOff'])) $this->AmountOff = $o['AmountOff'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->AmountOff)) $o['AmountOff'] = $this->AmountOff;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of Coupon
 */
class Coupon extends StripeEntity1 implements IHasId, IHasMetadata, IHasObject, JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Id=null,
        /** @var string|null */
        public ?string $Object=null,
        /** @var int|null */
        public ?int $AmountOff=null,
        /** @var CouponAppliesTo|null */
        public ?CouponAppliesTo $AppliesTo=null,
        /** @var DateTime */
        public DateTime $Created=new DateTime(),
        /** @var string|null */
        public ?string $Currency=null,
        /** @var array<string,CouponCurrencyOptions>|null */
        public ?array $CurrencyOptions=null,
        /** @var bool|null */
        public ?bool $Deleted=null,
        /** @var string|null */
        public ?string $Duration=null,
        /** @var int|null */
        public ?int $DurationInMonths=null,
        /** @var bool|null */
        public ?bool $Livemode=null,
        /** @var int|null */
        public ?int $MaxRedemptions=null,
        /** @var array<string,string>|null */
        public ?array $Metadata=null,
        /** @var string|null */
        public ?string $Name=null,
        /** @var float|null */
        public ?float $PercentOff=null,
        /** @var DateTime|null */
        public ?DateTime $RedeemBy=null,
        /** @var int */
        public int $TimesRedeemed=0,
        /** @var bool|null */
        public ?bool $Valid=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Id'])) $this->Id = $o['Id'];
        if (isset($o['Object'])) $this->Object = $o['Object'];
        if (isset($o['AmountOff'])) $this->AmountOff = $o['AmountOff'];
        if (isset($o['AppliesTo'])) $this->AppliesTo = JsonConverters::from('CouponAppliesTo', $o['AppliesTo']);
        if (isset($o['Created'])) $this->Created = JsonConverters::from('DateTime', $o['Created']);
        if (isset($o['Currency'])) $this->Currency = $o['Currency'];
        if (isset($o['CurrencyOptions'])) $this->CurrencyOptions = JsonConverters::from(JsonConverters::context('Dictionary',genericArgs:['string','CouponCurrencyOptions']), $o['CurrencyOptions']);
        if (isset($o['Deleted'])) $this->Deleted = $o['Deleted'];
        if (isset($o['Duration'])) $this->Duration = $o['Duration'];
        if (isset($o['DurationInMonths'])) $this->DurationInMonths = $o['DurationInMonths'];
        if (isset($o['Livemode'])) $this->Livemode = $o['Livemode'];
        if (isset($o['MaxRedemptions'])) $this->MaxRedemptions = $o['MaxRedemptions'];
        if (isset($o['Metadata'])) $this->Metadata = JsonConverters::from(JsonConverters::context('Dictionary',genericArgs:['string','string']), $o['Metadata']);
        if (isset($o['Name'])) $this->Name = $o['Name'];
        if (isset($o['PercentOff'])) $this->PercentOff = $o['PercentOff'];
        if (isset($o['RedeemBy'])) $this->RedeemBy = JsonConverters::from('DateTime', $o['RedeemBy']);
        if (isset($o['TimesRedeemed'])) $this->TimesRedeemed = $o['TimesRedeemed'];
        if (isset($o['Valid'])) $this->Valid = $o['Valid'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Id)) $o['Id'] = $this->Id;
        if (isset($this->Object)) $o['Object'] = $this->Object;
        if (isset($this->AmountOff)) $o['AmountOff'] = $this->AmountOff;
        if (isset($this->AppliesTo)) $o['AppliesTo'] = JsonConverters::to('CouponAppliesTo', $this->AppliesTo);
        if (isset($this->Created)) $o['Created'] = JsonConverters::to('DateTime', $this->Created);
        if (isset($this->Currency)) $o['Currency'] = $this->Currency;
        if (isset($this->CurrencyOptions)) $o['CurrencyOptions'] = JsonConverters::to(JsonConverters::context('Dictionary',genericArgs:['string','CouponCurrencyOptions']), $this->CurrencyOptions);
        if (isset($this->Deleted)) $o['Deleted'] = $this->Deleted;
        if (isset($this->Duration)) $o['Duration'] = $this->Duration;
        if (isset($this->DurationInMonths)) $o['DurationInMonths'] = $this->DurationInMonths;
        if (isset($this->Livemode)) $o['Livemode'] = $this->Livemode;
        if (isset($this->MaxRedemptions)) $o['MaxRedemptions'] = $this->MaxRedemptions;
        if (isset($this->Metadata)) $o['Metadata'] = JsonConverters::to(JsonConverters::context('Dictionary',genericArgs:['string','string']), $this->Metadata);
        if (isset($this->Name)) $o['Name'] = $this->Name;
        if (isset($this->PercentOff)) $o['PercentOff'] = $this->PercentOff;
        if (isset($this->RedeemBy)) $o['RedeemBy'] = JsonConverters::to('DateTime', $this->RedeemBy);
        if (isset($this->TimesRedeemed)) $o['TimesRedeemed'] = $this->TimesRedeemed;
        if (isset($this->Valid)) $o['Valid'] = $this->Valid;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of Discount
 */
class Discount extends StripeEntity1 implements IHasId, IHasObject, JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Id=null,
        /** @var string|null */
        public ?string $Object=null,
        /** @var string|null */
        public ?string $CheckoutSession=null,
        /** @var Coupon|null */
        public ?Coupon $Coupon=null,
        /** @var bool|null */
        public ?bool $Deleted=null,
        /** @var DateTime|null */
        public ?DateTime $End=null,
        /** @var string|null */
        public ?string $Invoice=null,
        /** @var string|null */
        public ?string $InvoiceItem=null,
        /** @var DateTime|null */
        public ?DateTime $Start=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Id'])) $this->Id = $o['Id'];
        if (isset($o['Object'])) $this->Object = $o['Object'];
        if (isset($o['CheckoutSession'])) $this->CheckoutSession = $o['CheckoutSession'];
        if (isset($o['Coupon'])) $this->Coupon = JsonConverters::from('Coupon', $o['Coupon']);
        if (isset($o['Deleted'])) $this->Deleted = $o['Deleted'];
        if (isset($o['End'])) $this->End = JsonConverters::from('DateTime', $o['End']);
        if (isset($o['Invoice'])) $this->Invoice = $o['Invoice'];
        if (isset($o['InvoiceItem'])) $this->InvoiceItem = $o['InvoiceItem'];
        if (isset($o['Start'])) $this->Start = JsonConverters::from('DateTime', $o['Start']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Id)) $o['Id'] = $this->Id;
        if (isset($this->Object)) $o['Object'] = $this->Object;
        if (isset($this->CheckoutSession)) $o['CheckoutSession'] = $this->CheckoutSession;
        if (isset($this->Coupon)) $o['Coupon'] = JsonConverters::to('Coupon', $this->Coupon);
        if (isset($this->Deleted)) $o['Deleted'] = $this->Deleted;
        if (isset($this->End)) $o['End'] = JsonConverters::to('DateTime', $this->End);
        if (isset($this->Invoice)) $o['Invoice'] = $this->Invoice;
        if (isset($this->InvoiceItem)) $o['InvoiceItem'] = $this->InvoiceItem;
        if (isset($this->Start)) $o['Start'] = JsonConverters::to('DateTime', $this->Start);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of LineItemDiscount
 */
class LineItemDiscount extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $Amount=0,
        /** @var Discount|null */
        public ?Discount $Discount=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Amount'])) $this->Amount = $o['Amount'];
        if (isset($o['Discount'])) $this->Discount = JsonConverters::from('Discount', $o['Discount']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Amount)) $o['Amount'] = $this->Amount;
        if (isset($this->Discount)) $o['Discount'] = JsonConverters::to('Discount', $this->Discount);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of PriceCurrencyOptionsCustomUnitAmount
 */
class PriceCurrencyOptionsCustomUnitAmount extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int|null */
        public ?int $Maximum=null,
        /** @var int|null */
        public ?int $Minimum=null,
        /** @var int|null */
        public ?int $Preset=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Maximum'])) $this->Maximum = $o['Maximum'];
        if (isset($o['Minimum'])) $this->Minimum = $o['Minimum'];
        if (isset($o['Preset'])) $this->Preset = $o['Preset'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Maximum)) $o['Maximum'] = $this->Maximum;
        if (isset($this->Minimum)) $o['Minimum'] = $this->Minimum;
        if (isset($this->Preset)) $o['Preset'] = $this->Preset;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of PriceCurrencyOptionsTier
 */
class PriceCurrencyOptionsTier extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int|null */
        public ?int $FlatAmount=null,
        /** @var float|null */
        public ?float $FlatAmountDecimal=null,
        /** @var int|null */
        public ?int $UnitAmount=null,
        /** @var float|null */
        public ?float $UnitAmountDecimal=null,
        /** @var int|null */
        public ?int $UpTo=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['FlatAmount'])) $this->FlatAmount = $o['FlatAmount'];
        if (isset($o['FlatAmountDecimal'])) $this->FlatAmountDecimal = $o['FlatAmountDecimal'];
        if (isset($o['UnitAmount'])) $this->UnitAmount = $o['UnitAmount'];
        if (isset($o['UnitAmountDecimal'])) $this->UnitAmountDecimal = $o['UnitAmountDecimal'];
        if (isset($o['UpTo'])) $this->UpTo = $o['UpTo'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->FlatAmount)) $o['FlatAmount'] = $this->FlatAmount;
        if (isset($this->FlatAmountDecimal)) $o['FlatAmountDecimal'] = $this->FlatAmountDecimal;
        if (isset($this->UnitAmount)) $o['UnitAmount'] = $this->UnitAmount;
        if (isset($this->UnitAmountDecimal)) $o['UnitAmountDecimal'] = $this->UnitAmountDecimal;
        if (isset($this->UpTo)) $o['UpTo'] = $this->UpTo;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of PriceCurrencyOptions
 */
class PriceCurrencyOptions extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var PriceCurrencyOptionsCustomUnitAmount|null */
        public ?PriceCurrencyOptionsCustomUnitAmount $CustomUnitAmount=null,
        /** @var string|null */
        public ?string $TaxBehavior=null,
        /** @var array<PriceCurrencyOptionsTier>|null */
        public ?array $Tiers=null,
        /** @var int|null */
        public ?int $UnitAmount=null,
        /** @var float|null */
        public ?float $UnitAmountDecimal=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['CustomUnitAmount'])) $this->CustomUnitAmount = JsonConverters::from('PriceCurrencyOptionsCustomUnitAmount', $o['CustomUnitAmount']);
        if (isset($o['TaxBehavior'])) $this->TaxBehavior = $o['TaxBehavior'];
        if (isset($o['Tiers'])) $this->Tiers = JsonConverters::fromArray('PriceCurrencyOptionsTier', $o['Tiers']);
        if (isset($o['UnitAmount'])) $this->UnitAmount = $o['UnitAmount'];
        if (isset($o['UnitAmountDecimal'])) $this->UnitAmountDecimal = $o['UnitAmountDecimal'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->CustomUnitAmount)) $o['CustomUnitAmount'] = JsonConverters::to('PriceCurrencyOptionsCustomUnitAmount', $this->CustomUnitAmount);
        if (isset($this->TaxBehavior)) $o['TaxBehavior'] = $this->TaxBehavior;
        if (isset($this->Tiers)) $o['Tiers'] = JsonConverters::toArray('PriceCurrencyOptionsTier', $this->Tiers);
        if (isset($this->UnitAmount)) $o['UnitAmount'] = $this->UnitAmount;
        if (isset($this->UnitAmountDecimal)) $o['UnitAmountDecimal'] = $this->UnitAmountDecimal;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of PriceCustomUnitAmount
 */
class PriceCustomUnitAmount extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int|null */
        public ?int $Maximum=null,
        /** @var int|null */
        public ?int $Minimum=null,
        /** @var int|null */
        public ?int $Preset=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Maximum'])) $this->Maximum = $o['Maximum'];
        if (isset($o['Minimum'])) $this->Minimum = $o['Minimum'];
        if (isset($o['Preset'])) $this->Preset = $o['Preset'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Maximum)) $o['Maximum'] = $this->Maximum;
        if (isset($this->Minimum)) $o['Minimum'] = $this->Minimum;
        if (isset($this->Preset)) $o['Preset'] = $this->Preset;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of PriceRecurring
 */
class PriceRecurring extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $AggregateUsage=null,
        /** @var string|null */
        public ?string $Interval=null,
        /** @var int */
        public int $IntervalCount=0,
        /** @var int|null */
        public ?int $TrialPeriodDays=null,
        /** @var string|null */
        public ?string $UsageType=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['AggregateUsage'])) $this->AggregateUsage = $o['AggregateUsage'];
        if (isset($o['Interval'])) $this->Interval = $o['Interval'];
        if (isset($o['IntervalCount'])) $this->IntervalCount = $o['IntervalCount'];
        if (isset($o['TrialPeriodDays'])) $this->TrialPeriodDays = $o['TrialPeriodDays'];
        if (isset($o['UsageType'])) $this->UsageType = $o['UsageType'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->AggregateUsage)) $o['AggregateUsage'] = $this->AggregateUsage;
        if (isset($this->Interval)) $o['Interval'] = $this->Interval;
        if (isset($this->IntervalCount)) $o['IntervalCount'] = $this->IntervalCount;
        if (isset($this->TrialPeriodDays)) $o['TrialPeriodDays'] = $this->TrialPeriodDays;
        if (isset($this->UsageType)) $o['UsageType'] = $this->UsageType;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of PriceTier
 */
class PriceTier extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int|null */
        public ?int $FlatAmount=null,
        /** @var float|null */
        public ?float $FlatAmountDecimal=null,
        /** @var int|null */
        public ?int $UnitAmount=null,
        /** @var float|null */
        public ?float $UnitAmountDecimal=null,
        /** @var int|null */
        public ?int $UpTo=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['FlatAmount'])) $this->FlatAmount = $o['FlatAmount'];
        if (isset($o['FlatAmountDecimal'])) $this->FlatAmountDecimal = $o['FlatAmountDecimal'];
        if (isset($o['UnitAmount'])) $this->UnitAmount = $o['UnitAmount'];
        if (isset($o['UnitAmountDecimal'])) $this->UnitAmountDecimal = $o['UnitAmountDecimal'];
        if (isset($o['UpTo'])) $this->UpTo = $o['UpTo'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->FlatAmount)) $o['FlatAmount'] = $this->FlatAmount;
        if (isset($this->FlatAmountDecimal)) $o['FlatAmountDecimal'] = $this->FlatAmountDecimal;
        if (isset($this->UnitAmount)) $o['UnitAmount'] = $this->UnitAmount;
        if (isset($this->UnitAmountDecimal)) $o['UnitAmountDecimal'] = $this->UnitAmountDecimal;
        if (isset($this->UpTo)) $o['UpTo'] = $this->UpTo;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of PriceTransformQuantity
 */
class PriceTransformQuantity extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $DivideBy=0,
        /** @var string|null */
        public ?string $Round=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['DivideBy'])) $this->DivideBy = $o['DivideBy'];
        if (isset($o['Round'])) $this->Round = $o['Round'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->DivideBy)) $o['DivideBy'] = $this->DivideBy;
        if (isset($this->Round)) $o['Round'] = $this->Round;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of Price
 */
class Price extends StripeEntity1 implements IHasId, IHasMetadata, IHasObject, JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Id=null,
        /** @var string|null */
        public ?string $Object=null,
        /** @var bool|null */
        public ?bool $Active=null,
        /** @var string|null */
        public ?string $BillingScheme=null,
        /** @var DateTime */
        public DateTime $Created=new DateTime(),
        /** @var string|null */
        public ?string $Currency=null,
        /** @var array<string,PriceCurrencyOptions>|null */
        public ?array $CurrencyOptions=null,
        /** @var PriceCustomUnitAmount|null */
        public ?PriceCustomUnitAmount $CustomUnitAmount=null,
        /** @var bool|null */
        public ?bool $Deleted=null,
        /** @var bool|null */
        public ?bool $Livemode=null,
        /** @var string|null */
        public ?string $LookupKey=null,
        /** @var array<string,string>|null */
        public ?array $Metadata=null,
        /** @var string|null */
        public ?string $Nickname=null,
        /** @var PriceRecurring|null */
        public ?PriceRecurring $Recurring=null,
        /** @var string|null */
        public ?string $TaxBehavior=null,
        /** @var array<PriceTier>|null */
        public ?array $Tiers=null,
        /** @var string|null */
        public ?string $TiersMode=null,
        /** @var PriceTransformQuantity|null */
        public ?PriceTransformQuantity $TransformQuantity=null,
        /** @var string|null */
        public ?string $Type=null,
        /** @var int|null */
        public ?int $UnitAmount=null,
        /** @var float|null */
        public ?float $UnitAmountDecimal=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Id'])) $this->Id = $o['Id'];
        if (isset($o['Object'])) $this->Object = $o['Object'];
        if (isset($o['Active'])) $this->Active = $o['Active'];
        if (isset($o['BillingScheme'])) $this->BillingScheme = $o['BillingScheme'];
        if (isset($o['Created'])) $this->Created = JsonConverters::from('DateTime', $o['Created']);
        if (isset($o['Currency'])) $this->Currency = $o['Currency'];
        if (isset($o['CurrencyOptions'])) $this->CurrencyOptions = JsonConverters::from(JsonConverters::context('Dictionary',genericArgs:['string','PriceCurrencyOptions']), $o['CurrencyOptions']);
        if (isset($o['CustomUnitAmount'])) $this->CustomUnitAmount = JsonConverters::from('PriceCustomUnitAmount', $o['CustomUnitAmount']);
        if (isset($o['Deleted'])) $this->Deleted = $o['Deleted'];
        if (isset($o['Livemode'])) $this->Livemode = $o['Livemode'];
        if (isset($o['LookupKey'])) $this->LookupKey = $o['LookupKey'];
        if (isset($o['Metadata'])) $this->Metadata = JsonConverters::from(JsonConverters::context('Dictionary',genericArgs:['string','string']), $o['Metadata']);
        if (isset($o['Nickname'])) $this->Nickname = $o['Nickname'];
        if (isset($o['Recurring'])) $this->Recurring = JsonConverters::from('PriceRecurring', $o['Recurring']);
        if (isset($o['TaxBehavior'])) $this->TaxBehavior = $o['TaxBehavior'];
        if (isset($o['Tiers'])) $this->Tiers = JsonConverters::fromArray('PriceTier', $o['Tiers']);
        if (isset($o['TiersMode'])) $this->TiersMode = $o['TiersMode'];
        if (isset($o['TransformQuantity'])) $this->TransformQuantity = JsonConverters::from('PriceTransformQuantity', $o['TransformQuantity']);
        if (isset($o['Type'])) $this->Type = $o['Type'];
        if (isset($o['UnitAmount'])) $this->UnitAmount = $o['UnitAmount'];
        if (isset($o['UnitAmountDecimal'])) $this->UnitAmountDecimal = $o['UnitAmountDecimal'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Id)) $o['Id'] = $this->Id;
        if (isset($this->Object)) $o['Object'] = $this->Object;
        if (isset($this->Active)) $o['Active'] = $this->Active;
        if (isset($this->BillingScheme)) $o['BillingScheme'] = $this->BillingScheme;
        if (isset($this->Created)) $o['Created'] = JsonConverters::to('DateTime', $this->Created);
        if (isset($this->Currency)) $o['Currency'] = $this->Currency;
        if (isset($this->CurrencyOptions)) $o['CurrencyOptions'] = JsonConverters::to(JsonConverters::context('Dictionary',genericArgs:['string','PriceCurrencyOptions']), $this->CurrencyOptions);
        if (isset($this->CustomUnitAmount)) $o['CustomUnitAmount'] = JsonConverters::to('PriceCustomUnitAmount', $this->CustomUnitAmount);
        if (isset($this->Deleted)) $o['Deleted'] = $this->Deleted;
        if (isset($this->Livemode)) $o['Livemode'] = $this->Livemode;
        if (isset($this->LookupKey)) $o['LookupKey'] = $this->LookupKey;
        if (isset($this->Metadata)) $o['Metadata'] = JsonConverters::to(JsonConverters::context('Dictionary',genericArgs:['string','string']), $this->Metadata);
        if (isset($this->Nickname)) $o['Nickname'] = $this->Nickname;
        if (isset($this->Recurring)) $o['Recurring'] = JsonConverters::to('PriceRecurring', $this->Recurring);
        if (isset($this->TaxBehavior)) $o['TaxBehavior'] = $this->TaxBehavior;
        if (isset($this->Tiers)) $o['Tiers'] = JsonConverters::toArray('PriceTier', $this->Tiers);
        if (isset($this->TiersMode)) $o['TiersMode'] = $this->TiersMode;
        if (isset($this->TransformQuantity)) $o['TransformQuantity'] = JsonConverters::to('PriceTransformQuantity', $this->TransformQuantity);
        if (isset($this->Type)) $o['Type'] = $this->Type;
        if (isset($this->UnitAmount)) $o['UnitAmount'] = $this->UnitAmount;
        if (isset($this->UnitAmountDecimal)) $o['UnitAmountDecimal'] = $this->UnitAmountDecimal;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of TaxRate
 */
class TaxRate extends StripeEntity1 implements IHasId, IHasMetadata, IHasObject, JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Id=null,
        /** @var string|null */
        public ?string $Object=null,
        /** @var bool|null */
        public ?bool $Active=null,
        /** @var string|null */
        public ?string $Country=null,
        /** @var DateTime */
        public DateTime $Created=new DateTime(),
        /** @var string|null */
        public ?string $Description=null,
        /** @var string|null */
        public ?string $DisplayName=null,
        /** @var bool|null */
        public ?bool $Inclusive=null,
        /** @var string|null */
        public ?string $Jurisdiction=null,
        /** @var bool|null */
        public ?bool $Livemode=null,
        /** @var array<string,string>|null */
        public ?array $Metadata=null,
        /** @var float */
        public float $Percentage=0.0,
        /** @var string|null */
        public ?string $State=null,
        /** @var string|null */
        public ?string $TaxType=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Id'])) $this->Id = $o['Id'];
        if (isset($o['Object'])) $this->Object = $o['Object'];
        if (isset($o['Active'])) $this->Active = $o['Active'];
        if (isset($o['Country'])) $this->Country = $o['Country'];
        if (isset($o['Created'])) $this->Created = JsonConverters::from('DateTime', $o['Created']);
        if (isset($o['Description'])) $this->Description = $o['Description'];
        if (isset($o['DisplayName'])) $this->DisplayName = $o['DisplayName'];
        if (isset($o['Inclusive'])) $this->Inclusive = $o['Inclusive'];
        if (isset($o['Jurisdiction'])) $this->Jurisdiction = $o['Jurisdiction'];
        if (isset($o['Livemode'])) $this->Livemode = $o['Livemode'];
        if (isset($o['Metadata'])) $this->Metadata = JsonConverters::from(JsonConverters::context('Dictionary',genericArgs:['string','string']), $o['Metadata']);
        if (isset($o['Percentage'])) $this->Percentage = $o['Percentage'];
        if (isset($o['State'])) $this->State = $o['State'];
        if (isset($o['TaxType'])) $this->TaxType = $o['TaxType'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Id)) $o['Id'] = $this->Id;
        if (isset($this->Object)) $o['Object'] = $this->Object;
        if (isset($this->Active)) $o['Active'] = $this->Active;
        if (isset($this->Country)) $o['Country'] = $this->Country;
        if (isset($this->Created)) $o['Created'] = JsonConverters::to('DateTime', $this->Created);
        if (isset($this->Description)) $o['Description'] = $this->Description;
        if (isset($this->DisplayName)) $o['DisplayName'] = $this->DisplayName;
        if (isset($this->Inclusive)) $o['Inclusive'] = $this->Inclusive;
        if (isset($this->Jurisdiction)) $o['Jurisdiction'] = $this->Jurisdiction;
        if (isset($this->Livemode)) $o['Livemode'] = $this->Livemode;
        if (isset($this->Metadata)) $o['Metadata'] = JsonConverters::to(JsonConverters::context('Dictionary',genericArgs:['string','string']), $this->Metadata);
        if (isset($this->Percentage)) $o['Percentage'] = $this->Percentage;
        if (isset($this->State)) $o['State'] = $this->State;
        if (isset($this->TaxType)) $o['TaxType'] = $this->TaxType;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of LineItemTax
 */
class LineItemTax extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $Amount=0,
        /** @var TaxRate|null */
        public ?TaxRate $Rate=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Amount'])) $this->Amount = $o['Amount'];
        if (isset($o['Rate'])) $this->Rate = JsonConverters::from('TaxRate', $o['Rate']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Amount)) $o['Amount'] = $this->Amount;
        if (isset($this->Rate)) $o['Rate'] = JsonConverters::to('TaxRate', $this->Rate);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of LineItem
 */
class LineItem extends StripeEntity1 implements IHasId, IHasObject, JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Id=null,
        /** @var string|null */
        public ?string $Object=null,
        /** @var int */
        public int $AmountDiscount=0,
        /** @var int */
        public int $AmountSubtotal=0,
        /** @var int */
        public int $AmountTax=0,
        /** @var int */
        public int $AmountTotal=0,
        /** @var string|null */
        public ?string $Currency=null,
        /** @var bool|null */
        public ?bool $Deleted=null,
        /** @var string|null */
        public ?string $Description=null,
        /** @var array<LineItemDiscount>|null */
        public ?array $Discounts=null,
        /** @var Price|null */
        public ?Price $Price=null,
        /** @var int|null */
        public ?int $Quantity=null,
        /** @var array<LineItemTax>|null */
        public ?array $Taxes=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Id'])) $this->Id = $o['Id'];
        if (isset($o['Object'])) $this->Object = $o['Object'];
        if (isset($o['AmountDiscount'])) $this->AmountDiscount = $o['AmountDiscount'];
        if (isset($o['AmountSubtotal'])) $this->AmountSubtotal = $o['AmountSubtotal'];
        if (isset($o['AmountTax'])) $this->AmountTax = $o['AmountTax'];
        if (isset($o['AmountTotal'])) $this->AmountTotal = $o['AmountTotal'];
        if (isset($o['Currency'])) $this->Currency = $o['Currency'];
        if (isset($o['Deleted'])) $this->Deleted = $o['Deleted'];
        if (isset($o['Description'])) $this->Description = $o['Description'];
        if (isset($o['Discounts'])) $this->Discounts = JsonConverters::fromArray('LineItemDiscount', $o['Discounts']);
        if (isset($o['Price'])) $this->Price = JsonConverters::from('Price', $o['Price']);
        if (isset($o['Quantity'])) $this->Quantity = $o['Quantity'];
        if (isset($o['Taxes'])) $this->Taxes = JsonConverters::fromArray('LineItemTax', $o['Taxes']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Id)) $o['Id'] = $this->Id;
        if (isset($this->Object)) $o['Object'] = $this->Object;
        if (isset($this->AmountDiscount)) $o['AmountDiscount'] = $this->AmountDiscount;
        if (isset($this->AmountSubtotal)) $o['AmountSubtotal'] = $this->AmountSubtotal;
        if (isset($this->AmountTax)) $o['AmountTax'] = $this->AmountTax;
        if (isset($this->AmountTotal)) $o['AmountTotal'] = $this->AmountTotal;
        if (isset($this->Currency)) $o['Currency'] = $this->Currency;
        if (isset($this->Deleted)) $o['Deleted'] = $this->Deleted;
        if (isset($this->Description)) $o['Description'] = $this->Description;
        if (isset($this->Discounts)) $o['Discounts'] = JsonConverters::toArray('LineItemDiscount', $this->Discounts);
        if (isset($this->Price)) $o['Price'] = JsonConverters::to('Price', $this->Price);
        if (isset($this->Quantity)) $o['Quantity'] = $this->Quantity;
        if (isset($this->Taxes)) $o['Taxes'] = JsonConverters::toArray('LineItemTax', $this->Taxes);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsAcssDebitMandateOptions
 */
class SessionPaymentMethodOptionsAcssDebitMandateOptions extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $CustomMandateUrl=null,
        /** @var array<string>|null */
        public ?array $DefaultFor=null,
        /** @var string|null */
        public ?string $IntervalDescription=null,
        /** @var string|null */
        public ?string $PaymentSchedule=null,
        /** @var string|null */
        public ?string $TransactionType=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['CustomMandateUrl'])) $this->CustomMandateUrl = $o['CustomMandateUrl'];
        if (isset($o['DefaultFor'])) $this->DefaultFor = JsonConverters::fromArray('string', $o['DefaultFor']);
        if (isset($o['IntervalDescription'])) $this->IntervalDescription = $o['IntervalDescription'];
        if (isset($o['PaymentSchedule'])) $this->PaymentSchedule = $o['PaymentSchedule'];
        if (isset($o['TransactionType'])) $this->TransactionType = $o['TransactionType'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->CustomMandateUrl)) $o['CustomMandateUrl'] = $this->CustomMandateUrl;
        if (isset($this->DefaultFor)) $o['DefaultFor'] = JsonConverters::toArray('string', $this->DefaultFor);
        if (isset($this->IntervalDescription)) $o['IntervalDescription'] = $this->IntervalDescription;
        if (isset($this->PaymentSchedule)) $o['PaymentSchedule'] = $this->PaymentSchedule;
        if (isset($this->TransactionType)) $o['TransactionType'] = $this->TransactionType;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsAcssDebit
 */
class SessionPaymentMethodOptionsAcssDebit extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Currency=null,
        /** @var SessionPaymentMethodOptionsAcssDebitMandateOptions|null */
        public ?SessionPaymentMethodOptionsAcssDebitMandateOptions $MandateOptions=null,
        /** @var string|null */
        public ?string $SetupFutureUsage=null,
        /** @var string|null */
        public ?string $VerificationMethod=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Currency'])) $this->Currency = $o['Currency'];
        if (isset($o['MandateOptions'])) $this->MandateOptions = JsonConverters::from('SessionPaymentMethodOptionsAcssDebitMandateOptions', $o['MandateOptions']);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
        if (isset($o['VerificationMethod'])) $this->VerificationMethod = $o['VerificationMethod'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Currency)) $o['Currency'] = $this->Currency;
        if (isset($this->MandateOptions)) $o['MandateOptions'] = JsonConverters::to('SessionPaymentMethodOptionsAcssDebitMandateOptions', $this->MandateOptions);
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        if (isset($this->VerificationMethod)) $o['VerificationMethod'] = $this->VerificationMethod;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsAffirm
 */
class SessionPaymentMethodOptionsAffirm extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsAfterpayClearpay
 */
class SessionPaymentMethodOptionsAfterpayClearpay extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsAlipay
 */
class SessionPaymentMethodOptionsAlipay extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsAuBecsDebit
 */
class SessionPaymentMethodOptionsAuBecsDebit extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsBacsDebit
 */
class SessionPaymentMethodOptionsBacsDebit extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsBancontact
 */
class SessionPaymentMethodOptionsBancontact extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsBoleto
 */
class SessionPaymentMethodOptionsBoleto extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $ExpiresAfterDays=0,
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['ExpiresAfterDays'])) $this->ExpiresAfterDays = $o['ExpiresAfterDays'];
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->ExpiresAfterDays)) $o['ExpiresAfterDays'] = $this->ExpiresAfterDays;
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsCardInstallments
 */
class SessionPaymentMethodOptionsCardInstallments extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var bool|null */
        public ?bool $Enabled=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Enabled'])) $this->Enabled = $o['Enabled'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Enabled)) $o['Enabled'] = $this->Enabled;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsCard
 */
class SessionPaymentMethodOptionsCard extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var SessionPaymentMethodOptionsCardInstallments|null */
        public ?SessionPaymentMethodOptionsCardInstallments $Installments=null,
        /** @var string|null */
        public ?string $SetupFutureUsage=null,
        /** @var string|null */
        public ?string $StatementDescriptorSuffixKana=null,
        /** @var string|null */
        public ?string $StatementDescriptorSuffixKanji=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Installments'])) $this->Installments = JsonConverters::from('SessionPaymentMethodOptionsCardInstallments', $o['Installments']);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
        if (isset($o['StatementDescriptorSuffixKana'])) $this->StatementDescriptorSuffixKana = $o['StatementDescriptorSuffixKana'];
        if (isset($o['StatementDescriptorSuffixKanji'])) $this->StatementDescriptorSuffixKanji = $o['StatementDescriptorSuffixKanji'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Installments)) $o['Installments'] = JsonConverters::to('SessionPaymentMethodOptionsCardInstallments', $this->Installments);
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        if (isset($this->StatementDescriptorSuffixKana)) $o['StatementDescriptorSuffixKana'] = $this->StatementDescriptorSuffixKana;
        if (isset($this->StatementDescriptorSuffixKanji)) $o['StatementDescriptorSuffixKanji'] = $this->StatementDescriptorSuffixKanji;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsCustomerBalanceBankTransferEuBankTransfer
 */
class SessionPaymentMethodOptionsCustomerBalanceBankTransferEuBankTransfer extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Country=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Country'])) $this->Country = $o['Country'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Country)) $o['Country'] = $this->Country;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsCustomerBalanceBankTransfer
 */
class SessionPaymentMethodOptionsCustomerBalanceBankTransfer extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var SessionPaymentMethodOptionsCustomerBalanceBankTransferEuBankTransfer|null */
        public ?SessionPaymentMethodOptionsCustomerBalanceBankTransferEuBankTransfer $EuBankTransfer=null,
        /** @var array<string>|null */
        public ?array $RequestedAddressTypes=null,
        /** @var string|null */
        public ?string $Type=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['EuBankTransfer'])) $this->EuBankTransfer = JsonConverters::from('SessionPaymentMethodOptionsCustomerBalanceBankTransferEuBankTransfer', $o['EuBankTransfer']);
        if (isset($o['RequestedAddressTypes'])) $this->RequestedAddressTypes = JsonConverters::fromArray('string', $o['RequestedAddressTypes']);
        if (isset($o['Type'])) $this->Type = $o['Type'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->EuBankTransfer)) $o['EuBankTransfer'] = JsonConverters::to('SessionPaymentMethodOptionsCustomerBalanceBankTransferEuBankTransfer', $this->EuBankTransfer);
        if (isset($this->RequestedAddressTypes)) $o['RequestedAddressTypes'] = JsonConverters::toArray('string', $this->RequestedAddressTypes);
        if (isset($this->Type)) $o['Type'] = $this->Type;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsCustomerBalance
 */
class SessionPaymentMethodOptionsCustomerBalance extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var SessionPaymentMethodOptionsCustomerBalanceBankTransfer|null */
        public ?SessionPaymentMethodOptionsCustomerBalanceBankTransfer $BankTransfer=null,
        /** @var string|null */
        public ?string $FundingType=null,
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['BankTransfer'])) $this->BankTransfer = JsonConverters::from('SessionPaymentMethodOptionsCustomerBalanceBankTransfer', $o['BankTransfer']);
        if (isset($o['FundingType'])) $this->FundingType = $o['FundingType'];
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->BankTransfer)) $o['BankTransfer'] = JsonConverters::to('SessionPaymentMethodOptionsCustomerBalanceBankTransfer', $this->BankTransfer);
        if (isset($this->FundingType)) $o['FundingType'] = $this->FundingType;
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsEps
 */
class SessionPaymentMethodOptionsEps extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsFpx
 */
class SessionPaymentMethodOptionsFpx extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsGiropay
 */
class SessionPaymentMethodOptionsGiropay extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsGrabpay
 */
class SessionPaymentMethodOptionsGrabpay extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsIdeal
 */
class SessionPaymentMethodOptionsIdeal extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsKlarna
 */
class SessionPaymentMethodOptionsKlarna extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsKonbini
 */
class SessionPaymentMethodOptionsKonbini extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int|null */
        public ?int $ExpiresAfterDays=null,
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['ExpiresAfterDays'])) $this->ExpiresAfterDays = $o['ExpiresAfterDays'];
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->ExpiresAfterDays)) $o['ExpiresAfterDays'] = $this->ExpiresAfterDays;
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsOxxo
 */
class SessionPaymentMethodOptionsOxxo extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $ExpiresAfterDays=0,
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['ExpiresAfterDays'])) $this->ExpiresAfterDays = $o['ExpiresAfterDays'];
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->ExpiresAfterDays)) $o['ExpiresAfterDays'] = $this->ExpiresAfterDays;
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsP24
 */
class SessionPaymentMethodOptionsP24 extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsPaynow
 */
class SessionPaymentMethodOptionsPaynow extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsPix
 */
class SessionPaymentMethodOptionsPix extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int|null */
        public ?int $ExpiresAfterSeconds=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['ExpiresAfterSeconds'])) $this->ExpiresAfterSeconds = $o['ExpiresAfterSeconds'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->ExpiresAfterSeconds)) $o['ExpiresAfterSeconds'] = $this->ExpiresAfterSeconds;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsSepaDebit
 */
class SessionPaymentMethodOptionsSepaDebit extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsSofort
 */
class SessionPaymentMethodOptionsSofort extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $SetupFutureUsage=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsUsBankAccountFinancialConnections
 */
class SessionPaymentMethodOptionsUsBankAccountFinancialConnections extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var array<string>|null */
        public ?array $Permissions=null,
        /** @var string|null */
        public ?string $ReturnUrl=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Permissions'])) $this->Permissions = JsonConverters::fromArray('string', $o['Permissions']);
        if (isset($o['ReturnUrl'])) $this->ReturnUrl = $o['ReturnUrl'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Permissions)) $o['Permissions'] = JsonConverters::toArray('string', $this->Permissions);
        if (isset($this->ReturnUrl)) $o['ReturnUrl'] = $this->ReturnUrl;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptionsUsBankAccount
 */
class SessionPaymentMethodOptionsUsBankAccount extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var SessionPaymentMethodOptionsUsBankAccountFinancialConnections|null */
        public ?SessionPaymentMethodOptionsUsBankAccountFinancialConnections $FinancialConnections=null,
        /** @var string|null */
        public ?string $SetupFutureUsage=null,
        /** @var string|null */
        public ?string $VerificationMethod=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['FinancialConnections'])) $this->FinancialConnections = JsonConverters::from('SessionPaymentMethodOptionsUsBankAccountFinancialConnections', $o['FinancialConnections']);
        if (isset($o['SetupFutureUsage'])) $this->SetupFutureUsage = $o['SetupFutureUsage'];
        if (isset($o['VerificationMethod'])) $this->VerificationMethod = $o['VerificationMethod'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->FinancialConnections)) $o['FinancialConnections'] = JsonConverters::to('SessionPaymentMethodOptionsUsBankAccountFinancialConnections', $this->FinancialConnections);
        if (isset($this->SetupFutureUsage)) $o['SetupFutureUsage'] = $this->SetupFutureUsage;
        if (isset($this->VerificationMethod)) $o['VerificationMethod'] = $this->VerificationMethod;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPaymentMethodOptions
 */
class SessionPaymentMethodOptions extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var SessionPaymentMethodOptionsAcssDebit|null */
        public ?SessionPaymentMethodOptionsAcssDebit $AcssDebit=null,
        /** @var SessionPaymentMethodOptionsAffirm|null */
        public ?SessionPaymentMethodOptionsAffirm $Affirm=null,
        /** @var SessionPaymentMethodOptionsAfterpayClearpay|null */
        public ?SessionPaymentMethodOptionsAfterpayClearpay $AfterpayClearpay=null,
        /** @var SessionPaymentMethodOptionsAlipay|null */
        public ?SessionPaymentMethodOptionsAlipay $Alipay=null,
        /** @var SessionPaymentMethodOptionsAuBecsDebit|null */
        public ?SessionPaymentMethodOptionsAuBecsDebit $AuBecsDebit=null,
        /** @var SessionPaymentMethodOptionsBacsDebit|null */
        public ?SessionPaymentMethodOptionsBacsDebit $BacsDebit=null,
        /** @var SessionPaymentMethodOptionsBancontact|null */
        public ?SessionPaymentMethodOptionsBancontact $Bancontact=null,
        /** @var SessionPaymentMethodOptionsBoleto|null */
        public ?SessionPaymentMethodOptionsBoleto $Boleto=null,
        /** @var SessionPaymentMethodOptionsCard|null */
        public ?SessionPaymentMethodOptionsCard $Card=null,
        /** @var SessionPaymentMethodOptionsCustomerBalance|null */
        public ?SessionPaymentMethodOptionsCustomerBalance $CustomerBalance=null,
        /** @var SessionPaymentMethodOptionsEps|null */
        public ?SessionPaymentMethodOptionsEps $Eps=null,
        /** @var SessionPaymentMethodOptionsFpx|null */
        public ?SessionPaymentMethodOptionsFpx $Fpx=null,
        /** @var SessionPaymentMethodOptionsGiropay|null */
        public ?SessionPaymentMethodOptionsGiropay $Giropay=null,
        /** @var SessionPaymentMethodOptionsGrabpay|null */
        public ?SessionPaymentMethodOptionsGrabpay $Grabpay=null,
        /** @var SessionPaymentMethodOptionsIdeal|null */
        public ?SessionPaymentMethodOptionsIdeal $Ideal=null,
        /** @var SessionPaymentMethodOptionsKlarna|null */
        public ?SessionPaymentMethodOptionsKlarna $Klarna=null,
        /** @var SessionPaymentMethodOptionsKonbini|null */
        public ?SessionPaymentMethodOptionsKonbini $Konbini=null,
        /** @var SessionPaymentMethodOptionsOxxo|null */
        public ?SessionPaymentMethodOptionsOxxo $Oxxo=null,
        /** @var SessionPaymentMethodOptionsP24|null */
        public ?SessionPaymentMethodOptionsP24 $P24=null,
        /** @var SessionPaymentMethodOptionsPaynow|null */
        public ?SessionPaymentMethodOptionsPaynow $Paynow=null,
        /** @var SessionPaymentMethodOptionsPix|null */
        public ?SessionPaymentMethodOptionsPix $Pix=null,
        /** @var SessionPaymentMethodOptionsSepaDebit|null */
        public ?SessionPaymentMethodOptionsSepaDebit $SepaDebit=null,
        /** @var SessionPaymentMethodOptionsSofort|null */
        public ?SessionPaymentMethodOptionsSofort $Sofort=null,
        /** @var SessionPaymentMethodOptionsUsBankAccount|null */
        public ?SessionPaymentMethodOptionsUsBankAccount $UsBankAccount=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['AcssDebit'])) $this->AcssDebit = JsonConverters::from('SessionPaymentMethodOptionsAcssDebit', $o['AcssDebit']);
        if (isset($o['Affirm'])) $this->Affirm = JsonConverters::from('SessionPaymentMethodOptionsAffirm', $o['Affirm']);
        if (isset($o['AfterpayClearpay'])) $this->AfterpayClearpay = JsonConverters::from('SessionPaymentMethodOptionsAfterpayClearpay', $o['AfterpayClearpay']);
        if (isset($o['Alipay'])) $this->Alipay = JsonConverters::from('SessionPaymentMethodOptionsAlipay', $o['Alipay']);
        if (isset($o['AuBecsDebit'])) $this->AuBecsDebit = JsonConverters::from('SessionPaymentMethodOptionsAuBecsDebit', $o['AuBecsDebit']);
        if (isset($o['BacsDebit'])) $this->BacsDebit = JsonConverters::from('SessionPaymentMethodOptionsBacsDebit', $o['BacsDebit']);
        if (isset($o['Bancontact'])) $this->Bancontact = JsonConverters::from('SessionPaymentMethodOptionsBancontact', $o['Bancontact']);
        if (isset($o['Boleto'])) $this->Boleto = JsonConverters::from('SessionPaymentMethodOptionsBoleto', $o['Boleto']);
        if (isset($o['Card'])) $this->Card = JsonConverters::from('SessionPaymentMethodOptionsCard', $o['Card']);
        if (isset($o['CustomerBalance'])) $this->CustomerBalance = JsonConverters::from('SessionPaymentMethodOptionsCustomerBalance', $o['CustomerBalance']);
        if (isset($o['Eps'])) $this->Eps = JsonConverters::from('SessionPaymentMethodOptionsEps', $o['Eps']);
        if (isset($o['Fpx'])) $this->Fpx = JsonConverters::from('SessionPaymentMethodOptionsFpx', $o['Fpx']);
        if (isset($o['Giropay'])) $this->Giropay = JsonConverters::from('SessionPaymentMethodOptionsGiropay', $o['Giropay']);
        if (isset($o['Grabpay'])) $this->Grabpay = JsonConverters::from('SessionPaymentMethodOptionsGrabpay', $o['Grabpay']);
        if (isset($o['Ideal'])) $this->Ideal = JsonConverters::from('SessionPaymentMethodOptionsIdeal', $o['Ideal']);
        if (isset($o['Klarna'])) $this->Klarna = JsonConverters::from('SessionPaymentMethodOptionsKlarna', $o['Klarna']);
        if (isset($o['Konbini'])) $this->Konbini = JsonConverters::from('SessionPaymentMethodOptionsKonbini', $o['Konbini']);
        if (isset($o['Oxxo'])) $this->Oxxo = JsonConverters::from('SessionPaymentMethodOptionsOxxo', $o['Oxxo']);
        if (isset($o['P24'])) $this->P24 = JsonConverters::from('SessionPaymentMethodOptionsP24', $o['P24']);
        if (isset($o['Paynow'])) $this->Paynow = JsonConverters::from('SessionPaymentMethodOptionsPaynow', $o['Paynow']);
        if (isset($o['Pix'])) $this->Pix = JsonConverters::from('SessionPaymentMethodOptionsPix', $o['Pix']);
        if (isset($o['SepaDebit'])) $this->SepaDebit = JsonConverters::from('SessionPaymentMethodOptionsSepaDebit', $o['SepaDebit']);
        if (isset($o['Sofort'])) $this->Sofort = JsonConverters::from('SessionPaymentMethodOptionsSofort', $o['Sofort']);
        if (isset($o['UsBankAccount'])) $this->UsBankAccount = JsonConverters::from('SessionPaymentMethodOptionsUsBankAccount', $o['UsBankAccount']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->AcssDebit)) $o['AcssDebit'] = JsonConverters::to('SessionPaymentMethodOptionsAcssDebit', $this->AcssDebit);
        if (isset($this->Affirm)) $o['Affirm'] = JsonConverters::to('SessionPaymentMethodOptionsAffirm', $this->Affirm);
        if (isset($this->AfterpayClearpay)) $o['AfterpayClearpay'] = JsonConverters::to('SessionPaymentMethodOptionsAfterpayClearpay', $this->AfterpayClearpay);
        if (isset($this->Alipay)) $o['Alipay'] = JsonConverters::to('SessionPaymentMethodOptionsAlipay', $this->Alipay);
        if (isset($this->AuBecsDebit)) $o['AuBecsDebit'] = JsonConverters::to('SessionPaymentMethodOptionsAuBecsDebit', $this->AuBecsDebit);
        if (isset($this->BacsDebit)) $o['BacsDebit'] = JsonConverters::to('SessionPaymentMethodOptionsBacsDebit', $this->BacsDebit);
        if (isset($this->Bancontact)) $o['Bancontact'] = JsonConverters::to('SessionPaymentMethodOptionsBancontact', $this->Bancontact);
        if (isset($this->Boleto)) $o['Boleto'] = JsonConverters::to('SessionPaymentMethodOptionsBoleto', $this->Boleto);
        if (isset($this->Card)) $o['Card'] = JsonConverters::to('SessionPaymentMethodOptionsCard', $this->Card);
        if (isset($this->CustomerBalance)) $o['CustomerBalance'] = JsonConverters::to('SessionPaymentMethodOptionsCustomerBalance', $this->CustomerBalance);
        if (isset($this->Eps)) $o['Eps'] = JsonConverters::to('SessionPaymentMethodOptionsEps', $this->Eps);
        if (isset($this->Fpx)) $o['Fpx'] = JsonConverters::to('SessionPaymentMethodOptionsFpx', $this->Fpx);
        if (isset($this->Giropay)) $o['Giropay'] = JsonConverters::to('SessionPaymentMethodOptionsGiropay', $this->Giropay);
        if (isset($this->Grabpay)) $o['Grabpay'] = JsonConverters::to('SessionPaymentMethodOptionsGrabpay', $this->Grabpay);
        if (isset($this->Ideal)) $o['Ideal'] = JsonConverters::to('SessionPaymentMethodOptionsIdeal', $this->Ideal);
        if (isset($this->Klarna)) $o['Klarna'] = JsonConverters::to('SessionPaymentMethodOptionsKlarna', $this->Klarna);
        if (isset($this->Konbini)) $o['Konbini'] = JsonConverters::to('SessionPaymentMethodOptionsKonbini', $this->Konbini);
        if (isset($this->Oxxo)) $o['Oxxo'] = JsonConverters::to('SessionPaymentMethodOptionsOxxo', $this->Oxxo);
        if (isset($this->P24)) $o['P24'] = JsonConverters::to('SessionPaymentMethodOptionsP24', $this->P24);
        if (isset($this->Paynow)) $o['Paynow'] = JsonConverters::to('SessionPaymentMethodOptionsPaynow', $this->Paynow);
        if (isset($this->Pix)) $o['Pix'] = JsonConverters::to('SessionPaymentMethodOptionsPix', $this->Pix);
        if (isset($this->SepaDebit)) $o['SepaDebit'] = JsonConverters::to('SessionPaymentMethodOptionsSepaDebit', $this->SepaDebit);
        if (isset($this->Sofort)) $o['Sofort'] = JsonConverters::to('SessionPaymentMethodOptionsSofort', $this->Sofort);
        if (isset($this->UsBankAccount)) $o['UsBankAccount'] = JsonConverters::to('SessionPaymentMethodOptionsUsBankAccount', $this->UsBankAccount);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionPhoneNumberCollection
 */
class SessionPhoneNumberCollection extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var bool|null */
        public ?bool $Enabled=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Enabled'])) $this->Enabled = $o['Enabled'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Enabled)) $o['Enabled'] = $this->Enabled;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionShippingAddressCollection
 */
class SessionShippingAddressCollection extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var array<string>|null */
        public ?array $AllowedCountries=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['AllowedCountries'])) $this->AllowedCountries = JsonConverters::fromArray('string', $o['AllowedCountries']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->AllowedCountries)) $o['AllowedCountries'] = JsonConverters::toArray('string', $this->AllowedCountries);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionShippingCostTax
 */
class SessionShippingCostTax extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $Amount=0,
        /** @var TaxRate|null */
        public ?TaxRate $Rate=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Amount'])) $this->Amount = $o['Amount'];
        if (isset($o['Rate'])) $this->Rate = JsonConverters::from('TaxRate', $o['Rate']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Amount)) $o['Amount'] = $this->Amount;
        if (isset($this->Rate)) $o['Rate'] = JsonConverters::to('TaxRate', $this->Rate);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionShippingCost
 */
class SessionShippingCost extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $AmountSubtotal=0,
        /** @var int */
        public int $AmountTax=0,
        /** @var int */
        public int $AmountTotal=0,
        /** @var array<SessionShippingCostTax>|null */
        public ?array $Taxes=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['AmountSubtotal'])) $this->AmountSubtotal = $o['AmountSubtotal'];
        if (isset($o['AmountTax'])) $this->AmountTax = $o['AmountTax'];
        if (isset($o['AmountTotal'])) $this->AmountTotal = $o['AmountTotal'];
        if (isset($o['Taxes'])) $this->Taxes = JsonConverters::fromArray('SessionShippingCostTax', $o['Taxes']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->AmountSubtotal)) $o['AmountSubtotal'] = $this->AmountSubtotal;
        if (isset($this->AmountTax)) $o['AmountTax'] = $this->AmountTax;
        if (isset($this->AmountTotal)) $o['AmountTotal'] = $this->AmountTotal;
        if (isset($this->Taxes)) $o['Taxes'] = JsonConverters::toArray('SessionShippingCostTax', $this->Taxes);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionShippingDetails
 */
class SessionShippingDetails extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var Address|null */
        public ?Address $Address=null,
        /** @var string|null */
        public ?string $Carrier=null,
        /** @var string|null */
        public ?string $Name=null,
        /** @var string|null */
        public ?string $Phone=null,
        /** @var string|null */
        public ?string $TrackingNumber=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Address'])) $this->Address = JsonConverters::from('Address', $o['Address']);
        if (isset($o['Carrier'])) $this->Carrier = $o['Carrier'];
        if (isset($o['Name'])) $this->Name = $o['Name'];
        if (isset($o['Phone'])) $this->Phone = $o['Phone'];
        if (isset($o['TrackingNumber'])) $this->TrackingNumber = $o['TrackingNumber'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Address)) $o['Address'] = JsonConverters::to('Address', $this->Address);
        if (isset($this->Carrier)) $o['Carrier'] = $this->Carrier;
        if (isset($this->Name)) $o['Name'] = $this->Name;
        if (isset($this->Phone)) $o['Phone'] = $this->Phone;
        if (isset($this->TrackingNumber)) $o['TrackingNumber'] = $this->TrackingNumber;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionShippingOption
 */
class SessionShippingOption extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $ShippingAmount=0
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['ShippingAmount'])) $this->ShippingAmount = $o['ShippingAmount'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->ShippingAmount)) $o['ShippingAmount'] = $this->ShippingAmount;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionTaxIdCollection
 */
class SessionTaxIdCollection extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var bool|null */
        public ?bool $Enabled=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Enabled'])) $this->Enabled = $o['Enabled'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Enabled)) $o['Enabled'] = $this->Enabled;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionTotalDetailsBreakdownDiscount
 */
class SessionTotalDetailsBreakdownDiscount extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $Amount=0,
        /** @var Discount|null */
        public ?Discount $Discount=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Amount'])) $this->Amount = $o['Amount'];
        if (isset($o['Discount'])) $this->Discount = JsonConverters::from('Discount', $o['Discount']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Amount)) $o['Amount'] = $this->Amount;
        if (isset($this->Discount)) $o['Discount'] = JsonConverters::to('Discount', $this->Discount);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionTotalDetailsBreakdownTax
 */
class SessionTotalDetailsBreakdownTax extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $Amount=0,
        /** @var TaxRate|null */
        public ?TaxRate $Rate=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Amount'])) $this->Amount = $o['Amount'];
        if (isset($o['Rate'])) $this->Rate = JsonConverters::from('TaxRate', $o['Rate']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Amount)) $o['Amount'] = $this->Amount;
        if (isset($this->Rate)) $o['Rate'] = JsonConverters::to('TaxRate', $this->Rate);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionTotalDetailsBreakdown
 */
class SessionTotalDetailsBreakdown extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var array<SessionTotalDetailsBreakdownDiscount>|null */
        public ?array $Discounts=null,
        /** @var array<SessionTotalDetailsBreakdownTax>|null */
        public ?array $Taxes=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Discounts'])) $this->Discounts = JsonConverters::fromArray('SessionTotalDetailsBreakdownDiscount', $o['Discounts']);
        if (isset($o['Taxes'])) $this->Taxes = JsonConverters::fromArray('SessionTotalDetailsBreakdownTax', $o['Taxes']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Discounts)) $o['Discounts'] = JsonConverters::toArray('SessionTotalDetailsBreakdownDiscount', $this->Discounts);
        if (isset($this->Taxes)) $o['Taxes'] = JsonConverters::toArray('SessionTotalDetailsBreakdownTax', $this->Taxes);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of SessionTotalDetails
 */
class SessionTotalDetails extends StripeEntity1 implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $AmountDiscount=0,
        /** @var int|null */
        public ?int $AmountShipping=null,
        /** @var int */
        public int $AmountTax=0,
        /** @var SessionTotalDetailsBreakdown|null */
        public ?SessionTotalDetailsBreakdown $Breakdown=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['AmountDiscount'])) $this->AmountDiscount = $o['AmountDiscount'];
        if (isset($o['AmountShipping'])) $this->AmountShipping = $o['AmountShipping'];
        if (isset($o['AmountTax'])) $this->AmountTax = $o['AmountTax'];
        if (isset($o['Breakdown'])) $this->Breakdown = JsonConverters::from('SessionTotalDetailsBreakdown', $o['Breakdown']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->AmountDiscount)) $o['AmountDiscount'] = $this->AmountDiscount;
        if (isset($this->AmountShipping)) $o['AmountShipping'] = $this->AmountShipping;
        if (isset($this->AmountTax)) $o['AmountTax'] = $this->AmountTax;
        if (isset($this->Breakdown)) $o['Breakdown'] = JsonConverters::to('SessionTotalDetailsBreakdown', $this->Breakdown);
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template StripeEntity1 of Session
 */
class Session extends StripeEntity1 implements IHasId, IHasMetadata, IHasObject, JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Id=null,
        /** @var string|null */
        public ?string $Object=null,
        /** @var SessionAfterExpiration|null */
        public ?SessionAfterExpiration $AfterExpiration=null,
        /** @var bool|null */
        public ?bool $AllowPromotionCodes=null,
        /** @var int|null */
        public ?int $AmountSubtotal=null,
        /** @var int|null */
        public ?int $AmountTotal=null,
        /** @var SessionAutomaticTax|null */
        public ?SessionAutomaticTax $AutomaticTax=null,
        /** @var string|null */
        public ?string $BillingAddressCollection=null,
        /** @var string|null */
        public ?string $CancelUrl=null,
        /** @var string|null */
        public ?string $ClientReferenceId=null,
        /** @var SessionConsent|null */
        public ?SessionConsent $Consent=null,
        /** @var SessionConsentCollection|null */
        public ?SessionConsentCollection $ConsentCollection=null,
        /** @var DateTime */
        public DateTime $Created=new DateTime(),
        /** @var string|null */
        public ?string $Currency=null,
        /** @var array<SessionCustomField>|null */
        public ?array $CustomFields=null,
        /** @var SessionCustomText|null */
        public ?SessionCustomText $CustomText=null,
        /** @var string|null */
        public ?string $CustomerCreation=null,
        /** @var SessionCustomerDetails|null */
        public ?SessionCustomerDetails $CustomerDetails=null,
        /** @var string|null */
        public ?string $CustomerEmail=null,
        /** @var DateTime */
        public DateTime $ExpiresAt=new DateTime(),
        /** @var SessionInvoiceCreation|null */
        public ?SessionInvoiceCreation $InvoiceCreation=null,
        /** @var StripeList<LineItem>|null */
        public ?StripeList $LineItems=null,
        /** @var bool|null */
        public ?bool $Livemode=null,
        /** @var string|null */
        public ?string $Locale=null,
        /** @var array<string,string>|null */
        public ?array $Metadata=null,
        /** @var string|null */
        public ?string $Mode=null,
        /** @var string|null */
        public ?string $PaymentMethodCollection=null,
        /** @var SessionPaymentMethodOptions|null */
        public ?SessionPaymentMethodOptions $PaymentMethodOptions=null,
        /** @var array<string>|null */
        public ?array $PaymentMethodTypes=null,
        /** @var string|null */
        public ?string $PaymentStatus=null,
        /** @var SessionPhoneNumberCollection|null */
        public ?SessionPhoneNumberCollection $PhoneNumberCollection=null,
        /** @var string|null */
        public ?string $RecoveredFrom=null,
        /** @var SessionShippingAddressCollection|null */
        public ?SessionShippingAddressCollection $ShippingAddressCollection=null,
        /** @var SessionShippingCost|null */
        public ?SessionShippingCost $ShippingCost=null,
        /** @var SessionShippingDetails|null */
        public ?SessionShippingDetails $ShippingDetails=null,
        /** @var array<SessionShippingOption>|null */
        public ?array $ShippingOptions=null,
        /** @var string|null */
        public ?string $Status=null,
        /** @var string|null */
        public ?string $SubmitType=null,
        /** @var string|null */
        public ?string $SuccessUrl=null,
        /** @var SessionTaxIdCollection|null */
        public ?SessionTaxIdCollection $TaxIdCollection=null,
        /** @var SessionTotalDetails|null */
        public ?SessionTotalDetails $TotalDetails=null,
        /** @var string|null */
        public ?string $Url=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['Id'])) $this->Id = $o['Id'];
        if (isset($o['Object'])) $this->Object = $o['Object'];
        if (isset($o['AfterExpiration'])) $this->AfterExpiration = JsonConverters::from('SessionAfterExpiration', $o['AfterExpiration']);
        if (isset($o['AllowPromotionCodes'])) $this->AllowPromotionCodes = $o['AllowPromotionCodes'];
        if (isset($o['AmountSubtotal'])) $this->AmountSubtotal = $o['AmountSubtotal'];
        if (isset($o['AmountTotal'])) $this->AmountTotal = $o['AmountTotal'];
        if (isset($o['AutomaticTax'])) $this->AutomaticTax = JsonConverters::from('SessionAutomaticTax', $o['AutomaticTax']);
        if (isset($o['BillingAddressCollection'])) $this->BillingAddressCollection = $o['BillingAddressCollection'];
        if (isset($o['CancelUrl'])) $this->CancelUrl = $o['CancelUrl'];
        if (isset($o['ClientReferenceId'])) $this->ClientReferenceId = $o['ClientReferenceId'];
        if (isset($o['Consent'])) $this->Consent = JsonConverters::from('SessionConsent', $o['Consent']);
        if (isset($o['ConsentCollection'])) $this->ConsentCollection = JsonConverters::from('SessionConsentCollection', $o['ConsentCollection']);
        if (isset($o['Created'])) $this->Created = JsonConverters::from('DateTime', $o['Created']);
        if (isset($o['Currency'])) $this->Currency = $o['Currency'];
        if (isset($o['CustomFields'])) $this->CustomFields = JsonConverters::fromArray('SessionCustomField', $o['CustomFields']);
        if (isset($o['CustomText'])) $this->CustomText = JsonConverters::from('SessionCustomText', $o['CustomText']);
        if (isset($o['CustomerCreation'])) $this->CustomerCreation = $o['CustomerCreation'];
        if (isset($o['CustomerDetails'])) $this->CustomerDetails = JsonConverters::from('SessionCustomerDetails', $o['CustomerDetails']);
        if (isset($o['CustomerEmail'])) $this->CustomerEmail = $o['CustomerEmail'];
        if (isset($o['ExpiresAt'])) $this->ExpiresAt = JsonConverters::from('DateTime', $o['ExpiresAt']);
        if (isset($o['InvoiceCreation'])) $this->InvoiceCreation = JsonConverters::from('SessionInvoiceCreation', $o['InvoiceCreation']);
        if (isset($o['LineItems'])) $this->LineItems = JsonConverters::from(JsonConverters::context('StripeList',genericArgs:['LineItem']), $o['LineItems']);
        if (isset($o['Livemode'])) $this->Livemode = $o['Livemode'];
        if (isset($o['Locale'])) $this->Locale = $o['Locale'];
        if (isset($o['Metadata'])) $this->Metadata = JsonConverters::from(JsonConverters::context('Dictionary',genericArgs:['string','string']), $o['Metadata']);
        if (isset($o['Mode'])) $this->Mode = $o['Mode'];
        if (isset($o['PaymentMethodCollection'])) $this->PaymentMethodCollection = $o['PaymentMethodCollection'];
        if (isset($o['PaymentMethodOptions'])) $this->PaymentMethodOptions = JsonConverters::from('SessionPaymentMethodOptions', $o['PaymentMethodOptions']);
        if (isset($o['PaymentMethodTypes'])) $this->PaymentMethodTypes = JsonConverters::fromArray('string', $o['PaymentMethodTypes']);
        if (isset($o['PaymentStatus'])) $this->PaymentStatus = $o['PaymentStatus'];
        if (isset($o['PhoneNumberCollection'])) $this->PhoneNumberCollection = JsonConverters::from('SessionPhoneNumberCollection', $o['PhoneNumberCollection']);
        if (isset($o['RecoveredFrom'])) $this->RecoveredFrom = $o['RecoveredFrom'];
        if (isset($o['ShippingAddressCollection'])) $this->ShippingAddressCollection = JsonConverters::from('SessionShippingAddressCollection', $o['ShippingAddressCollection']);
        if (isset($o['ShippingCost'])) $this->ShippingCost = JsonConverters::from('SessionShippingCost', $o['ShippingCost']);
        if (isset($o['ShippingDetails'])) $this->ShippingDetails = JsonConverters::from('SessionShippingDetails', $o['ShippingDetails']);
        if (isset($o['ShippingOptions'])) $this->ShippingOptions = JsonConverters::fromArray('SessionShippingOption', $o['ShippingOptions']);
        if (isset($o['Status'])) $this->Status = $o['Status'];
        if (isset($o['SubmitType'])) $this->SubmitType = $o['SubmitType'];
        if (isset($o['SuccessUrl'])) $this->SuccessUrl = $o['SuccessUrl'];
        if (isset($o['TaxIdCollection'])) $this->TaxIdCollection = JsonConverters::from('SessionTaxIdCollection', $o['TaxIdCollection']);
        if (isset($o['TotalDetails'])) $this->TotalDetails = JsonConverters::from('SessionTotalDetails', $o['TotalDetails']);
        if (isset($o['Url'])) $this->Url = $o['Url'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->Id)) $o['Id'] = $this->Id;
        if (isset($this->Object)) $o['Object'] = $this->Object;
        if (isset($this->AfterExpiration)) $o['AfterExpiration'] = JsonConverters::to('SessionAfterExpiration', $this->AfterExpiration);
        if (isset($this->AllowPromotionCodes)) $o['AllowPromotionCodes'] = $this->AllowPromotionCodes;
        if (isset($this->AmountSubtotal)) $o['AmountSubtotal'] = $this->AmountSubtotal;
        if (isset($this->AmountTotal)) $o['AmountTotal'] = $this->AmountTotal;
        if (isset($this->AutomaticTax)) $o['AutomaticTax'] = JsonConverters::to('SessionAutomaticTax', $this->AutomaticTax);
        if (isset($this->BillingAddressCollection)) $o['BillingAddressCollection'] = $this->BillingAddressCollection;
        if (isset($this->CancelUrl)) $o['CancelUrl'] = $this->CancelUrl;
        if (isset($this->ClientReferenceId)) $o['ClientReferenceId'] = $this->ClientReferenceId;
        if (isset($this->Consent)) $o['Consent'] = JsonConverters::to('SessionConsent', $this->Consent);
        if (isset($this->ConsentCollection)) $o['ConsentCollection'] = JsonConverters::to('SessionConsentCollection', $this->ConsentCollection);
        if (isset($this->Created)) $o['Created'] = JsonConverters::to('DateTime', $this->Created);
        if (isset($this->Currency)) $o['Currency'] = $this->Currency;
        if (isset($this->CustomFields)) $o['CustomFields'] = JsonConverters::toArray('SessionCustomField', $this->CustomFields);
        if (isset($this->CustomText)) $o['CustomText'] = JsonConverters::to('SessionCustomText', $this->CustomText);
        if (isset($this->CustomerCreation)) $o['CustomerCreation'] = $this->CustomerCreation;
        if (isset($this->CustomerDetails)) $o['CustomerDetails'] = JsonConverters::to('SessionCustomerDetails', $this->CustomerDetails);
        if (isset($this->CustomerEmail)) $o['CustomerEmail'] = $this->CustomerEmail;
        if (isset($this->ExpiresAt)) $o['ExpiresAt'] = JsonConverters::to('DateTime', $this->ExpiresAt);
        if (isset($this->InvoiceCreation)) $o['InvoiceCreation'] = JsonConverters::to('SessionInvoiceCreation', $this->InvoiceCreation);
        if (isset($this->LineItems)) $o['LineItems'] = JsonConverters::to(JsonConverters::context('StripeList',genericArgs:['LineItem']), $this->LineItems);
        if (isset($this->Livemode)) $o['Livemode'] = $this->Livemode;
        if (isset($this->Locale)) $o['Locale'] = $this->Locale;
        if (isset($this->Metadata)) $o['Metadata'] = JsonConverters::to(JsonConverters::context('Dictionary',genericArgs:['string','string']), $this->Metadata);
        if (isset($this->Mode)) $o['Mode'] = $this->Mode;
        if (isset($this->PaymentMethodCollection)) $o['PaymentMethodCollection'] = $this->PaymentMethodCollection;
        if (isset($this->PaymentMethodOptions)) $o['PaymentMethodOptions'] = JsonConverters::to('SessionPaymentMethodOptions', $this->PaymentMethodOptions);
        if (isset($this->PaymentMethodTypes)) $o['PaymentMethodTypes'] = JsonConverters::toArray('string', $this->PaymentMethodTypes);
        if (isset($this->PaymentStatus)) $o['PaymentStatus'] = $this->PaymentStatus;
        if (isset($this->PhoneNumberCollection)) $o['PhoneNumberCollection'] = JsonConverters::to('SessionPhoneNumberCollection', $this->PhoneNumberCollection);
        if (isset($this->RecoveredFrom)) $o['RecoveredFrom'] = $this->RecoveredFrom;
        if (isset($this->ShippingAddressCollection)) $o['ShippingAddressCollection'] = JsonConverters::to('SessionShippingAddressCollection', $this->ShippingAddressCollection);
        if (isset($this->ShippingCost)) $o['ShippingCost'] = JsonConverters::to('SessionShippingCost', $this->ShippingCost);
        if (isset($this->ShippingDetails)) $o['ShippingDetails'] = JsonConverters::to('SessionShippingDetails', $this->ShippingDetails);
        if (isset($this->ShippingOptions)) $o['ShippingOptions'] = JsonConverters::toArray('SessionShippingOption', $this->ShippingOptions);
        if (isset($this->Status)) $o['Status'] = $this->Status;
        if (isset($this->SubmitType)) $o['SubmitType'] = $this->SubmitType;
        if (isset($this->SuccessUrl)) $o['SuccessUrl'] = $this->SuccessUrl;
        if (isset($this->TaxIdCollection)) $o['TaxIdCollection'] = JsonConverters::to('SessionTaxIdCollection', $this->TaxIdCollection);
        if (isset($this->TotalDetails)) $o['TotalDetails'] = JsonConverters::to('SessionTotalDetails', $this->TotalDetails);
        if (isset($this->Url)) $o['Url'] = $this->Url;
        return empty($o) ? new class(){} : $o;
    }
}

class GetStripeSession implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Id=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Id'])) $this->Id = $o['Id'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Id)) $o['Id'] = $this->Id;
        return empty($o) ? new class(){} : $o;
    }
}

/**
 * @template T
 * @template StripeEntity1 of StripeList<T>
 */
class StripeList extends StripeEntity1 implements IHasObject, JsonSerializable
{
    public array $genericArgs = [];
    public static function create(array $genericArgs=[]): StripeList {
        $to = new StripeList();
        $to->genericArgs = $genericArgs;
        return $to;
    }

    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        return empty($o) ? new class(){} : $o;
    }
}

PHP GetStripeSession DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .other suffix or ?format=other

HTTP + OTHER

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /stripe-session/{Id} HTTP/1.1 
Host: duengageapi.uat.scadsoftware.com 
Accept: text/jsonl
Content-Type: text/jsonl
Content-Length: length

{"Id":"String"}
HTTP/1.1 200 OK
Content-Type: text/jsonl
Content-Length: length

{Unable to show example output for type 'Session' using the custom 'other' filter}Exception has been thrown by the target of an invocation.