github.com/schmorrison/Zoho@v1.1.4/subscriptions/subscriptions.go (about) 1 package subscriptions 2 3 import ( 4 "fmt" 5 "strconv" 6 7 zoho "github.com/schmorrison/Zoho" 8 ) 9 10 type SubscriptionStatus string 11 12 // Proper names for Subscription statuses 13 const ( 14 SubscriptionStatusAll SubscriptionStatus = "SubscriptionStatus.All" 15 SubscriptionStatusActive SubscriptionStatus = "SubscriptionStatus.ACTIVE" 16 SubscriptionStatusLive SubscriptionStatus = "SubscriptionStatus.LIVE" 17 SubscriptionStatusFuture SubscriptionStatus = "SubscriptionStatus.FUTURE" 18 SubscriptionStatusTrial SubscriptionStatus = "SubscriptionStatus.TRIAL" 19 SubscriptionStatusPastDue SubscriptionStatus = "SubscriptionStatus.PAST_DUE" 20 SubscriptionStatusUnpaid SubscriptionStatus = "SubscriptionStatus.UNPAID" 21 SubscriptionStatusNonRenewing SubscriptionStatus = "SubscriptionStatus.NON_RENEWING" 22 SubscriptionStatusCancelledFromDunning SubscriptionStatus = "SubscriptionStatus.CANCELLED_FROM_DUNNING" 23 SubscriptionStatusCancelled SubscriptionStatus = "SubscriptionStatus.CANCELLED" 24 SubscriptionStatusExpired SubscriptionStatus = "SubscriptionStatus.EXPIRED" 25 SubscriptionStatusTrialExpired SubscriptionStatus = "SubscriptionStatus.TRIAL_EXPIRED" 26 SubscriptionStatusCancelledLastMonth SubscriptionStatus = "SubscriptionStatus.CANCELLED_LAST_MONTH" 27 SubscriptionStatusCancelledThisMonth SubscriptionStatus = "SubscriptionStatus.CANCELLED_THIS_MONTH" 28 29 SubscriptionModeOnline SubscriptionStatus = "SubscriptionMode.ONLINE" 30 SubscriptionModeOffline SubscriptionStatus = "SubscriptionMode.OFFLINE" 31 ) 32 33 // ListSubscriptions will return the list of subscriptions that match the given subscription status. 34 // https://www.zoho.com/subscriptions/api/v1/#Subscriptions_List_all_subscriptions 35 func (s *API) ListSubscriptions(status SubscriptionStatus) (data SubscriptionsResponse, err error) { 36 if status == "" { 37 status = SubscriptionStatusAll 38 } 39 endpoint := zoho.Endpoint{ 40 Name: "subscriptions", 41 URL: fmt.Sprintf("https://subscriptions.zoho.%s/api/v1/subscriptions", s.ZohoTLD), 42 Method: zoho.HTTPGet, 43 ResponseData: &SubscriptionsResponse{}, 44 URLParameters: map[string]zoho.Parameter{ 45 "filter_by": zoho.Parameter(status), 46 }, 47 Headers: map[string]string{ 48 ZohoSubscriptionsEndpointHeader: s.OrganizationID, 49 }, 50 } 51 52 err = s.Zoho.HTTPRequest(&endpoint) 53 if err != nil { 54 return SubscriptionsResponse{}, fmt.Errorf("Failed to retrieve subscriptions: %s", err) 55 } 56 57 if v, ok := endpoint.ResponseData.(*SubscriptionsResponse); ok { 58 return *v, nil 59 } 60 61 return SubscriptionsResponse{}, fmt.Errorf("Data retrieved was not 'SubscriptionsResponse'") 62 } 63 64 // GetSubscription will return the subscription specified by id 65 // https://www.zoho.com/subscriptions/api/v1/#Subscriptions_Retrieve_a_subscription 66 func (s *API) GetSubscription(id string) (data SubscriptionResponse, err error) { 67 endpoint := zoho.Endpoint{ 68 Name: "subscriptions", 69 URL: fmt.Sprintf( 70 "https://subscriptions.zoho.%s/api/v1/subscriptions/%s", 71 s.ZohoTLD, 72 id, 73 ), 74 Method: zoho.HTTPGet, 75 ResponseData: &SubscriptionResponse{}, 76 Headers: map[string]string{ 77 ZohoSubscriptionsEndpointHeader: s.OrganizationID, 78 }, 79 } 80 81 err = s.Zoho.HTTPRequest(&endpoint) 82 if err != nil { 83 return SubscriptionResponse{}, fmt.Errorf( 84 "Failed to retrieve subscription (%s): %s", 85 id, 86 err, 87 ) 88 } 89 90 if v, ok := endpoint.ResponseData.(*SubscriptionResponse); ok { 91 return *v, nil 92 } 93 94 return SubscriptionResponse{}, fmt.Errorf("Data retrieved was not 'SubscriptionResponse'") 95 } 96 97 // CreateSubscription creates new subscription 98 // https://www.zoho.com/subscriptions/api/v1/#Subscriptions_Create_a_subscription 99 func (s *API) CreateSubscription( 100 request SubscriptionCreate, 101 ) (data SubscriptionResponse, err error) { 102 if request.CustomerID == "" { 103 if request.Customer.DisplayName == "" || request.Customer.Email == "" { 104 err = fmt.Errorf( 105 "CustomerID is a required field if subscription is created for existen customer. For new customer Customer.DisplayName and Customer.Email fields are required", 106 ) 107 return 108 } 109 } 110 111 endpoint := zoho.Endpoint{ 112 Name: "subscriptions", 113 URL: fmt.Sprintf("https://subscriptions.zoho.%s/api/v1/subscriptions", s.ZohoTLD), 114 Method: zoho.HTTPPost, 115 ResponseData: &SubscriptionResponse{}, 116 RequestBody: request, 117 Headers: map[string]string{ 118 ZohoSubscriptionsEndpointHeader: s.OrganizationID, 119 }, 120 } 121 122 err = s.Zoho.HTTPRequest(&endpoint) 123 if err != nil { 124 return SubscriptionResponse{}, fmt.Errorf("Failed to create subscription: %s", err) 125 } 126 127 if v, ok := endpoint.ResponseData.(*SubscriptionResponse); ok { 128 return *v, nil 129 } 130 131 return SubscriptionResponse{}, fmt.Errorf("Data returned was nil") 132 } 133 134 // UpdateSubscription will modify subscription by the data provided to request 135 // https://www.zoho.com/subscriptions/api/v1/#Subscriptions_Update_a_subscription 136 func (s *API) UpdateSubscription( 137 request SubscriptionUpdate, 138 ID string, 139 ) (data SubscriptionResponse, err error) { 140 if request.Plan.PlanCode == "" { 141 return SubscriptionResponse{}, fmt.Errorf("Plan.PlanCode is a required field") 142 } 143 144 endpoint := zoho.Endpoint{ 145 Name: "subscriptions", 146 URL: fmt.Sprintf( 147 "https://subscriptions.zoho.%s/api/v1/subscriptions/%s", 148 s.ZohoTLD, 149 ID, 150 ), 151 Method: zoho.HTTPPut, 152 ResponseData: &SubscriptionResponse{}, 153 RequestBody: request, 154 Headers: map[string]string{ 155 ZohoSubscriptionsEndpointHeader: s.OrganizationID, 156 }, 157 } 158 159 err = s.Zoho.HTTPRequest(&endpoint) 160 if err != nil { 161 return SubscriptionResponse{}, fmt.Errorf("Failed to update subscription: %s", err) 162 } 163 164 if v, ok := endpoint.ResponseData.(*SubscriptionResponse); ok { 165 return *v, nil 166 } 167 168 return SubscriptionResponse{}, fmt.Errorf("Data returned was nil") 169 } 170 171 // CancelSubscription will cancel subscription by id 172 // https://www.zoho.com/subscriptions/api/v1/#Subscriptions_Cancel_a_subscription 173 func (s *API) CancelSubscription( 174 ID string, 175 cancelAtEnd bool, 176 ) (data SubscriptionCancelResponse, err error) { 177 endpoint := zoho.Endpoint{ 178 Name: "subscriptions", 179 URL: fmt.Sprintf( 180 "https://subscriptions.zoho.%s/api/v1/subscriptions/%s/cancel", 181 s.ZohoTLD, 182 ID, 183 ), 184 Method: zoho.HTTPPost, 185 ResponseData: &SubscriptionCancelResponse{}, 186 URLParameters: map[string]zoho.Parameter{ 187 "cancel_at_end": zoho.Parameter(strconv.FormatBool(cancelAtEnd)), 188 }, 189 Headers: map[string]string{ 190 ZohoSubscriptionsEndpointHeader: s.OrganizationID, 191 }, 192 } 193 194 err = s.Zoho.HTTPRequest(&endpoint) 195 if err != nil { 196 return SubscriptionCancelResponse{}, fmt.Errorf( 197 "Failed to cancel subscription %s: %s", 198 ID, 199 err, 200 ) 201 } 202 203 if v, ok := endpoint.ResponseData.(*SubscriptionCancelResponse); ok { 204 return *v, nil 205 } 206 207 return SubscriptionCancelResponse{}, fmt.Errorf("Data returned was nil") 208 } 209 210 // DeleteSubscription will delete subscription by id 211 // https://www.zoho.com/subscriptions/api/v1/#Subscriptions_Delete_a_subscription 212 func (s *API) DeleteSubscription(ID string) (data SubscriptionDeleteResponse, err error) { 213 endpoint := zoho.Endpoint{ 214 Name: "subscriptions", 215 URL: fmt.Sprintf( 216 "https://subscriptions.zoho.%s/api/v1/subscriptions/%s", 217 s.ZohoTLD, 218 ID, 219 ), 220 Method: zoho.HTTPDelete, 221 ResponseData: &SubscriptionDeleteResponse{}, 222 Headers: map[string]string{ 223 ZohoSubscriptionsEndpointHeader: s.OrganizationID, 224 }, 225 } 226 227 err = s.Zoho.HTTPRequest(&endpoint) 228 if err != nil { 229 return SubscriptionDeleteResponse{}, fmt.Errorf( 230 "Failed to delete subscription %s: %s", 231 ID, 232 err, 233 ) 234 } 235 236 if v, ok := endpoint.ResponseData.(*SubscriptionDeleteResponse); ok { 237 return *v, nil 238 } 239 240 return SubscriptionDeleteResponse{}, fmt.Errorf("Data returned was nil") 241 } 242 243 // AddChargeToSubscription charges a one-time amount for the subscription 244 // https://www.zoho.com/subscriptions/api/v1/#Subscriptions_Update_a_subscription 245 func (s *API) AddChargeToSubscription( 246 request SubscriptionAddCharge, 247 ID string, 248 ) (data AddChargeResponse, err error) { 249 endpoint := zoho.Endpoint{ 250 Name: "subscriptions", 251 URL: fmt.Sprintf( 252 "https://subscriptions.zoho.%s/api/v1/subscriptions/%s/charge", 253 s.ZohoTLD, 254 ID, 255 ), 256 Method: zoho.HTTPPost, 257 ResponseData: &AddChargeResponse{}, 258 RequestBody: request, 259 Headers: map[string]string{ 260 ZohoSubscriptionsEndpointHeader: s.OrganizationID, 261 }, 262 } 263 264 err = s.Zoho.HTTPRequest(&endpoint) 265 if err != nil { 266 return AddChargeResponse{}, fmt.Errorf("Failed to charge subscription: %s", err) 267 } 268 269 if v, ok := endpoint.ResponseData.(*AddChargeResponse); ok { 270 return *v, nil 271 } 272 273 return AddChargeResponse{}, fmt.Errorf("Data returned was nil") 274 } 275 276 type AddChargeResponse struct { 277 Code int64 `json:"code"` 278 Message string `json:"message"` 279 Invoice struct { 280 AchPaymentInitiated bool `json:"ach_payment_initiated"` 281 Adjustment float64 `json:"adjustment"` 282 AdjustmentDescription string `json:"adjustment_description"` 283 AllowPartialPayments bool `json:"allow_partial_payments"` 284 ApproverID string `json:"approver_id"` 285 AutoRemindersConfigured bool `json:"auto_reminders_configured"` 286 Balance float64 `json:"balance"` 287 BcyAdjustment float64 `json:"bcy_adjustment"` 288 BcyDiscountTotal float64 `json:"bcy_discount_total"` 289 BcyShippingCharge float64 `json:"bcy_shipping_charge"` 290 BcySubTotal float64 `json:"bcy_sub_total"` 291 BcyTaxTotal float64 `json:"bcy_tax_total"` 292 BcyTotal float64 `json:"bcy_total"` 293 BillingAddress struct { 294 Address string `json:"address"` 295 Attention string `json:"attention"` 296 City string `json:"city"` 297 Country string `json:"country"` 298 Fax string `json:"fax"` 299 Phone string `json:"phone"` 300 State string `json:"state"` 301 Street string `json:"street"` 302 Street2 string `json:"street2"` 303 Zip string `json:"zip"` 304 } `json:"billing_address"` 305 CanEditItems bool `json:"can_edit_items"` 306 CanSendInMail bool `json:"can_send_in_mail"` 307 CanSendInvoiceSms bool `json:"can_send_invoice_sms"` 308 CanSkipPaymentInfo bool `json:"can_skip_payment_info"` 309 ClientViewedTime string `json:"client_viewed_time"` 310 Contactpersons []struct { 311 ContactpersonID string `json:"contactperson_id"` 312 Email string `json:"email"` 313 Mobile string `json:"mobile"` 314 Phone string `json:"phone"` 315 ZcrmContactID string `json:"zcrm_contact_id"` 316 } `json:"contactpersons"` 317 Coupons []Coupon `json:"coupons"` 318 CreatedByID string `json:"created_by_id"` 319 CreatedDate string `json:"created_date"` 320 CreatedTime string `json:"created_time"` 321 Credits []interface{} `json:"credits"` 322 CreditsApplied float64 `json:"credits_applied"` 323 CurrencyCode string `json:"currency_code"` 324 CurrencyID string `json:"currency_id"` 325 CurrencySymbol string `json:"currency_symbol"` 326 CustomFieldHash struct { 327 } `json:"custom_field_hash"` 328 CustomFields []CustomField `json:"custom_fields"` 329 CustomerCustomFieldHash struct { 330 } `json:"customer_custom_field_hash"` 331 CustomerCustomFields []CustomField `json:"customer_custom_fields"` 332 CustomerID string `json:"customer_id"` 333 CustomerName string `json:"customer_name"` 334 Date string `json:"date"` 335 DiscountPercent float64 `json:"discount_percent"` 336 DiscountTotal float64 `json:"discount_total"` 337 Documents []interface{} `json:"documents"` 338 DueDate string `json:"due_date"` 339 Email string `json:"email"` 340 ExchangeRate float64 `json:"exchange_rate"` 341 InprocessTransactionPresent bool `json:"inprocess_transaction_present"` 342 InvoiceDate string `json:"invoice_date"` 343 InvoiceID string `json:"invoice_id"` 344 InvoiceItems []struct { 345 AccountID string `json:"account_id"` 346 AccountName string `json:"account_name"` 347 Code string `json:"code"` 348 Description string `json:"description"` 349 DiscountAmount float64 `json:"discount_amount"` 350 ItemCustomFields []CustomField `json:"item_custom_fields"` 351 ItemID string `json:"item_id"` 352 ItemTotal float64 `json:"item_total"` 353 Name string `json:"name"` 354 Price float64 `json:"price"` 355 ProductID string `json:"product_id"` 356 ProductType string `json:"product_type"` 357 Quantity float64 `json:"quantity"` 358 Tags []Tag `json:"tags"` 359 TaxID string `json:"tax_id"` 360 TaxName string `json:"tax_name"` 361 TaxPercentage float64 `json:"tax_percentage"` 362 TaxType string `json:"tax_type"` 363 Unit string `json:"unit"` 364 } `json:"invoice_items"` 365 InvoiceNumber string `json:"invoice_number"` 366 InvoiceURL string `json:"invoice_url"` 367 IsInclusiveTax bool `json:"is_inclusive_tax"` 368 IsReverseChargeApplied bool `json:"is_reverse_charge_applied"` 369 IsViewedByClient bool `json:"is_viewed_by_client"` 370 LastModifiedByID string `json:"last_modified_by_id"` 371 Notes string `json:"notes"` 372 Number string `json:"number"` 373 PageWidth string `json:"page_width"` 374 PaymentExpectedDate string `json:"payment_expected_date"` 375 PaymentGateways []struct { 376 PaymentGateway string `json:"payment_gateway"` 377 } `json:"payment_gateways"` 378 PaymentMade float64 `json:"payment_made"` 379 PaymentReminderEnabled bool `json:"payment_reminder_enabled"` 380 PaymentTerms int64 `json:"payment_terms"` 381 PaymentTermsLabel string `json:"payment_terms_label"` 382 Payments []struct { 383 Amount float64 `json:"amount"` 384 AmountRefunded float64 `json:"amount_refunded"` 385 BankCharges float64 `json:"bank_charges"` 386 CardType string `json:"card_type"` 387 Date string `json:"date"` 388 Description string `json:"description"` 389 ExchangeRate float64 `json:"exchange_rate"` 390 GatewayTransactionID string `json:"gateway_transaction_id"` 391 InvoicePaymentID string `json:"invoice_payment_id"` 392 LastFourDigits string `json:"last_four_digits"` 393 PaymentID string `json:"payment_id"` 394 PaymentMode string `json:"payment_mode"` 395 ReferenceNumber string `json:"reference_number"` 396 SettlementStatus string `json:"settlement_status"` 397 } `json:"payments"` 398 PricePrecision int64 `json:"price_precision"` 399 PricebookID string `json:"pricebook_id"` 400 ReferenceID string `json:"reference_id"` 401 ReferenceNumber string `json:"reference_number"` 402 SalespersonID string `json:"salesperson_id"` 403 SalespersonName string `json:"salesperson_name"` 404 ShippingAddress struct { 405 Address string `json:"address"` 406 Attention string `json:"attention"` 407 City string `json:"city"` 408 Country string `json:"country"` 409 Fax string `json:"fax"` 410 Phone string `json:"phone"` 411 State string `json:"state"` 412 Street string `json:"street"` 413 Street2 string `json:"street2"` 414 Zip string `json:"zip"` 415 } `json:"shipping_address"` 416 ShippingCharge float64 `json:"shipping_charge"` 417 ShippingChargeExclusiveOfTax float64 `json:"shipping_charge_exclusive_of_tax"` 418 ShippingChargeExclusiveOfTaxFormatted string `json:"shipping_charge_exclusive_of_tax_formatted"` 419 ShippingChargeInclusiveOfTax float64 `json:"shipping_charge_inclusive_of_tax"` 420 ShippingChargeInclusiveOfTaxFormatted string `json:"shipping_charge_inclusive_of_tax_formatted"` 421 ShippingChargeTax string `json:"shipping_charge_tax"` 422 ShippingChargeTaxFormatted string `json:"shipping_charge_tax_formatted"` 423 ShippingChargeTaxID string `json:"shipping_charge_tax_id"` 424 ShippingChargeTaxName string `json:"shipping_charge_tax_name"` 425 ShippingChargeTaxPercentage string `json:"shipping_charge_tax_percentage"` 426 ShippingChargeTaxType string `json:"shipping_charge_tax_type"` 427 Status string `json:"status"` 428 StopReminderUntilPaymentExpectedDate bool `json:"stop_reminder_until_payment_expected_date"` 429 SubTotal float64 `json:"sub_total"` 430 SubmitterID string `json:"submitter_id"` 431 Subscriptions []struct { 432 SubscriptionID string `json:"subscription_id"` 433 } `json:"subscriptions"` 434 TaxRounding string `json:"tax_rounding"` 435 TaxTotal float64 `json:"tax_total"` 436 Taxes []interface{} `json:"taxes"` 437 TemplateID string `json:"template_id"` 438 TemplateName string `json:"template_name"` 439 TemplateType string `json:"template_type"` 440 Terms string `json:"terms"` 441 Total float64 `json:"total"` 442 TransactionType string `json:"transaction_type"` 443 UnbilledChargesID string `json:"unbilled_charges_id"` 444 UnusedCreditsReceivableAmount float64 `json:"unused_credits_receivable_amount"` 445 UpdatedTime string `json:"updated_time"` 446 VatTreatment string `json:"vat_treatment"` 447 WriteOffAmount float64 `json:"write_off_amount"` 448 ZcrmPotentialID string `json:"zcrm_potential_id"` 449 } `json:"invoice"` 450 UnbilledCharge struct { 451 Balance float64 `json:"balance"` 452 BillingAddress struct { 453 Attention string `json:"attention"` 454 City string `json:"city"` 455 Country string `json:"country"` 456 Fax string `json:"fax"` 457 Phone string `json:"phone"` 458 State string `json:"state"` 459 Street string `json:"street"` 460 Street2 string `json:"street2"` 461 Zip string `json:"zip"` 462 } `json:"billing_address"` 463 Coupons []Coupon `json:"coupons"` 464 CreatedTime string `json:"created_time"` 465 CurrencyCode string `json:"currency_code"` 466 CurrencySymbol string `json:"currency_symbol"` 467 CustomFieldHash struct { 468 } `json:"custom_field_hash"` 469 CustomFields []CustomField `json:"custom_fields"` 470 CustomerCustomFieldHash struct { 471 } `json:"customer_custom_field_hash"` 472 CustomerCustomFields []CustomField `json:"customer_custom_fields"` 473 CustomerID string `json:"customer_id"` 474 CustomerName string `json:"customer_name"` 475 Email string `json:"email"` 476 IsInclusiveTax bool `json:"is_inclusive_tax"` 477 IsOnlineSubscription bool `json:"is_online_subscription"` 478 IsReverseChargeApplied bool `json:"is_reverse_charge_applied"` 479 Number string `json:"number"` 480 PricePrecision int64 `json:"price_precision"` 481 SalespersonID string `json:"salesperson_id"` 482 SalespersonName string `json:"salesperson_name"` 483 ShippingAddress struct { 484 Attention string `json:"attention"` 485 City string `json:"city"` 486 Country string `json:"country"` 487 Fax string `json:"fax"` 488 Phone string `json:"phone"` 489 State string `json:"state"` 490 Street string `json:"street"` 491 Street2 string `json:"street2"` 492 Zip string `json:"zip"` 493 } `json:"shipping_address"` 494 Status string `json:"status"` 495 SubTotal float64 `json:"sub_total"` 496 SubscriptionID string `json:"subscription_id"` 497 TaxRounding string `json:"tax_rounding"` 498 TaxTotal float64 `json:"tax_total"` 499 Taxes []interface{} `json:"taxes"` 500 Total float64 `json:"total"` 501 TransactionType string `json:"transaction_type"` 502 UnbilledChargeDate string `json:"unbilled_charge_date"` 503 UnbilledChargeID string `json:"unbilled_charge_id"` 504 UnbilledChargeItems []struct { 505 AccountID string `json:"account_id"` 506 Code string `json:"code"` 507 Description string `json:"description"` 508 DiscountAmount float64 `json:"discount_amount"` 509 ItemTotal float64 `json:"item_total"` 510 Name string `json:"name"` 511 Price float64 `json:"price"` 512 ProductID string `json:"product_id"` 513 ProductType string `json:"product_type"` 514 Quantity float64 `json:"quantity"` 515 TaxID string `json:"tax_id"` 516 TaxName string `json:"tax_name"` 517 TaxPercentage float64 `json:"tax_percentage"` 518 TaxType string `json:"tax_type"` 519 UnbilledChargeItemID string `json:"unbilled_charge_item_id"` 520 } `json:"unbilled_charge_items"` 521 UnusedCreditsReceivableAmount float64 `json:"unused_credits_receivable_amount"` 522 UpdatedTime string `json:"updated_time"` 523 } `json:"unbilled_charge"` 524 } 525 526 type SubscriptionsResponse struct { 527 Subscriptions []Subscription `json:"subscriptions"` 528 Code int64 `json:"code"` 529 Message string `json:"message"` 530 } 531 532 type SubscriptionResponse struct { 533 Subscription Subscription `json:"subscription"` 534 Code int64 `json:"code"` 535 Message string `json:"message"` 536 } 537 538 type SubscriptionCancelResponse struct { 539 Subscription Subscription `json:"subscription"` 540 Code int64 `json:"code"` 541 Message string `json:"message"` 542 } 543 544 type SubscriptionDeleteResponse struct { 545 Code int64 `json:"code"` 546 Message string `json:"message"` 547 } 548 549 type SubscriptionCreate struct { 550 AddToUnbilledCharges bool `json:"add_to_unbilled_charges,omitempty"` 551 CustomerID string `json:"customer_id,omitempty"` 552 Customer struct { 553 DisplayName string `json:"display_name,omitempty"` 554 Salutation string `json:"salutation,omitempty"` 555 FirstName string `json:"first_name,omitempty"` 556 LastName string `json:"last_name,omitempty"` 557 Email string `json:"email,omitempty"` 558 CompanyName string `json:"company_name,omitempty"` 559 BillingAddress Address `json:"billing_address,omitempty"` 560 ShippingAddress Address `json:"shipping_address,omitempty"` 561 PaymentTerms int64 `json:"payment_terms,omitempty"` 562 PaymentTermsLabel string `json:"payment_terms_label,omitempty"` 563 CustomFields []CustomField `json:"custom_fields,omitempty"` 564 PlaceOfContact string `json:"place_of_contact,omitempty"` 565 GstNo string `json:"gst_no,omitempty"` 566 GstTreatment string `json:"gst_treatment,omitempty"` 567 VatTreatment string `json:"vat_treatment,omitempty"` 568 VatRegNo int64 `json:"vat_reg_no,omitempty"` 569 CountryCode string `json:"country_code,omitempty"` 570 IsTaxable bool `json:"is_taxable,omitempty"` 571 TaxID string `json:"tax_id,omitempty"` 572 TaxAuthorityID string `json:"tax_authority_id,omitempty"` 573 TaxAuthorityName string `json:"tax_authority_name,omitempty"` 574 TaxExemptionID string `json:"tax_exemption_id,omitempty"` 575 TaxExemptionCode string `json:"tax_exemption_code,omitempty"` 576 } `json:"customer,omitempty"` 577 PaymentTerms int64 `json:"payment_terms,omitempty"` 578 PaymentTermsLabel string `json:"payment_terms_label,omitempty"` 579 CustomFields []CustomField `json:"custom_fields,omitempty"` 580 Contactpersons []struct { 581 ContactpersonID string `json:"contactperson_id,omitempty"` 582 } `json:"contactpersons,omitempty"` 583 StartsAt string `json:"starts_at,omitempty"` 584 ExchangeRate int64 `json:"exchange_rate,omitempty"` 585 PlaceOfSupply string `json:"place_of_supply,omitempty"` 586 Plan struct { 587 PlanCode string `json:"plan_code,omitempty"` 588 PlanDescription string `json:"plan_description,omitempty"` 589 Price float64 `json:"price,omitempty"` 590 SetupFee float64 `json:"setup_fee,omitempty"` 591 SetupFeeTaxID string `json:"setup_fee_tax_id,omitempty"` 592 Tags []Tag `json:"tags,omitempty"` 593 ItemCustomFields []CustomField `json:"item_custom_fields,omitempty"` 594 Quantity float64 `json:"quantity,omitempty"` 595 TaxExemptionID string `json:"tax_exemption_id,omitempty"` 596 TaxExemptionCode string `json:"tax_exemption_code,omitempty"` 597 SetupFeeTaxExemptionID string `json:"setup_fee_tax_exemption_id,omitempty"` 598 SetupFeeTaxExemptionCode string `json:"setup_fee_tax_exemption_code,omitempty"` 599 ExcludeTrial bool `json:"exclude_trial,omitempty"` 600 ExcludeSetupFee bool `json:"exclude_setup_fee,omitempty"` 601 BillingCycles int64 `json:"billing_cycles,omitempty"` 602 TrialDays int64 `json:"trial_days,omitempty"` 603 } `json:"plan,omitempty"` 604 Addons []struct { 605 AddonCode string `json:"addon_code,omitempty"` 606 AddonDescription string `json:"addon_description,omitempty"` 607 Price float64 `json:"price,omitempty"` 608 Tags []Tag `json:"tags,omitempty"` 609 ItemCustomFields []CustomField `json:"item_custom_fields,omitempty"` 610 TaxExemptionID string `json:"tax_exemption_id,omitempty"` 611 TaxExemptionCode string `json:"tax_exemption_code,omitempty"` 612 } `json:"addons,omitempty"` 613 CouponCode string `json:"coupon_code,omitempty"` 614 AutoCollect bool `json:"auto_collect,omitempty"` 615 ReferenceID string `json:"reference_id,omitempty"` 616 SalespersonName string `json:"salesperson_name,omitempty"` 617 PaymentGateways []PaymentGateway `json:"payment_gateways,omitempty"` 618 CreateBackdatedInvoice bool `json:"create_backdated_invoice,omitempty"` 619 TemplateID int64 `json:"template_id,omitempty"` 620 } 621 622 type SubscriptionUpdate struct { 623 ExchangeRate float64 `json:"exchange_rate,omitempty,omitempty"` 624 Plan struct { 625 PlanCode string `json:"plan_code,omitempty"` 626 PlanDescription string `json:"plan_description,omitempty"` 627 Price float64 `json:"price,omitempty"` 628 SetupFee float64 `json:"setup_fee,omitempty"` 629 Quantity float64 `json:"quantity,omitempty"` 630 Tags []Tag `json:"tags,omitempty"` 631 ItemCustomFields []CustomField `json:"item_custom_fields,omitempty"` 632 TaxID string `json:"tax_id,omitempty"` 633 TaxExemptionID string `json:"tax_exemption_id,omitempty"` 634 TaxExemptionCode string `json:"tax_exemption_code,omitempty"` 635 SetupFeeTaxExemptionID string `json:"setup_fee_tax_exemption_id,omitempty"` 636 SetupFeeTaxExemptionCode string `json:"setup_fee_tax_exemption_code,omitempty"` 637 ExcludeTrial bool `json:"exclude_trial,omitempty"` 638 ExcludeSetupFee bool `json:"exclude_setup_fee,omitempty"` 639 BillingCycles int64 `json:"billing_cycles,omitempty"` 640 TrialDays int64 `json:"trial_days,omitempty"` 641 } `json:"plan,omitempty"` 642 Addons []struct { 643 AddonCode string `json:"addon_code,omitempty"` 644 AddonDescription string `json:"addon_description,omitempty"` 645 Price float64 `json:"price,omitempty"` 646 Tags []Tag `json:"tags,omitempty"` 647 ItemCustomFields []CustomField `json:"item_custom_fields,omitempty"` 648 TaxExemptionID string `json:"tax_exemption_id,omitempty"` 649 TaxExemptionCode string `json:"tax_exemption_code,omitempty"` 650 } `json:"addons,omitempty"` 651 AutoCollect bool `json:"auto_collect,omitempty"` 652 CouponCode string `json:"coupon_code,omitempty"` 653 ReferenceID string `json:"reference_id,omitempty"` 654 SalespersonID string `json:"salesperson_id,omitempty"` 655 SalespersonName string `json:"salesperson_name,omitempty"` 656 EndOfTerm bool `json:"end_of_term,omitempty"` 657 Contactpersons []struct { 658 ContactpersonID string `json:"contactperson_id,omitempty"` 659 } `json:"contactpersons,omitempty"` 660 PaymentTerms int64 `json:"payment_terms,omitempty"` 661 PaymentTermsLabel string `json:"payment_terms_label,omitempty"` 662 PaymentGateways []PaymentGateway `json:"payment_gateways,omitempty"` 663 CustomFields []CustomField `json:"custom_fields,omitempty"` 664 TemplateID int64 `json:"template_id,omitempty"` 665 } 666 667 type SubscriptionAddCharge struct { 668 Amount float64 `json:"amount,omitempty"` 669 Description string `json:"description,omitempty"` 670 Tags []Tag `json:"tags,omitempty"` 671 ItemCustomFields []CustomField `json:"item_custom_fields,omitempty"` 672 AccountID string `json:"account_id,omitempty"` 673 AddToUnbilledCharges bool `json:"add_to_unbilled_charges,omitempty"` 674 } 675 676 type Subscription struct { 677 SubscriptionID string `json:"subscription_id,omitempty"` 678 Name string `json:"name,omitempty"` 679 Status string `json:"status,omitempty"` 680 Amount float64 `json:"amount,omitempty"` 681 CreatedAt string `json:"created_at,omitempty"` 682 ActivatedAt string `json:"activated_at,omitempty"` 683 CurrentTermStartsAt string `json:"current_term_starts_at,omitempty"` 684 CurrentTermEndsAt string `json:"current_term_ends_at,omitempty"` 685 LastBillingAt string `json:"last_billing_at,omitempty"` 686 NextBillingAt string `json:"next_billing_at,omitempty"` 687 ExpiresAt string `json:"expires_at,omitempty"` 688 Interval int64 `json:"interval,omitempty"` 689 IntervalUnit string `json:"interval_unit,omitempty"` 690 AutoCollect bool `json:"auto_collect,omitempty"` 691 CreatedTime string `json:"created_time,omitempty"` 692 UpdatedTime string `json:"updated_time,omitempty"` 693 ReferenceID string `json:"reference_id,omitempty"` 694 SalespersonID string `json:"salesperson_id,omitempty"` 695 SalespersonName string `json:"salesperson_name,omitempty"` 696 ChildInvoiceID string `json:"child_invoice_id,omitempty"` 697 CurrencyCode string `json:"currency_code,omitempty"` 698 CurrencySymbol string `json:"currency_symbol,omitempty"` 699 EndOfTerm bool `json:"end_of_term,omitempty"` 700 ProductID string `json:"product_id,omitempty"` 701 ProductName string `json:"product_name,omitempty"` 702 Plan Plan `json:"plan,omitempty"` 703 Addons []Addon `json:"addons,omitempty"` 704 Coupon struct { 705 CouponCode string `json:"coupon_code,omitempty"` 706 DiscountAmount float64 `json:"discount_amount,omitempty"` 707 } `json:"coupon,omitempty"` 708 Card struct { 709 CardID string `json:"card_id,omitempty"` 710 LastFourDigits string `json:"last_four_digits,omitempty"` 711 PaymentGateway string `json:"payment_gateway,omitempty"` 712 ExpiryMonth int64 `json:"expiry_month,omitempty"` 713 ExpiryYear int64 `json:"expiry_year,omitempty"` 714 } `json:"card,omitempty"` 715 PaymentTerms int64 `json:"payment_terms,omitempty"` 716 PaymentTermsLabel string `json:"payment_terms_label,omitempty"` 717 CanAddBankAccount bool `json:"can_add_bank_account,omitempty"` 718 Customer Customer `json:"customer,omitempty"` 719 CustomFields []CustomField `json:"custom_fields,omitempty"` 720 Contactpersons []ContactPerson `json:"contactpersons,omitempty"` 721 Notes []struct { 722 NoteID string `json:"note_id,omitempty"` 723 Description string `json:"description,omitempty"` 724 CommentedBy string `json:"commented_by,omitempty"` 725 CommentedTime string `json:"commented_time,omitempty"` 726 } `json:"notes,omitempty"` 727 PaymentGateways []PaymentGateway `json:"payment_gateways,omitempty"` 728 CreateBackdatedInvoice bool `json:"create_backdated_invoice,omitempty"` 729 TemplateID string `json:"template_id,omitempty"` 730 } 731 732 type Addon struct { 733 AddonCode string `json:"addon_code,omitempty"` 734 Name string `json:"name,omitempty"` 735 AddonDescription string `json:"addon_description,omitempty"` 736 Quantity float64 `json:"quantity,omitempty"` 737 Price float64 `json:"price,omitempty"` 738 Discount float64 `json:"discount,omitempty"` 739 Total float64 `json:"total,omitempty"` 740 TaxID string `json:"tax_id,omitempty"` 741 } 742 743 type Plan struct { 744 PlanCode string `json:"plan_code,omitempty"` 745 Name string `json:"name,omitempty"` 746 Quantity float64 `json:"quantity,omitempty"` 747 Price float64 `json:"price,omitempty"` 748 Discount float64 `json:"discount,omitempty"` 749 Total float64 `json:"total,omitempty"` 750 SetupFee float64 `json:"setup_fee,omitempty"` 751 PlanDescription string `json:"plan_description,omitempty"` 752 TaxID string `json:"tax_id,omitempty"` 753 TrialDays int64 `json:"trial_days,omitempty"` 754 } 755 756 type Customer struct { 757 CustomerID string `json:"customer_id,omitempty"` 758 DisplayName string `json:"display_name,omitempty"` 759 Salutation string `json:"salutation,omitempty"` 760 FirstName string `json:"first_name,omitempty"` 761 LastName string `json:"last_name,omitempty"` 762 Email string `json:"email,omitempty"` 763 CompanyName string `json:"company_name,omitempty"` 764 BillingAddress Address `json:"billing_address,omitempty"` 765 ShippingAddress Address `json:"shipping_address,omitempty"` 766 PaymentTerms int64 `json:"payment_terms,omitempty"` 767 PaymentTermsLabel string `json:"payment_terms_label,omitempty"` 768 } 769 770 type Address struct { 771 Attention string `json:"attention,omitempty"` 772 Street string `json:"street,omitempty"` 773 Street2 string `json:"street2,omitempty"` 774 City string `json:"city,omitempty"` 775 State string `json:"state,omitempty"` 776 Country string `json:"country,omitempty"` 777 Zip string `json:"zip,omitempty"` 778 Fax string `json:"fax,omitempty"` 779 } 780 781 type CustomField struct { 782 Index int64 `json:"index,omitempty"` 783 Value interface{} `json:"value,omitempty"` 784 Label string `json:"label,omitempty"` 785 DataType string `json:"data_type,omitempty"` 786 } 787 788 type ContactPerson struct { 789 ContactpersonID string `json:"contactperson_id,omitempty"` 790 } 791 792 type PaymentGateway struct { 793 PaymentGateway string `json:"payment_gateway,omitempty"` 794 }