ClubReady Api

<back to all web services

SellContractAndSetupClientRequest

The following routes are available for this service:
POST/sales/contract/sold/new/userCreate a user and sell them a package Create a user and sell them a package. **New Operation** The PaymentMethods property is an array of objects describing how you want ClubReady to take payment while selling the PackageId/InstallmentPlanId. The deprecated fields (AcctToken, Last4, ExpMonth, ExpYear, AcctType, BnkRoute, and IsTemp) must be omitted or null. **Deprecated Operation** Provide the AcctToken, Last4, ExpMonth, ExpYear, AcctType, BnkRoute, and IsTemp used in the ClubReadyGateway API in order to create a Payment Profile to the user specified. PaymentMethods must be omitted or null.
import datetime
import decimal
from marshmallow.fields import *
from servicestack import *
from typing import *
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, LetterCase, Undefined, config
from enum import Enum, IntEnum


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ApiDtoBase:
    api_key: Optional[str] = None
    store_id: Optional[int] = None
    chain_id: Optional[int] = None


class AcctType(IntEnum):
    UNINITIALIZED = 0
    VISA = 1
    MC = 2
    DISC = 3
    AMEX = 4
    DINERS = 5
    JCB = 6
    EN_ROUTE = 7
    PAY_PAL = 8
    BILL_ME = 9
    PC = 11
    PS = 12
    BC = 13
    BS = 14
    BECS = 15
    BACS = 16
    MAESTRO = 20
    SOLO = 21
    VISA_ELECTRON = 22
    CIBC = 23
    ROYAL_BANK_CA = 24
    TD_CA_TRUST = 25
    SCOTIA = 26
    BMO = 27
    HSBC_CA = 28
    UNION_PAY = 29
    INTER_PAYMENT = 30
    LASER = 31
    UNKNOWN_CREDIT = 40
    TRANS_ARMOR = 41
    FACTOR4 = 42
    X_PASS = 43
    CONNECTED_ACCOUNT = 44
    UNKNOWN_BANK = 45
    ERROR = -1


class PaymentMethodType(IntEnum):
    UNINITIALIZED = 0
    PAYMENT_PROFILE_ID = 1
    PREFERRED_ON_FILE = 2
    ACCT_TOKEN = 3
    ERROR = -1


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class PaymentMethodDto:
    acct_token: Optional[str] = None
    profile_token: Optional[str] = None
    payment_profile_id: Optional[str] = None
    payment_amount: Optional[Decimal] = None
    payment_method_type: Optional[PaymentMethodType] = None
    do_not_update_payment_type_preference: Optional[bool] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class SellContractAndSetupClientDto(ApiDtoBase):
    acct_token: Optional[str] = None
    last4: Optional[str] = None
    exp_month: Optional[int] = None
    exp_year: Optional[int] = None
    acct_type: Optional[AcctType] = None
    bnk_route: Optional[int] = None
    is_temp: bool = False
    package_id: int = 0
    installment_plan_id: int = 0
    payment_amount: Decimal = decimal.Decimal(0)
    start_date: Optional[datetime.datetime] = None
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    zip: Optional[str] = None
    email: Optional[str] = None
    gender: Optional[str] = None
    phone: Optional[str] = None
    work_phone: Optional[str] = None
    date_of_birth: Optional[datetime.datetime] = None
    cell_phone: Optional[str] = None
    note: Optional[str] = None
    external_id: Optional[str] = None
    promo_code: Optional[str] = None
    username: Optional[str] = None
    referral_type_id: Optional[int] = None
    emergency_contact_name: Optional[str] = None
    emergency_contact_phone: Optional[str] = None
    emergency_contact_type: Optional[str] = None
    payment_methods: Optional[List[PaymentMethodDto]] = None


class RestrictedResourceType(str, Enum):
    STORE = 'Store'
    CHAIN = 'Chain'
    USER = 'User'
    UNDEFINED = 'Undefined'


