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  }