POST | /sales/contract/sold | Sell a package to an existing user | Sell a package to an existing user. The PaymentMethods property is an array of objects describing how you want ClubReady to take payment while selling the PackageId/InstallmentPlanId. If omitted (or null), the preferred on-file profile will be used.* When using Query String values (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. |
---|
import java.math.*;
import java.util.*;
import net.servicestack.client.*;
public class dtos
{
@ApiResponse(Description="", ResponseType=ContractSoldResponse.class, StatusCode=200)
public static class ContractSoldEndpoint implements IContractSoldEndpoint, IRestrictedApiRequest
{
/**
* IP address of the end user
*/
@ApiMember(Description="IP address of the end user", Name="X-Forwarded-For", ParameterType="header")
public String XForwardedFor = null;
/**
* Api Authentication Key
*/
@ApiMember(Description="Api Authentication Key", IsRequired=true, ParameterType="query")
public String ApiKey = null;
/**
* Member Id of the user buying the Package
*/
@ApiMember(Description="Member Id of the user buying the Package", IsRequired=true, ParameterType="query")
public Integer MemberId = null;
/**
* Id for the chain of the Api Key
*/
@ApiMember(Description="Id for the chain of the Api Key")
public Integer ChainId = null;
/**
* Id of the store for the user
*/
@ApiMember(Description="Id of the store for the user", IsRequired=true)
public Integer StoreId = null;
/**
* Package Id number of the package being purchased
*/
@ApiMember(Description="Package Id number of the package being purchased", IsRequired=true)
public Integer PackageId = null;
/**
* Installment Plan Id being purchased. If empty, the default package will be selected.
*/
@ApiMember(Description="Installment Plan Id being purchased. If empty, the default package will be selected.")
public Integer InstallmentId = null;
/**
* Date contract takes affect
*/
@ApiMember(Description="Date contract takes affect")
public Date StartDate = null;
/**
* Amount being paid down, including tax
*/
@ApiMember(Description="Amount being paid down, including tax", IsRequired=true)
public BigDecimal PaymentAmount = null;
/**
* Promo code to apply a discount.
*/
@ApiMember(Description="Promo code to apply a discount.")
public String PromoCode = null;
/**
* Staff Id of salesperson who sold the agreement.
*/
@ApiMember(Description="Staff Id of salesperson who sold the agreement.")
public Integer StaffId = null;
/**
* An array of PaymentMethod objects to be used for this purchase. A null array (or omitted property) will use thePreferred method for the total amount.Each object of the array may contain properties:| Property | Description || --- | --- || PaymentAmount | The maximum amount to be attempted for this PaymentMethod. When null or omitted, the remaining PaymentAmount will be attempted. || **Use only one of the following three** | **UsePreferred** or **AcctToken** or **ProfileToken [DoNotUpdatePaymentTypePreference]** || UsePreferred | Set to `true` to use the Preferred method, otherwise omit the value or set to `null` or `false` || AcctToken | The AcctToken to attempt payment || ProfileToken | When provided, a PaymentMethod will be created (this will prevent the requirement to call `/sales/paymentprofile/import`) || DoNotUpdatePaymentTypePreference | [Optional] When creating a PaymentMethod (ProfileToken), it is set as the preferred method. To not create as preferred, set `DoNotUpdatePaymentTypePreference` to `true`. (for more information, see `/sales/paymentprofile/import`) || | |Only one of `UsePreferred`, `AcctToken`, `ProfileToken` or is needed. `DoNotUpdatePaymentTypePreference` is optionaland only valid with `ProfileToken`.* Scenario #1: Sell $3 contract using an existing PaymentMethod (i.e. AcctToken) for $1 and the Preferred method for $2.JSON:```json{ ... "PaymentAmount": 3.00, "PaymentMethods": [ { "PaymentAmount": "1.00", "AcctToken": "eyJ..." }, { "PaymentAmount": "2.00", "UsePreferred": true } ]}```JSV:```...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,AcctToken:eyJ...NdQ},{PaymentAmount:2.00,UsePreferred:true}]```* Scenario #2: Sell $3 contract using a new PaymentMethod (i.e. ProfileToken) for $1 and the Preferred method for the remaining.Note, the sum of the PaymentMethod's PaymentAmount ($4) is greater than the agreement amount ($3). PaymentAmount is the maximum amount.This allows the first PaymentMethod to decline or partially approve (common with gift cards). Therefore, if the first PaymentMethod approvesfor $0.75, the second will be attempted for $2.25.JSON:```json{ ... "PaymentAmount": 3.00, "PaymentMethods": [ { "PaymentAmount": "1.00", "ProfileToken": "eyJ..." }, { "PaymentAmount": "3.00", "UsePreferred": true } ]}```JSV:```jsv...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,ProfileToken:eyj...NdQ},{PaymentAmount:3.00,UsePreferred:true}]```Notes: * AcctTokens should not be parsed or persisted in the client application. They are currently jsonbased, but can be updated without notice.* ProfileToken is used to create a PaymentMethod in the ClubReady system. For more information, see `/sales/paymentprofile/import`.* If `PaymentMethods` is missing or `null`, the Preferred method will be used.* If a `PaymentMethods` `PaymentAmount` is not specified, the remaining amount will be attempted.* If a PaymentMethod is partially approved (common for gift cards), the PaymentMethod with anunspecified PaymentAmount will be charged the remaining amount, including the unapproved amount not.* When testing with this website, the PaymentMethods textbox needs JSV and only the square brackets and contents(e.g. `[{PaymentAmount:1.00,UsePreferred:true}]`).
*/
@ApiMember(Description="An array of PaymentMethod objects to be used for this purchase. A null array (or omitted property) will use the\r\nPreferred method for the total amount.\r\n\r\nEach object of the array may contain properties:\r\n\r\n| Property | Description |\r\n| --- | --- |\r\n| PaymentAmount | The maximum amount to be attempted for this PaymentMethod. When null or omitted, the remaining PaymentAmount will be attempted. |\r\n| **Use only one of the following three** | **UsePreferred** or **AcctToken** or **ProfileToken [DoNotUpdatePaymentTypePreference]** |\r\n| UsePreferred | Set to `true` to use the Preferred method, otherwise omit the value or set to `null` or `false` |\r\n| AcctToken | The AcctToken to attempt payment |\r\n| ProfileToken | When provided, a PaymentMethod will be created (this will prevent the requirement to call `/sales/paymentprofile/import`) |\r\n| DoNotUpdatePaymentTypePreference | [Optional] When creating a PaymentMethod (ProfileToken), it is set as the preferred method. To not create as preferred, set `DoNotUpdatePaymentTypePreference` to `true`. (for more information, see `/sales/paymentprofile/import`) |\r\n| | |\r\n\r\nOnly one of `UsePreferred`, `AcctToken`, `ProfileToken` or is needed. `DoNotUpdatePaymentTypePreference` is optional\r\nand only valid with `ProfileToken`.\r\n\r\n* Scenario #1: Sell $3 contract using an existing PaymentMethod (i.e. AcctToken) for $1 and the Preferred method for $2.\r\n\r\nJSON:\r\n```json\r\n{\r\n ...\r\n \"PaymentAmount\": 3.00,\r\n \"PaymentMethods\": [\r\n {\r\n \"PaymentAmount\": \"1.00\",\r\n \"AcctToken\": \"eyJ...\"\r\n },\r\n {\r\n \"PaymentAmount\": \"2.00\",\r\n \"UsePreferred\": true\r\n }\r\n ]\r\n}\r\n```\r\nJSV:\r\n```\r\n...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,AcctToken:eyJ...NdQ},{PaymentAmount:2.00,UsePreferred:true}]\r\n```\r\n\r\n* Scenario #2: Sell $3 contract using a new PaymentMethod (i.e. ProfileToken) for $1 and the Preferred method for the remaining.\r\nNote, the sum of the PaymentMethod's PaymentAmount ($4) is greater than the agreement amount ($3). PaymentAmount is the maximum amount.\r\nThis allows the first PaymentMethod to decline or partially approve (common with gift cards). Therefore, if the first PaymentMethod approves\r\nfor $0.75, the second will be attempted for $2.25.\r\n\r\nJSON:\r\n```json\r\n{ \r\n ...\r\n \"PaymentAmount\": 3.00,\r\n \"PaymentMethods\": [\r\n {\r\n \"PaymentAmount\": \"1.00\",\r\n \"ProfileToken\": \"eyJ...\"\r\n },\r\n {\r\n \"PaymentAmount\": \"3.00\",\r\n \"UsePreferred\": true\r\n }\r\n ]\r\n}\r\n```\r\nJSV:\r\n```jsv\r\n...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,ProfileToken:eyj...NdQ},{PaymentAmount:3.00,UsePreferred:true}]\r\n```\r\n\r\nNotes: \r\n\r\n* AcctTokens should not be parsed or persisted in the client application. They are currently json\r\nbased, but can be updated without notice.\r\n\r\n* ProfileToken is used to create a PaymentMethod in the ClubReady system. For more information, \r\nsee `/sales/paymentprofile/import`.\r\n\r\n* If `PaymentMethods` is missing or `null`, the Preferred method will be used.\r\n\r\n* If a `PaymentMethods` `PaymentAmount` is not specified, the remaining amount will be attempted.\r\n\r\n* If a PaymentMethod is partially approved (common for gift cards), the PaymentMethod with an\r\nunspecified PaymentAmount will be charged the remaining amount, including the unapproved amount not.\r\n\r\n* When testing with this website, the PaymentMethods textbox needs JSV and only the square brackets and contents\r\n(e.g. `[{PaymentAmount:1.00,UsePreferred:true}]`).")
public ArrayList<PaymentMethodDto> PaymentMethods = null;
public Integer RestrictedId = null;
public RestrictedResourceType RestrictedResourceType = null;
public String getXForwardedFor() { return XForwardedFor; }
public ContractSoldEndpoint setXForwardedFor(String value) { this.XForwardedFor = value; return this; }
public String getApiKey() { return ApiKey; }
public ContractSoldEndpoint setApiKey(String value) { this.ApiKey = value; return this; }
public Integer getMemberId() { return MemberId; }
public ContractSoldEndpoint setMemberId(Integer value) { this.MemberId = value; return this; }
public Integer getChainId() { return ChainId; }
public ContractSoldEndpoint setChainId(Integer value) { this.ChainId = value; return this; }
public Integer getStoreId() { return StoreId; }
public ContractSoldEndpoint setStoreId(Integer value) { this.StoreId = value; return this; }
public Integer getPackageId() { return PackageId; }
public ContractSoldEndpoint setPackageId(Integer value) { this.PackageId = value; return this; }
public Integer getInstallmentId() { return InstallmentId; }
public ContractSoldEndpoint setInstallmentId(Integer value) { this.InstallmentId = value; return this; }
public Date getStartDate() { return StartDate; }
public ContractSoldEndpoint setStartDate(Date value) { this.StartDate = value; return this; }
public BigDecimal getPaymentAmount() { return PaymentAmount; }
public ContractSoldEndpoint setPaymentAmount(BigDecimal value) { this.PaymentAmount = value; return this; }
public String getPromoCode() { return PromoCode; }
public ContractSoldEndpoint setPromoCode(String value) { this.PromoCode = value; return this; }
public Integer getStaffId() { return StaffId; }
public ContractSoldEndpoint setStaffId(Integer value) { this.StaffId = value; return this; }
public ArrayList<PaymentMethodDto> getPaymentMethods() { return PaymentMethods; }
public ContractSoldEndpoint setPaymentMethods(ArrayList<PaymentMethodDto> value) { this.PaymentMethods = value; return this; }
public Integer getRestrictedId() { return RestrictedId; }
public ContractSoldEndpoint setRestrictedId(Integer value) { this.RestrictedId = value; return this; }
public RestrictedResourceType getRestrictedResourceType() { return RestrictedResourceType; }
public ContractSoldEndpoint setRestrictedResourceType(RestrictedResourceType value) { this.RestrictedResourceType = value; return this; }
}
@DataContract
public static class PaymentMethodDto
{
@DataMember
public String AcctToken = null;
@DataMember
public String ProfileToken = null;
@DataMember
public String PaymentProfileId = null;
@DataMember
public BigDecimal PaymentAmount = null;
@DataMember
public Boolean UsePreferred = null;
@DataMember
public Boolean DoNotUpdatePaymentTypePreference = null;
public String getAcctToken() { return AcctToken; }
public PaymentMethodDto setAcctToken(String value) { this.AcctToken = value; return this; }
public String getProfileToken() { return ProfileToken; }
public PaymentMethodDto setProfileToken(String value) { this.ProfileToken = value; return this; }
public String getPaymentProfileId() { return PaymentProfileId; }
public PaymentMethodDto setPaymentProfileId(String value) { this.PaymentProfileId = value; return this; }
public BigDecimal getPaymentAmount() { return PaymentAmount; }
public PaymentMethodDto setPaymentAmount(BigDecimal value) { this.PaymentAmount = value; return this; }
public Boolean isUsePreferred() { return UsePreferred; }
public PaymentMethodDto setUsePreferred(Boolean value) { this.UsePreferred = value; return this; }
public Boolean isDoNotUpdatePaymentTypePreference() { return DoNotUpdatePaymentTypePreference; }
public PaymentMethodDto setDoNotUpdatePaymentTypePreference(Boolean value) { this.DoNotUpdatePaymentTypePreference = value; return this; }
}
public static enum RestrictedResourceType
{
Store,
Chain,
User,
Undefined;
}
public static class ContractSoldResponse
{
public String ContractSaleID = null;
public String description = null;
public Boolean Success = null;
public IReadOnlyList<PendingPaymentResponse> PaymentResponses = null;
public String getContractSaleID() { return ContractSaleID; }
public ContractSoldResponse setContractSaleID(String value) { this.ContractSaleID = value; return this; }
public String getDescription() { return description; }
public ContractSoldResponse setDescription(String value) { this.description = value; return this; }
public Boolean isSuccess() { return Success; }
public ContractSoldResponse setSuccess(Boolean value) { this.Success = value; return this; }
public IReadOnlyList<PendingPaymentResponse> getPaymentResponses() { return PaymentResponses; }
public ContractSoldResponse setPaymentResponses(IReadOnlyList<PendingPaymentResponse> value) { this.PaymentResponses = value; return this; }
}
public static class PendingPaymentResponse
{
public String ResponseTransactionId = null;
public String ResponseTxnId = null;
public ResponseStatus ResponseStatus = null;
public BigDecimal ResponseAmount = null;
public String ResponseText = null;
public String Last4 = null;
public String AcctClass = null;
public String AcctType = null;
public String AcctToken = null;
public String getResponseTransactionId() { return ResponseTransactionId; }
public PendingPaymentResponse setResponseTransactionId(String value) { this.ResponseTransactionId = value; return this; }
public String getResponseTxnId() { return ResponseTxnId; }
public PendingPaymentResponse setResponseTxnId(String value) { this.ResponseTxnId = value; return this; }
public ResponseStatus getResponseStatus() { return ResponseStatus; }
public PendingPaymentResponse setResponseStatus(ResponseStatus value) { this.ResponseStatus = value; return this; }
public BigDecimal getResponseAmount() { return ResponseAmount; }
public PendingPaymentResponse setResponseAmount(BigDecimal value) { this.ResponseAmount = value; return this; }
public String getResponseText() { return ResponseText; }
public PendingPaymentResponse setResponseText(String value) { this.ResponseText = value; return this; }
public String getLast4() { return Last4; }
public PendingPaymentResponse setLast4(String value) { this.Last4 = value; return this; }
public String getAcctClass() { return AcctClass; }
public PendingPaymentResponse setAcctClass(String value) { this.AcctClass = value; return this; }
public String getAcctType() { return AcctType; }
public PendingPaymentResponse setAcctType(String value) { this.AcctType = value; return this; }
public String getAcctToken() { return AcctToken; }
public PendingPaymentResponse setAcctToken(String value) { this.AcctToken = value; return this; }
}
}
Java ContractSoldEndpoint DTOs
To override the Content-type in your clients, use the HTTP Accept Header, append the .json suffix or ?format=json
To embed the response in a jsonp callback, append ?callback=myCallback
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
POST /sales/contract/sold HTTP/1.1
Host: www.clubready.com
Accept: application/json
Content-Type: application/json
Content-Length: length
{"XForwardedFor":"String","ApiKey":"String","MemberId":0,"ChainId":0,"StoreId":0,"PackageId":0,"InstallmentId":0,"StartDate":"0001-01-01T00:00:00.0000000","PaymentAmount":0,"PromoCode":"String","StaffId":0,"PaymentMethods":[{"AcctToken":"String","ProfileToken":"String","PaymentProfileId":"String","PaymentAmount":0,"UsePreferred":false,"DoNotUpdatePaymentTypePreference":false}],"RestrictedId":0,"RestrictedResourceType":"Chain"}
HTTP/1.1 200 OK Content-Type: application/json Content-Length: length {"ContractSaleID":"String","description":"String","Success":false}