# @ApiResponse(Description="", ResponseType=typeof(SellContractAndSetupClientResponse), StatusCode=200)
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class SellContractAndSetupClientRequest(SellContractAndSetupClientDto, IRestrictedApiRequest):
    # @ApiMember(Description="Api Authentication Key", IsRequired=true, ParameterType="query")
    api_key: Optional[str] = None
    """
    Api Authentication Key
    """


    # @ApiMember(Description="Id for the chain of the Api Key", ParameterType="query")
    chain_id: Optional[int] = None
    """
    Id for the chain of the Api Key
    """


    # @ApiMember(Description="Id of the store for the user", IsRequired=true, ParameterType="query")
    store_id: Optional[int] = None
    """
    Id of the store for the user
    """


    # @ApiMember(Description="Package Id being sold", IsRequired=true)
    package_id: int = 0
    """
    Package Id being sold
    """


    # @ApiMember(Description="Installment Plan Id being sold", IsRequired=true)
    installment_plan_id: int = 0
    """
    Installment Plan Id being sold
    """


    # @ApiMember(Description="Amount being paid", IsRequired=true)
    payment_amount: Decimal = decimal.Decimal(0)
    """
    Amount being paid
    """


    # @ApiMember(Description="Date contract takes affect")
    start_date: Optional[datetime.datetime] = None
    """
    Date contract takes affect
    """


    # @ApiMember(Description="First Name", IsRequired=true)
    first_name: Optional[str] = None
    """
    First Name
    """


    # @ApiMember(Description="Last Name", IsRequired=true)
    last_name: Optional[str] = None
    """
    Last Name
    """


    # @ApiMember(Description="Email Address", IsRequired=true)
    email: Optional[str] = None
    """
    Email Address
    """


    # @ApiMember(Description="Gender")
    gender: Optional[str] = None
    """
    Gender
    """


    # @ApiMember(Description="Address")
    address: Optional[str] = None
    """
    Address
    """


    # @ApiMember(Description="City")
    city: Optional[str] = None
    """
    City
    """


    # @ApiMember(Description="State")
    state: Optional[str] = None
    """
    State
    """


    # @ApiMember(Description="Zip Code")
    zip: Optional[str] = None
    """
    Zip Code
    """


    # @ApiMember(Description="Home phone")
    phone: Optional[str] = None
    """
    Home phone
    """


    # @ApiMember(Description="Work phone")
    work_phone: Optional[str] = None
    """
    Work phone
    """


    # @ApiMember(Description="Date of Birth")
    date_of_birth: Optional[datetime.datetime] = None
    """
    Date of Birth
    """


    # @ApiMember(Description="Cell phone")
    cell_phone: Optional[str] = None
    """
    Cell phone
    """


    # @ApiMember(Description="Add an internal note for the new prospect")
    note: Optional[str] = None
    """
    Add an internal note for the new prospect
    """


    # @ApiMember(Description="Unique Id for the user from your system. We store internally as ExternalUserId")
    external_id: Optional[str] = None
    """
    Unique Id for the user from your system. We store internally as ExternalUserId
    """


    # @ApiMember(Description="Promo code to apply a discount.")
    promo_code: Optional[str] = None
    """
    Promo code to apply a discount.
    """


    # @ApiMember(Description="Username should be between 4 and 255 characters long")
    username: Optional[str] = None
    """
    Username should be between 4 and 255 characters long
    """


    # @ApiMember(Description="ReferralTypeId")
    referral_type_id: Optional[int] = None
    """
    ReferralTypeId
    """


    # @ApiMember(Description="Emergency contact name")
    emergency_contact_name: Optional[str] = None
    """
    Emergency contact name
    """


    # @ApiMember(Description="Emergency contact phone number")
    emergency_contact_phone: Optional[str] = None
    """
    Emergency contact phone number
    """


    # @ApiMember(Description="Emergency contact relationship")
    emergency_contact_type: Optional[str] = None
    """
    Emergency contact relationship
    """


    # @ApiMember(Description="\r\nAn array of Payment Methods to be used for this purchase. Any entry with PreferredOnFile is assumed if omitted or null.  \r\n\r\nEach object of the array may contain properties:\r\n\r\n| Property | Description |\r\n| --- | --- |\r\n| PaymentMethodType | Usually \"AcctToken\" (Default or omitted/null) or \"PreferredOnFile\" |\r\n| PaymentAmount | The amount to be attempted for this Payment Method. When omitted (or null), the Request's PaymentAmount will be attempted |\r\n| AcctToken | The AcctToken to attempt payment (when using PaymentMethodType:AcctToken) |\r\n| ProfileToken | When provided (with AcctToken), a Payment Profile will be created (this will prevent the requirement to call `/sales/paymentprofile/import` (when using PaymentMethodType:AcctToken) |\r\n| DoNotUpdatePaymentTypePreference | When using ProfileToken, do not set the PaymentTypePreference (for more information, see `/sales/paymentprofile/import` (when using PaymentMethodType:AcctToken) |\r\n| | |\r\n\r\n* Scenario #1: Use a Gift Card with PreferredOnFile to cover the amount not approved by the Gift Card.  \r\n\r\nJSON:\r\n```json\r\n{\r\n    PaymentMethods: [\r\n        {\r\n            \"PaymentMethodType\":\"AcctToken\",\r\n            \"PaymentAmount\":\"1.00\",\r\n            \"AcctToken\":\"eyJ...GiftCard AcctToken...\",\r\n            \"ProfileToken\":\"eyJ...Gift Card ProfileToken...\"\r\n        },\r\n        {\r\n            \"PaymentMethodType\":\"PreferredOnFile\",\r\n            \"PaymentAmount\":\"1.00\"\r\n        }\r\n    ]\r\n}\r\n```\r\nJSV:\r\n```\r\n[{PaymentMethodType:AcctToken,PaymentAmount:1.00,AcctToken:eyj...,ProfileToken:eyJ...},{PaymentMethodType:PreferredOnFile,PaymentAmount:1.00}]\r\n```\r\n\r\n* Scenario #2: Use a Gift Card with PreferredOnFile to cover the amount not approved by the Gift Card.  \r\n\r\nJSON:\r\n```json\r\n{\r\n    PaymentMethods: [\r\n        {\r\n            \"PaymentMethodType\":\"AcctToken\",\r\n            \"PaymentAmount\":\"1.00\",\r\n            \"AcctToken\":\"eyJ...GiftCard AcctToken...\",\r\n            \"ProfileToken\":\"eyJ...Gift Card ProfileToken...\"\r\n        },\r\n        {\r\n            \"PaymentMethodType\":\"PreferredOnFile\",\r\n            \"PaymentAmount\":\"1.00\"\r\n        }\r\n    ]\r\n}\r\n```\r\nJSV:\r\n```jsv\r\n[{PaymentMethodType:AcctToken,PaymentAmount:1.00,AcctToken:eyj...,ProfileToken:eyJ...},{PaymentMethodType:PreferredOnFile,PaymentAmount:1.00}]\r\n```\r\n\r\nNotes:  \r\n\r\n* The example shows PaymentAmount of 1.00 for both \"AcctToken\" and \"PreferredOnFile\". This is for the example\r\nwith a total of $1.00. The firstPaymentMethod (the Gift Card) will be attempted for $1.00. If it partially approves\r\nfor less than 1.00 (example: $0.80), the second payment method (PreferredOnFile) will be attempted for the lesser of\r\nit's PaymentAmount and the remaining amount (example: $0.20).\r\n\r\n* Because this endpoint creates a new user, the \"PreferredOnFile\" option is not applicable. Also, ProfileToken with\r\nthe OwnerType \"TempstUser\" is required because the Payment Profile owner will be converted to the newly created user.\r\n\r\n* When using Query String (or this web site), this value must be encoded with JSV [(JSON-like Separated Values)](https://docs.servicestack.net/jsv-format).\r\nBasic steps to convert JSON to JSV: 1) Remove properties that are null, 2) Remove white space including line feeds, 3) Remove quotes.\r\n")
    payment_methods: Optional[List[PaymentMethodDto]] = None
    """
    An array of Payment Methods to be used for this purchase. Any entry with PreferredOnFile is assumed if omitted or null.  Each object of the array may contain properties:| Property | Description || --- | --- || PaymentMethodType | Usually "AcctToken" (Default or omitted/null) or "PreferredOnFile" || PaymentAmount | The amount to be attempted for this Payment Method. When omitted (or null), the Request's PaymentAmount will be attempted || AcctToken | The AcctToken to attempt payment (when using PaymentMethodType:AcctToken) || ProfileToken | When provided (with AcctToken), a Payment Profile will be created (this will prevent the requirement to call `/sales/paymentprofile/import` (when using PaymentMethodType:AcctToken) || DoNotUpdatePaymentTypePreference | When using ProfileToken, do not set the PaymentTypePreference (for more information, see `/sales/paymentprofile/import` (when using PaymentMethodType:AcctToken) || | |* Scenario #1: Use a Gift Card with PreferredOnFile to cover the amount not approved by the Gift Card.  JSON:```json{    PaymentMethods: [        {            "PaymentMethodType":"AcctToken",            "PaymentAmount":"1.00",            "AcctToken":"eyJ...GiftCard AcctToken...",            "ProfileToken":"eyJ...Gift Card ProfileToken..."        },        {            "PaymentMethodType":"PreferredOnFile",            "PaymentAmount":"1.00"        }    ]}```JSV:```[{PaymentMethodType:AcctToken,PaymentAmount:1.00,AcctToken:eyj...,ProfileToken:eyJ...},{PaymentMethodType:PreferredOnFile,PaymentAmount:1.00}]```* Scenario #2: Use a Gift Card with PreferredOnFile to cover the amount not approved by the Gift Card.  JSON:```json{    PaymentMethods: [        {            "PaymentMethodType":"AcctToken",            "PaymentAmount":"1.00",            "AcctToken":"eyJ...GiftCard AcctToken...",            "ProfileToken":"eyJ...Gift Card ProfileToken..."        },        {            "PaymentMethodType":"PreferredOnFile",            "PaymentAmount":"1.00"        }    ]}```JSV:```jsv[{PaymentMethodType:AcctToken,PaymentAmount:1.00,AcctToken:eyj...,ProfileToken:eyJ...},{PaymentMethodType:PreferredOnFile,PaymentAmount:1.00}]```Notes:  * The example shows PaymentAmount of 1.00 for both "AcctToken" and "PreferredOnFile". This is for the examplewith a total of $1.00. The firstPaymentMethod (the Gift Card) will be attempted for $1.00. If it partially approvesfor less than 1.00 (example: $0.80), the second payment method (PreferredOnFile) will be attempted for the lesser ofit's PaymentAmount and the remaining amount (example: $0.20).* Because this endpoint creates a new user, the "PreferredOnFile" option is not applicable. Also, ProfileToken withthe OwnerType "TempstUser" is required because the Payment Profile owner will be converted to the newly created user.* When using Query String (or this web site), this value must be encoded with JSV [(JSON-like Separated Values)](https://docs.servicestack.net/jsv-format).Basic steps to convert JSON to JSV: 1) Remove properties that are null, 2) Remove white space including line feeds, 3) Remove quotes.
    """


    restricted_id: Optional[int] = None
    restricted_resource_type: Optional[RestrictedResourceType] = None
    # @ApiMember(Description="\r\n**Deprecated** (Use `PaymentMethods` with `ProfileToken`)  \r\n\r\nAcctToken provided by creating a Payment Profile with the Vault Api. Required if Package requires purchase and PaymentMethods is empty.")
    acct_token: Optional[str] = None
    """
    **Deprecated** (Use `PaymentMethods` with `ProfileToken`)  AcctToken provided by creating a Payment Profile with the Vault Api. Required if Package requires purchase and PaymentMethods is empty.
    """


    # @ApiMember(Description="\r\n**Deprecated** (Use `PaymentMethods` with `ProfileToken`)  \r\n\r\nLast 4 digits of the Payment Profile. Required with AcctToken.")
    last4: Optional[str] = None
    """
    **Deprecated** (Use `PaymentMethods` with `ProfileToken`)  Last 4 digits of the Payment Profile. Required with AcctToken.
    """


    # @ApiMember(Description="\r\n**Deprecated** (Use `PaymentMethods` with `ProfileToken`)  \r\n\r\n2 digit expiration month. **Required with AcctToken for Credit Card.**")
    exp_month: Optional[int] = None
    """
    **Deprecated** (Use `PaymentMethods` with `ProfileToken`)  2 digit expiration month. **Required with AcctToken for Credit Card.**
    """


    # @ApiMember(Description="\r\n**Deprecated** (Use `PaymentMethods` with `ProfileToken`)  \r\n\r\n2 digit expiration year. **Required with AcctToken for Credit Card.**")
    exp_year: Optional[int] = None
    """
    **Deprecated** (Use `PaymentMethods` with `ProfileToken`)  2 digit expiration year. **Required with AcctToken for Credit Card.**
    """


    # @ApiMember(Description="\r\n**Deprecated** (Use `PaymentMethods` with `ProfileToken`)  \r\n\r\nThe Account Type the Payment Profile\r\n\r\n<details>\r\n<summary>Common Values</summary>\r\n<table>\r\n    <thead>\r\n        <tr><th>Text</th><th>Numerical</th><th>Account Type</th></tr>\r\n    </thead>\r\n    <tbody>\r\n        <tr><td>VISA</td><td>1</td><td>Visa</td></tr>\r\n        <tr><td>MC</td><td>2</td><td>MasterCard</td></tr>\r\n        <tr><td>Disc</td><td>3</td><td>Discover</td></tr>\r\n        <tr><td>Amex</td><td>4</td><td>American Express</td></tr>\r\n        <tr><td>PC</td><td>11</td><td>Personal Checking</td></tr>\r\n        <tr><td>PS</td><td>12</td><td>Personal Savings</td></tr>\r\n        <tr><td>BC</td><td>13</td><td>Business Checking</td></tr>\r\n    </tbody>\r\n</table>\r\n<p>You may use the Text or the Numerical value.</p>\r\n</details>")
    acct_type: Optional[AcctType] = None
    """
    **Deprecated** (Use `PaymentMethods` with `ProfileToken`)  The Account Type the Payment Profile<details><summary>Common Values</summary><table>    <thead>        <tr><th>Text</th><th>Numerical</th><th>Account Type</th></tr>    </thead>    <tbody>        <tr><td>VISA</td><td>1</td><td>Visa</td></tr>        <tr><td>MC</td><td>2</td><td>MasterCard</td></tr>        <tr><td>Disc</td><td>3</td><td>Discover</td></tr>        <tr><td>Amex</td><td>4</td><td>American Express</td></tr>        <tr><td>PC</td><td>11</td><td>Personal Checking</td></tr>        <tr><td>PS</td><td>12</td><td>Personal Savings</td></tr>        <tr><td>BC</td><td>13</td><td>Business Checking</td></tr>    </tbody></table><p>You may use the Text or the Numerical value.</p></details>
    """


    # @ApiMember(Description="\r\n**Deprecated** (Use `PaymentMethods` with `ProfileToken`)  \r\n\r\nBank Routing Number. **Required with AcctToken for Bank Accounts.**")
    bnk_route: Optional[int] = None
    """
    **Deprecated** (Use `PaymentMethods` with `ProfileToken`)  Bank Routing Number. **Required with AcctToken for Bank Accounts.**
    """


    # @ApiMember(Description="\r\n**Deprecated** (Use `PaymentMethods` with `ProfileToken`)  \r\n\r\nWhether the Payment Profile is Temporary. (One time transactions and Gift Cards are IsTemp = True).")
    is_temp: bool = False
    """
    **Deprecated** (Use `PaymentMethods` with `ProfileToken`)  Whether the Payment Profile is Temporary. (One time transactions and Gift Cards are IsTemp = True).
    """

Python SellContractAndSetupClientRequest DTOs

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

HTTP + JSV

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

POST /sales/contract/sold/new/user HTTP/1.1 
Host: clubready.com 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	ApiKey: String,
	ChainId: 0,
	StoreId: 0,
	PackageId: 0,
	InstallmentPlanId: 0,
	PaymentAmount: 0,
	StartDate: 0001-01-01,
	FirstName: String,
	LastName: String,
	Email: String,
	Gender: String,
	Address: String,
	City: String,
	State: String,
	Zip: String,
	Phone: String,
	WorkPhone: String,
	DateOfBirth: 0001-01-01,
	CellPhone: String,
	Note: String,
	ExternalId: String,
	PromoCode: String,
	Username: String,
	ReferralTypeId: 0,
	EmergencyContactName: String,
	EmergencyContactPhone: String,
	EmergencyContactType: String,
	PaymentMethods: 
	[
		{
			AcctToken: String,
			ProfileToken: String,
			PaymentProfileId: String,
			PaymentAmount: 0,
			PaymentMethodType: Uninitialized,
			DoNotUpdatePaymentTypePreference: False
		}
	],
	RestrictedId: 0,
	RestrictedResourceType: Chain,
	AuthToken: String,
	AcctToken: String,
	Last4: String,
	ExpMonth: 0,
	ExpYear: 0,
	AcctType: Uninitialized,
	CardType: 0,
	BnkRoute: 0,
	IsTemp: False
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	
}