api-client-go/client.go

6534 lines
159 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package retailcrm
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"net/url"
"strconv"
"strings"
"time"
"github.com/google/go-querystring/query"
)
// HTTPStatusUnknown can return for the method `/api/v5/customers/upload`, `/api/v5/customers-corporate/upload`,
// `/api/v5/orders/upload`.
const HTTPStatusUnknown = 460
// New initialize client.
func New(url string, key string) *Client {
return &Client{
URL: strings.TrimRight(url, "/"),
Key: key,
httpClient: &http.Client{Timeout: time.Minute},
}
}
// WithLogger sets the provided logger instance into the Client.
func (c *Client) WithLogger(logger BasicLogger) *Client {
c.logger = logger
return c
}
// writeLog writes to the log.
func (c *Client) writeLog(format string, v ...interface{}) {
if c.logger != nil {
c.logger.Printf(format, v...)
return
}
log.Printf(format, v...)
}
// GetRequest implements GET Request.
func (c *Client) GetRequest(urlWithParameters string, versioned ...bool) ([]byte, int, error) {
var res []byte
var prefix = "/api/v5"
if len(versioned) > 0 {
if !versioned[0] {
prefix = "/api"
}
}
req, err := http.NewRequest("GET", fmt.Sprintf("%s%s%s", c.URL, prefix, urlWithParameters), nil)
if err != nil {
return res, 0, err
}
req.Header.Set("X-API-KEY", c.Key)
if c.Debug {
c.writeLog("API Request: %s %s", fmt.Sprintf("%s%s%s", c.URL, prefix, urlWithParameters), c.Key)
}
resp, err := c.httpClient.Do(req)
if err != nil {
return res, 0, err
}
if resp.StatusCode >= http.StatusInternalServerError {
return res, resp.StatusCode, CreateGenericAPIError(
fmt.Sprintf("HTTP request error. Status code: %d.", resp.StatusCode))
}
res, err = buildRawResponse(resp)
if err != nil {
return res, 0, err
}
if resp.StatusCode >= http.StatusBadRequest && resp.StatusCode < http.StatusInternalServerError {
return res, resp.StatusCode, CreateAPIError(res)
}
if c.Debug {
c.writeLog("API Response: %s", res)
}
return res, resp.StatusCode, nil
}
// PostRequest implements POST Request with generic body data.
func (c *Client) PostRequest(
uri string,
postData interface{},
contType ...string,
) ([]byte, int, error) {
var (
res []byte
contentType string
)
prefix := "/api/v5"
if len(contType) > 0 {
contentType = contType[0]
} else {
contentType = "application/x-www-form-urlencoded"
}
reader, err := getReaderForPostData(postData)
if err != nil {
return res, 0, err
}
req, err := http.NewRequest("POST", fmt.Sprintf("%s%s%s", c.URL, prefix, uri), reader)
if err != nil {
return res, 0, err
}
req.Header.Set("Content-Type", contentType)
req.Header.Set("X-API-KEY", c.Key)
if c.Debug {
c.writeLog("API Request: %s %s", uri, c.Key)
}
resp, err := c.httpClient.Do(req)
if err != nil {
return res, 0, err
}
if resp.StatusCode >= http.StatusInternalServerError {
return res, resp.StatusCode, CreateGenericAPIError(
fmt.Sprintf("HTTP request error. Status code: %d.", resp.StatusCode))
}
res, err = buildRawResponse(resp)
if err != nil {
return res, 0, err
}
if resp.StatusCode >= http.StatusBadRequest && resp.StatusCode < http.StatusInternalServerError {
return res, resp.StatusCode, CreateAPIError(res)
}
if c.Debug {
c.writeLog("API Response: %s", res)
}
return res, resp.StatusCode, nil
}
func getReaderForPostData(postData interface{}) (io.Reader, error) {
var reader io.Reader
switch d := postData.(type) {
case url.Values:
reader = strings.NewReader(d.Encode())
default:
if i, ok := d.(io.Reader); ok {
reader = i
} else {
err := errors.New("postData should be url.Values or implement io.Reader")
return nil, err
}
}
return reader, nil
}
func buildRawResponse(resp *http.Response) ([]byte, error) {
defer resp.Body.Close()
res, err := ioutil.ReadAll(resp.Body)
if err != nil {
return res, err
}
return res, nil
}
// checkBy select identifier type.
func checkBy(by string) string {
var context = ByID
if by != ByID {
context = ByExternalID
}
return context
}
// fillSite add site code to parameters if present.
func fillSite(p *url.Values, site []string) {
if len(site) > 0 {
s := site[0]
if s != "" {
p.Add("site", s)
}
}
}
// APIVersions get all available API versions for exact account
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-api-versions
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.APIVersions()
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.versions {
// log.Printf("%v\n", value)
// }
func (c *Client) APIVersions() (VersionResponse, int, error) {
var resp VersionResponse
data, status, err := c.GetRequest("/api-versions", false)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// APICredentials get all available API methods for exact account
//
// For more information see https://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-credentials
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.APICredentials()
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Scopes {
// log.Printf("%v\n", value)
// }
func (c *Client) APICredentials() (CredentialResponse, int, error) {
var resp CredentialResponse
data, status, err := c.GetRequest("/credentials", false)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// APISystemInfo get info about system
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-system-info
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.APISystemInfo()
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// log.Printf("%v\n", data)
func (c *Client) APISystemInfo() (SystemInfoResponse, int, error) {
var resp SystemInfoResponse
data, status, err := c.GetRequest("/system-info", false)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Customers returns list of customers matched the specified filter
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-customers
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Customers(retailcrm.CustomersRequest{
// Filter: CustomersFilter{
// City: "Moscow",
// },
// Page: 3,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Customers {
// log.Printf("%v\n", value)
// }
func (c *Client) Customers(parameters CustomersRequest) (CustomersResponse, int, error) {
var resp CustomersResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/customers?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomersCombine combine given customers
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-customers-combine
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomersCombine([]retailcrm.Customer{{ID: 1}, {ID: 2}}, Customer{ID: 3})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) CustomersCombine(customers []Customer, resultCustomer Customer) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
combineJSONIn, _ := json.Marshal(&customers)
combineJSONOut, _ := json.Marshal(&resultCustomer)
p := url.Values{
"customers": {string(combineJSONIn)},
"resultCustomer": {string(combineJSONOut)},
}
data, status, err := c.PostRequest("/customers/combine", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomerCreate creates customer
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-customers-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomersCombine(retailcrm.Customer{
// FirstName: "Ivan",
// LastName: "Ivanov",
// Patronymic: "Ivanovich",
// ExternalID: 1,
// Email: "ivanov@example.com",
// Address: &retailcrm.Address{
// City: "Moscow",
// Street: "Kutuzovsky",
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// fmt.Printf("%v", data.ID)
// }
func (c *Client) CustomerCreate(customer Customer, site ...string) (CustomerChangeResponse, int, error) {
var resp CustomerChangeResponse
customerJSON, _ := json.Marshal(&customer)
p := url.Values{
"customer": {string(customerJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/customers/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomersFixExternalIds customers external ID
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-customers-fix-external-ids
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomersFixExternalIds([]retailcrm.IdentifiersPair{{
// ID: 1,
// ExternalID: 12,
// }})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) CustomersFixExternalIds(customers []IdentifiersPair) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
customersJSON, _ := json.Marshal(&customers)
p := url.Values{
"customers": {string(customersJSON)},
}
data, status, err := c.PostRequest("/customers/fix-external-ids", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomersHistory returns customer's history
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-customers-history
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomersHistory(retailcrm.CustomersHistoryRequest{
// Filter: retailcrm.CustomersHistoryFilter{
// SinceID: 20,
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.History {
// log.Printf("%v\n", value)
// }
func (c *Client) CustomersHistory(parameters CustomersHistoryRequest) (CustomersHistoryResponse, int, error) {
var resp CustomersHistoryResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/customers/history?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomerNotes returns customer related notes
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-customers-notes
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomerNotes(retailcrm.NotesRequest{
// Filter: retailcrm.NotesFilter{
// CustomerIds: []int{1,2,3}
// },
// Page: 1,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Notes {
// log.Printf("%v\n", value)
// }
func (c *Client) CustomerNotes(parameters NotesRequest) (NotesResponse, int, error) {
var resp NotesResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/customers/notes?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomerNoteCreate note creation
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-customers-notes-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomerNoteCreate(retailcrm.Note{
// Text: "some text",
// ManagerID: 12,
// Customer: &retailcrm.Customer{
// ID: 1,
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.ID)
// }
func (c *Client) CustomerNoteCreate(note Note, site ...string) (CreateResponse, int, error) {
var resp CreateResponse
noteJSON, _ := json.Marshal(&note)
p := url.Values{
"note": {string(noteJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/customers/notes/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomerNoteDelete remove customer related note
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-customers-notes-id-delete
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomerNoteDelete(12)
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) CustomerNoteDelete(id int) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
p := url.Values{
"id": {strconv.Itoa(id)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/customers/notes/%d/delete", id), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomersUpload customers batch upload
//
// # This method can return response together with error if http status is equal 460
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-customers-upload
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomersUpload([]retailcrm.Customer{
// {
// FirstName: "Ivan",
// LastName: "Ivanov",
// Patronymic: "Ivanovich",
// ExternalID: 1,
// Email: "ivanov@example.com",
// },
// {
// FirstName: "Petr",
// LastName: "Petrov",
// Patronymic: "Petrovich",
// ExternalID: 2,
// Email: "petrov@example.com",
// },
// }}
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.UploadedCustomers)
// }
func (c *Client) CustomersUpload(customers []Customer, site ...string) (CustomersUploadResponse, int, error) {
var resp CustomersUploadResponse
uploadJSON, _ := json.Marshal(&customers)
p := url.Values{
"customers": {string(uploadJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/customers/upload", p)
if err != nil && status != HTTPStatusUnknown {
return resp, status, err
}
errJSON := json.Unmarshal(data, &resp)
if errJSON != nil {
return resp, status, errJSON
}
if status == HTTPStatusUnknown {
return resp, status, err
}
return resp, status, nil
}
// Customer returns information about customer
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-customers-externalId
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Customer(12, retailcrm.ByExternalID, "")
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.Customer)
// }
func (c *Client) Customer(id, by, site string) (CustomerResponse, int, error) {
var resp CustomerResponse
var context = checkBy(by)
fw := CustomerRequest{context, site}
params, _ := query.Values(fw)
data, status, err := c.GetRequest(fmt.Sprintf("/customers/%s?%s", id, params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomerEdit edit exact customer
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-customers-externalId-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomerEdit(
// retailcrm.Customer{
// FirstName: "Ivan",
// LastName: "Ivanov",
// Patronymic: "Ivanovich",
// ID: 1,
// Email: "ivanov@example.com",
// },
// retailcrm.ByID,
// )
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.Customer)
// }
func (c *Client) CustomerEdit(customer Customer, by string, site ...string) (CustomerChangeResponse, int, error) {
var resp CustomerChangeResponse
var uid = strconv.Itoa(customer.ID)
var context = checkBy(by)
if context == ByExternalID {
uid = customer.ExternalID
}
customerJSON, _ := json.Marshal(&customer)
p := url.Values{
"by": {context},
"customer": {string(customerJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/customers/%s/edit", uid), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomers returns list of corporate customers matched the specified filter
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-customers-corporate
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomers(retailcrm.CorporateCustomersRequest{
// Filter: CorporateCustomersFilter{
// City: "Moscow",
// },
// Page: 3,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.CustomersCorporate {
// log.Printf("%v\n", value)
// }
func (c *Client) CorporateCustomers(parameters CorporateCustomersRequest) (CorporateCustomersResponse, int, error) {
var resp CorporateCustomersResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/customers-corporate?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerCreate creates corporate customer
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomerCreate(retailcrm.CorporateCustomer{
// Nickname: "Company",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// fmt.Printf("%v", data.ID)
// }
func (c *Client) CorporateCustomerCreate(customer CorporateCustomer, site ...string) (
CorporateCustomerChangeResponse, int, error,
) {
var resp CorporateCustomerChangeResponse
customerJSON, _ := json.Marshal(&customer)
p := url.Values{
"customerCorporate": {string(customerJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/customers-corporate/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomersFixExternalIds will fix corporate customers external ID's
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-fix-external-ids
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomersFixExternalIds([]retailcrm.IdentifiersPair{{
// ID: 1,
// ExternalID: 12,
// }})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) CorporateCustomersFixExternalIds(customers []IdentifiersPair) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
customersJSON, _ := json.Marshal(&customers)
p := url.Values{
"customersCorporate": {string(customersJSON)},
}
data, status, err := c.PostRequest("/customers-corporate/fix-external-ids", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomersHistory returns corporate customer's history
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-fix-external-ids
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomersHistory(retailcrm.CorporateCustomersHistoryRequest{
// Filter: retailcrm.CorporateCustomersHistoryFilter{
// SinceID: 20,
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.History {
// log.Printf("%v\n", value)
// }
func (c *Client) CorporateCustomersHistory(parameters CorporateCustomersHistoryRequest) (
CorporateCustomersHistoryResponse, int, error,
) {
var resp CorporateCustomersHistoryResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/customers-corporate/history?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomersNotes returns list of corporate customers notes matched the specified filter
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-customers-corporate-notes
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomersNotes(retailcrm.CorporateCustomersNotesRequest{
// Filter: CorporateCustomersNotesFilter{
// Text: "text",
// },
// Page: 3,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Notes {
// log.Printf("%v\n", value)
// }
func (c *Client) CorporateCustomersNotes(parameters CorporateCustomersNotesRequest) (
CorporateCustomersNotesResponse, int, error,
) {
var resp CorporateCustomersNotesResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/customers-corporate/notes?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerNoteCreate creates corporate customer note
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-notes-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomerNoteCreate(retailcrm.CorporateCustomerNote{
// Text: "text",
// Customer: &retailcrm.IdentifiersPair{
// ID: 1,
// }
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// fmt.Printf("%v", data.ID)
// }
func (c *Client) CorporateCustomerNoteCreate(note CorporateCustomerNote, site ...string) (CreateResponse, int, error) {
var resp CreateResponse
noteJSON, _ := json.Marshal(&note)
p := url.Values{
"note": {string(noteJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/customers-corporate/notes/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerNoteDelete removes note from corporate customer
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-notes-id-delete
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomerNoteDelete(12)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) CorporateCustomerNoteDelete(id int) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
p := url.Values{
"id": {strconv.Itoa(id)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/customers-corporate/notes/%d/delete", id), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomersUpload corporate customers batch upload
//
// # This method can return response together with error if http status is equal 460
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-upload
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomersUpload([]retailcrm.CorporateCustomer{
// {
// Nickname: "Company",
// ExternalID: 1,
// },
// {
// Nickname: "Company 2",
// ExternalID: 2,
// },
// }}
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.UploadedCustomers)
// }
func (c *Client) CorporateCustomersUpload(
customers []CorporateCustomer, site ...string,
) (CorporateCustomersUploadResponse, int, error) {
var resp CorporateCustomersUploadResponse
uploadJSON, _ := json.Marshal(&customers)
p := url.Values{
"customersCorporate": {string(uploadJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/customers-corporate/upload", p)
if err != nil && status != HTTPStatusUnknown {
return resp, status, err
}
errJSON := json.Unmarshal(data, &resp)
if errJSON != nil {
return resp, status, err
}
if status == HTTPStatusUnknown {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomer returns information about corporate customer
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-customers-corporate-externalId
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomer(12, retailcrm.ByExternalID, "")
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.CorporateCustomer)
// }
func (c *Client) CorporateCustomer(id, by, site string) (CorporateCustomerResponse, int, error) {
var resp CorporateCustomerResponse
var context = checkBy(by)
fw := CustomerRequest{context, site}
params, _ := query.Values(fw)
data, status, err := c.GetRequest(fmt.Sprintf("/customers-corporate/%s?%s", id, params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerAddresses returns information about corporate customer addresses
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-customers-corporate-externalId-addresses
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomerAddresses("ext-id", retailcrm.CorporateCustomerAddressesRequest{
// Filter: v5,CorporateCustomerAddressesFilter{
// Name: "Main Address",
// },
// By: retailcrm.ByExternalID,
// Site: "site",
// Limit: 20,
// Page: 1,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.Addresses)
// }
func (c *Client) CorporateCustomerAddresses(
id string, parameters CorporateCustomerAddressesRequest,
) (CorporateCustomersAddressesResponse, int, error) {
var resp CorporateCustomersAddressesResponse
parameters.By = checkBy(parameters.By)
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/customers-corporate/%s/addresses?%s", id, params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerAddressesCreate creates corporate customer address
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-externalId-addresses-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := c.CorporateCustomerAddressesCreate("ext-id", retailcrm.ByExternalID, retailcrm.CorporateCustomerAddress{
// Text: "this is new address",
// Name: "New Address",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// fmt.Printf("%v", data.ID)
// }
func (c *Client) CorporateCustomerAddressesCreate(
id string, by string, address CorporateCustomerAddress, site ...string,
) (CreateResponse, int, error) {
var resp CreateResponse
addressJSON, _ := json.Marshal(&address)
p := url.Values{
"address": {string(addressJSON)},
"by": {checkBy(by)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/customers-corporate/%s/addresses/create", id), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerAddressesEdit edit exact corporate customer address
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-externalId-addresses-entityExternalId-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := c.CorporateCustomerAddressesEdit(
// "customer-ext-id",
// retailcrm.ByExternalID,
// retailcrm.ByExternalID,
// CorporateCustomerAddress{
// ExternalID: "addr-ext-id",
// Name: "Main Address 2",
// },
// )
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.Customer)
// }
func (c *Client) CorporateCustomerAddressesEdit(
customerID, customerBy, entityBy string, address CorporateCustomerAddress, site ...string,
) (CreateResponse, int, error) {
var (
resp CreateResponse
uid string
)
customerBy = checkBy(customerBy)
entityBy = checkBy(entityBy)
switch entityBy {
case ByID:
uid = strconv.Itoa(address.ID)
case ByExternalID:
uid = address.ExternalID
}
addressJSON, _ := json.Marshal(&address)
p := url.Values{
"by": {customerBy},
"entityBy": {entityBy},
"address": {string(addressJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/customers-corporate/%s/addresses/%s/edit", customerID, uid), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerCompanies returns information about corporate customer companies
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-customers-corporate-externalId-companies
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomerCompanies("ext-id", retailcrm.IdentifiersPairRequest{
// Filter: v5,IdentifiersPairFilter{
// Ids: []string{"1"},
// },
// By: retailcrm.ByExternalID,
// Site: "site",
// Limit: 20,
// Page: 1,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.Companies)
// }
func (c *Client) CorporateCustomerCompanies(
id string, parameters IdentifiersPairRequest,
) (CorporateCustomerCompaniesResponse, int, error) {
var resp CorporateCustomerCompaniesResponse
parameters.By = checkBy(parameters.By)
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/customers-corporate/%s/companies?%s", id, params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerCompaniesCreate creates corporate customer company
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-externalId-companies-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := c.CorporateCustomerCompaniesCreate("ext-id", retailcrm.ByExternalID, retailcrm.Company{
// Name: "Company name",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// fmt.Printf("%v", data.ID)
// }
func (c *Client) CorporateCustomerCompaniesCreate(
id string, by string, company Company, site ...string,
) (CreateResponse, int, error) {
var resp CreateResponse
companyJSON, _ := json.Marshal(&company)
p := url.Values{
"company": {string(companyJSON)},
"by": {checkBy(by)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/customers-corporate/%s/companies/create", id), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerCompaniesEdit edit exact corporate customer company
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-externalId-companies-entityExternalId-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := c.CorporateCustomerCompaniesEdit(
// "customer-ext-id",
// retailcrm.ByExternalID,
// retailcrm.ByExternalID,
// Company{
// ExternalID: "company-ext-id",
// Name: "New Company Name",
// },
// )
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.ID)
// }
func (c *Client) CorporateCustomerCompaniesEdit(
customerID, customerBy, entityBy string, company Company, site ...string,
) (CreateResponse, int, error) {
var (
resp CreateResponse
uid string
)
customerBy = checkBy(customerBy)
entityBy = checkBy(entityBy)
switch entityBy {
case ByID:
uid = strconv.Itoa(company.ID)
case ByExternalID:
uid = company.ExternalID
}
addressJSON, _ := json.Marshal(&company)
p := url.Values{
"by": {customerBy},
"entityBy": {entityBy},
"company": {string(addressJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/customers-corporate/%s/companies/%s/edit", customerID, uid), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerContacts returns information about corporate customer contacts
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-customers-corporate-externalId-contacts
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomerContacts("ext-id", retailcrm.IdentifiersPairRequest{
// Filter: retailcrm.IdentifiersPairFilter{
// Ids: []string{"1"},
// },
// By: retailcrm.ByExternalID,
// Site: "site",
// Limit: 20,
// Page: 1,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.Contacts)
// }
func (c *Client) CorporateCustomerContacts(
id string, parameters IdentifiersPairRequest,
) (CorporateCustomerContactsResponse, int, error) {
var resp CorporateCustomerContactsResponse
parameters.By = checkBy(parameters.By)
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/customers-corporate/%s/contacts?%s", id, params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerContactsCreate creates corporate customer contact
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-externalId-contacts-create
//
// Example (customer with specified id or externalId should exist in specified site):
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := c.CorporateCustomerContactsCreate("ext-id", retailcrm.ByExternalID, retailcrm.CorporateCustomerContact{
// IsMain: false,
// Customer: retailcrm.CorporateCustomerContactCustomer{
// ExternalID: "external_id",
// Site: "site",
// },
// Companies: []IdentifiersPair{},
// }, "site")
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// fmt.Printf("%v", data.ID)
// }
func (c *Client) CorporateCustomerContactsCreate(
id string, by string, contact CorporateCustomerContact, site ...string,
) (CreateResponse, int, error) {
var resp CreateResponse
companyJSON, _ := json.Marshal(&contact)
p := url.Values{
"contact": {string(companyJSON)},
"by": {checkBy(by)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/customers-corporate/%s/contacts/create", id), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerContactsEdit edit exact corporate customer contact
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-externalId-contacts-entityExternalId-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := c.CorporateCustomerContactsEdit("ext-id", retailcrm.ByExternalID, retailcrm.ByID, retailcrm.CorporateCustomerContact{
// IsMain: false,
// Customer: retailcrm.CorporateCustomerContactCustomer{
// ID: 2350,
// },
// }, "site")
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.ID)
// }
func (c *Client) CorporateCustomerContactsEdit(
customerID, customerBy, entityBy string, contact CorporateCustomerContact, site ...string,
) (CreateResponse, int, error) {
var (
resp CreateResponse
uid string
)
customerBy = checkBy(customerBy)
entityBy = checkBy(entityBy)
switch entityBy {
case ByID:
uid = strconv.Itoa(contact.Customer.ID)
case ByExternalID:
uid = contact.Customer.ExternalID
}
addressJSON, _ := json.Marshal(&contact)
p := url.Values{
"by": {customerBy},
"entityBy": {entityBy},
"contact": {string(addressJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/customers-corporate/%s/contacts/%s/edit", customerID, uid), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CorporateCustomerEdit edit exact corporate customer
//
// For more information see http://help.retailcrm.pro/Developers/ApiVersion5#post--api-v5-customers-corporate-externalId-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CorporateCustomerEdit(
// retailcrm.CorporateCustomer{
// FirstName: "Ivan",
// LastName: "Ivanov",
// Patronymic: "Ivanovich",
// ID: 1,
// Email: "ivanov@example.com",
// },
// retailcrm.ByID,
// )
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.Customer)
// }
func (c *Client) CorporateCustomerEdit(customer CorporateCustomer, by string, site ...string) (
CustomerChangeResponse, int, error,
) {
var resp CustomerChangeResponse
var uid = strconv.Itoa(customer.ID)
var context = checkBy(by)
if context == ByExternalID {
uid = customer.ExternalID
}
customerJSON, _ := json.Marshal(&customer)
p := url.Values{
"by": {context},
"customerCorporate": {string(customerJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/customers-corporate/%s/edit", uid), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// DeliveryTracking updates tracking data
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-delivery-generic-subcode-tracking
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
// t, _ := time.Parse("2006-01-02 15:04:05", "2012-12-12 12:12:12")
//
// data, status, err := client.DeliveryTracking(
// []retailcrm.DeliveryTrackingRequest{{
// DeliveryID: "1",
// TrackNumber: "123",
// History: []retailcrm.DeliveryHistoryRecord{
// {
// Code: "cancel",
// UpdatedAt: t.Format(time.RFC3339),
// },
// },
// }},
// "delivery-1",
// )
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) DeliveryTracking(parameters []DeliveryTrackingRequest, subcode string) (
SuccessfulResponse, int, error,
) {
var resp SuccessfulResponse
updateJSON, _ := json.Marshal(&parameters)
p := url.Values{
"statusUpdate": {string(updateJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/delivery/generic/%s/tracking", subcode), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// DeliveryShipments returns list of shipments
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-delivery-shipments
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.DeliveryShipments(retailcrm.DeliveryShipmentsRequest{
// Limit: 12,
// Filter: retailcrm.ShipmentFilter{
// DateFrom: "2012-12-12",
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.DeliveryShipments {
// log.Printf("%v\n", value)
// }
func (c *Client) DeliveryShipments(parameters DeliveryShipmentsRequest) (DeliveryShipmentsResponse, int, error) {
var resp DeliveryShipmentsResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/delivery/shipments?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// DeliveryShipmentCreate creates shipment
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-delivery-shipments-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.DeliveryShipmentCreate(
// retailcrm.DeliveryShipment{
// Date: "2012-12-12",
// Time: retailcrm.DeliveryTime{
// From: "18:00",
// To: "20:00",
// },
// Orders: []retailcrm.Order{{Number: "12"}},
// },
// "sdek",
// )
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.ID)
// }
func (c *Client) DeliveryShipmentCreate(
shipment DeliveryShipment, deliveryType string, site ...string,
) (DeliveryShipmentUpdateResponse, int, error) {
var resp DeliveryShipmentUpdateResponse
updateJSON, _ := json.Marshal(&shipment)
p := url.Values{
"deliveryType": {deliveryType},
"deliveryShipment": {string(updateJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/delivery/shipments/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// DeliveryShipment get information about shipment
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-delivery-shipments-id
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.DeliveryShipment(12)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.DeliveryShipment)
// }
func (c *Client) DeliveryShipment(id int) (DeliveryShipmentResponse, int, error) {
var resp DeliveryShipmentResponse
data, status, err := c.GetRequest(fmt.Sprintf("/delivery/shipments/%d", id))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// DeliveryShipmentEdit shipment editing
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-delivery-shipments-id-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.DeliveryShipmentEdit(retailcrm.DeliveryShipment{
// ID: "12",
// Time: retailcrm.DeliveryTime{
// From: "14:00",
// To: "18:00",
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) DeliveryShipmentEdit(shipment DeliveryShipment, site ...string) (
DeliveryShipmentUpdateResponse, int, error,
) {
var resp DeliveryShipmentUpdateResponse
updateJSON, _ := json.Marshal(&shipment)
p := url.Values{
"deliveryShipment": {string(updateJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/delivery/shipments/%s/edit", strconv.Itoa(shipment.ID)), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// IntegrationModule returns integration module
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-integration-modules-code
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.IntegrationModule("moysklad3")
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.IntegrationModule)
// }
func (c *Client) IntegrationModule(code string) (IntegrationModuleResponse, int, error) {
var resp IntegrationModuleResponse
data, status, err := c.GetRequest(fmt.Sprintf("/integration-modules/%s", code))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// IntegrationModuleEdit integration module create/edit
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-integration-modules-code
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// name := "MS"
// code := "moysklad3"
//
// data, status, err := client.IntegrationModuleEdit(retailcrm.IntegrationModule{
// Code: code,
// IntegrationCode: code,
// Active: false,
// Name: fmt.Sprintf("Integration module %s", name),
// AccountURL: fmt.Sprintf("http://example.com/%s/account", name),
// BaseURL: fmt.Sprintf("http://example.com/%s", name),
// ClientID: "123",
// Logo: "https://cdn.worldvectorlogo.com/logos/github-icon.svg",
// })
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
//
// if data.Success == true {
// fmt.Printf("%v\n", data.Info)
// }
func (c *Client) IntegrationModuleEdit(integrationModule IntegrationModule) (
IntegrationModuleEditResponse, int, error,
) {
var resp IntegrationModuleEditResponse
updateJSON, _ := json.Marshal(&integrationModule)
p := url.Values{"integrationModule": {string(updateJSON)}}
data, status, err := c.PostRequest(fmt.Sprintf("/integration-modules/%s/edit", integrationModule.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// UpdateScopes updates permissions for the API key
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-integration-modules-code-update-scopes
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.UpdateScopes("moysklad3", retailcrm.ScopesRequired{
// Scopes: []string{"scope1", "scope2"},
// })
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
//
// if data.Success == true {
// fmt.Printf("%v\n", data.APIKey)
// }
func (c *Client) UpdateScopes(code string, request ScopesRequired) (UpdateScopesResponse, int, error) {
var resp UpdateScopesResponse
updateJSON, _ := json.Marshal(&request)
p := url.Values{
"requires": {string(updateJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/integration-modules/%s/update-scopes", code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Orders returns list of orders matched the specified filters
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-orders
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Orders(retailcrm.OrdersRequest{Filter: retailcrm.OrdersFilter{City: "Moscow"}, Page: 1})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Orders {
// log.Printf("%v\n", value)
// }
func (c *Client) Orders(parameters OrdersRequest) (OrdersResponse, int, error) {
var resp OrdersResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/orders?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrdersCombine combines given orders
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-combine
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrdersCombine("ours", retailcrm.Order{ID: 1}, retailcrm.Order{ID: 1})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) OrdersCombine(technique string, order, resultOrder Order) (OperationResponse, int, error) {
var resp OperationResponse
combineJSONIn, _ := json.Marshal(&order)
combineJSONOut, _ := json.Marshal(&resultOrder)
p := url.Values{
"technique": {technique},
"order": {string(combineJSONIn)},
"resultOrder": {string(combineJSONOut)},
}
data, status, err := c.PostRequest("/orders/combine", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrderCreate creates an order
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrderCreate(retailcrm.Order{
// FirstName: "Ivan",
// LastName: "Ivanov",
// Patronymic: "Ivanovich",
// Email: "ivanov@example.com",
// Items: []retailcrm.OrderItem{{Offer: retailcrm.Offer{ID: 12}, Quantity: 5}},
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.ID)
// }
func (c *Client) OrderCreate(order Order, site ...string) (OrderCreateResponse, int, error) {
var resp OrderCreateResponse
orderJSON, _ := json.Marshal(&order)
p := url.Values{
"order": {string(orderJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/orders/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrdersFixExternalIds set order external ID
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-fix-external-ids
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrdersFixExternalIds(([]retailcrm.IdentifiersPair{{
// ID: 1,
// ExternalID: 12,
// }})
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
//
// if data.Success == true {
// fmt.Printf("%v\n", data.ID)
// }
func (c *Client) OrdersFixExternalIds(orders []IdentifiersPair) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
ordersJSON, _ := json.Marshal(&orders)
p := url.Values{
"orders": {string(ordersJSON)},
}
data, status, err := c.PostRequest("/orders/fix-external-ids", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrdersHistory returns orders history
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-orders-history
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrdersHistory(retailcrm.OrdersHistoryRequest{Filter: retailcrm.OrdersHistoryFilter{SinceID: 20}})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.History {
// log.Printf("%v\n", value)
// }
func (c *Client) OrdersHistory(parameters OrdersHistoryRequest) (OrdersHistoryResponse, int, error) {
var resp OrdersHistoryResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/orders/history?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrderPaymentCreate creates payment
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-payments-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrderPaymentCreate(retailcrm.Payment{
// Order: &retailcrm.Order{
// ID: 12,
// },
// Amount: 300,
// Type: "cash",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.ID)
// }
func (c *Client) OrderPaymentCreate(payment Payment, site ...string) (CreateResponse, int, error) {
var resp CreateResponse
paymentJSON, _ := json.Marshal(&payment)
p := url.Values{
"payment": {string(paymentJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/orders/payments/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrderPaymentDelete payment removing
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-payments-id-delete
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrderPaymentDelete(12)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) OrderPaymentDelete(id int) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
p := url.Values{
"id": {strconv.Itoa(id)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/orders/payments/%d/delete", id), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrderPaymentEdit edit payment
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-payments-id-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrderPaymentEdit(
// retailcrm.Payment{
// ID: 12,
// Amount: 500,
// },
// retailcrm.ByID,
// )
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) OrderPaymentEdit(payment Payment, by string, site ...string) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
var uid = strconv.Itoa(payment.ID)
var context = checkBy(by)
if context == ByExternalID {
uid = payment.ExternalID
}
paymentJSON, _ := json.Marshal(&payment)
p := url.Values{
"by": {context},
"payment": {string(paymentJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/orders/payments/%s/edit", uid), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrdersStatuses returns orders statuses
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-orders-statuses
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrdersStatuses(retailcrm.OrdersStatusesRequest{
// IDs: []int{1},
// ExternalIDs: []string{"2"},
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) OrdersStatuses(request OrdersStatusesRequest) (OrdersStatusesResponse, int, error) {
var resp OrdersStatusesResponse
params, _ := query.Values(request)
data, status, err := c.GetRequest(fmt.Sprintf("/orders/statuses?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrdersUpload batch orders uploading
//
// # This method can return response together with error if http status is equal 460
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-upload
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrdersUpload([]retailcrm.Order{
// {
// FirstName: "Ivan",
// LastName: "Ivanov",
// Patronymic: "Ivanovich",
// Email: "ivanov@example.com",
// Items: []retailcrm.OrderItem{{Offer: retailcrm.Offer{ID: 12}, Quantity: 5}},
// },
// {
// FirstName: "Pert",
// LastName: "Petrov",
// Patronymic: "Petrovich",
// Email: "petrov@example.com",
// Items: []retailcrm.OrderItem{{Offer: retailcrm.Offer{ID: 13}, Quantity: 1}},
// }
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.UploadedOrders)
// }
func (c *Client) OrdersUpload(orders []Order, site ...string) (OrdersUploadResponse, int, error) {
var resp OrdersUploadResponse
uploadJSON, _ := json.Marshal(&orders)
p := url.Values{
"orders": {string(uploadJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/orders/upload", p)
if err != nil && status != HTTPStatusUnknown {
return resp, status, err
}
errJSON := json.Unmarshal(data, &resp)
if errJSON != nil {
return resp, status, err
}
if status == HTTPStatusUnknown {
return resp, status, err
}
return resp, status, nil
}
// Order returns information about order
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-orders-externalId
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Order(12, retailcrm.ByExternalID, "")
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.Order)
// }
func (c *Client) Order(id, by, site string) (OrderResponse, int, error) {
var resp OrderResponse
var context = checkBy(by)
fw := OrderRequest{context, site}
params, _ := query.Values(fw)
data, status, err := c.GetRequest(fmt.Sprintf("/orders/%s?%s", id, params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrderEdit edit an order
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-externalId-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrderEdit(
// retailcrm.Order{
// ID: 12,
// Items: []retailcrm.OrderItem{{Offer: retailcrm.Offer{ID: 13}, Quantity: 6}},
// },
// retailcrm.ByID,
// )
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) OrderEdit(order Order, by string, site ...string) (CreateResponse, int, error) {
var resp CreateResponse
var uid = strconv.Itoa(order.ID)
var context = checkBy(by)
if context == ByExternalID {
uid = order.ExternalID
}
orderJSON, _ := json.Marshal(&order)
p := url.Values{
"by": {context},
"order": {string(orderJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/orders/%s/edit", uid), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Packs returns list of packs matched the specified filters
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-orders-packs
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Packs(retailcrm.PacksRequest{Filter: retailcrm.PacksFilter{OrderID: 12}})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Packs {
// log.Printf("%v\n", value)
// }
func (c *Client) Packs(parameters PacksRequest) (PacksResponse, int, error) {
var resp PacksResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/orders/packs?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PackCreate creates a pack
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-packs-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.PackCreate(Pack{
// Store: "store-1",
// ItemID: 12,
// Quantity: 1,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.ID)
// }
func (c *Client) PackCreate(pack Pack) (CreateResponse, int, error) {
var resp CreateResponse
packJSON, _ := json.Marshal(&pack)
p := url.Values{
"pack": {string(packJSON)},
}
data, status, err := c.PostRequest("/orders/packs/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PacksHistory returns a history of order packing
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-orders-packs-history
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.PacksHistory(retailcrm.PacksHistoryRequest{Filter: retailcrm.OrdersHistoryFilter{SinceID: 5}})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.History {
// log.Printf("%v\n", value)
// }
func (c *Client) PacksHistory(parameters PacksHistoryRequest) (PacksHistoryResponse, int, error) {
var resp PacksHistoryResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/orders/packs/history?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Pack returns a pack info
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-orders-packs-id
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Pack(112)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.Pack)
// }
func (c *Client) Pack(id int) (PackResponse, int, error) {
var resp PackResponse
data, status, err := c.GetRequest(fmt.Sprintf("/orders/packs/%d", id))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PackDelete removes a pack
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-packs-id-delete
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.PackDelete(112)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) PackDelete(id int) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
data, status, err := c.PostRequest(fmt.Sprintf("/orders/packs/%d/delete", id), url.Values{})
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PackEdit edit a pack
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-packs-id-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.PackEdit(Pack{ID: 12, Quantity: 2})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) PackEdit(pack Pack) (CreateResponse, int, error) {
var resp CreateResponse
packJSON, _ := json.Marshal(&pack)
p := url.Values{
"pack": {string(packJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/orders/packs/%d/edit", pack.ID), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Countries returns list of available country codes
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-countries
func (c *Client) Countries() (CountriesResponse, int, error) {
var resp CountriesResponse
data, status, err := c.GetRequest("/reference/countries")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CostGroups returns costs groups list
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-cost-groups
func (c *Client) CostGroups() (CostGroupsResponse, int, error) {
var resp CostGroupsResponse
data, status, err := c.GetRequest("/reference/cost-groups")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CostGroupEdit edit costs groups
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-cost-groups-code-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CostGroupEdit(retailcrm.CostGroup{
// Code: "group-1",
// Color: "#da5c98",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) CostGroupEdit(costGroup CostGroup) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&costGroup)
p := url.Values{
"costGroup": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/cost-groups/%s/edit", costGroup.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CostItems returns costs items list
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-cost-items
func (c *Client) CostItems() (CostItemsResponse, int, error) {
var resp CostItemsResponse
data, status, err := c.GetRequest("/reference/cost-items")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CostItemEdit edit costs items
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-cost-items-code-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CostItemEdit(retailcrm.CostItem{
// Code: "seo",
// Active: false,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) CostItemEdit(costItem CostItem) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&costItem)
p := url.Values{
"costItem": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/cost-items/%s/edit", costItem.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Couriers returns list of couriers
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-couriers
func (c *Client) Couriers() (CouriersResponse, int, error) {
var resp CouriersResponse
data, status, err := c.GetRequest("/reference/couriers")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CourierCreate creates a courier
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-couriers
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CostItemEdit(retailcrm.Courier{
// Active: true,
// Email: "courier1@example.com",
// FirstName: "Ivan",
// LastName: "Ivanov",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", data.ID)
// }
func (c *Client) CourierCreate(courier Courier) (CreateResponse, int, error) {
var resp CreateResponse
objJSON, _ := json.Marshal(&courier)
p := url.Values{
"courier": {string(objJSON)},
}
data, status, err := c.PostRequest("/reference/couriers/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CourierEdit edit a courier
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-couriers-id-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CostItemEdit(retailcrm.Courier{
// ID: 1,
// Patronymic: "Ivanovich",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) CourierEdit(courier Courier) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&courier)
p := url.Values{
"courier": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/couriers/%d/edit", courier.ID), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// DeliveryServices returns list of delivery services
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-delivery-services
func (c *Client) DeliveryServices() (DeliveryServiceResponse, int, error) {
var resp DeliveryServiceResponse
data, status, err := c.GetRequest("/reference/delivery-services")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// DeliveryServiceEdit delivery service create/edit
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-delivery-services-code-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.DeliveryServiceEdit(retailcrm.DeliveryService{
// Active: false,
// Code: "delivery-1",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) DeliveryServiceEdit(deliveryService DeliveryService) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&deliveryService)
p := url.Values{
"deliveryService": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/delivery-services/%s/edit", deliveryService.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// DeliveryTypes returns list of delivery types
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-delivery-types
func (c *Client) DeliveryTypes() (DeliveryTypesResponse, int, error) {
var resp DeliveryTypesResponse
data, status, err := c.GetRequest("/reference/delivery-types")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// DeliveryTypeEdit delivery type create/edit
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-delivery-types-code-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.DeliveryTypeEdit(retailcrm.DeliveryType{
// Active: false,
// Code: "type-1",
// DefaultCost: 300,
// DefaultForCrm: false,
// }
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) DeliveryTypeEdit(deliveryType DeliveryType) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&deliveryType)
p := url.Values{
"deliveryType": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/delivery-types/%s/edit", deliveryType.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// LegalEntities returns list of legal entities
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-legal-entities
func (c *Client) LegalEntities() (LegalEntitiesResponse, int, error) {
var resp LegalEntitiesResponse
data, status, err := c.GetRequest("/reference/legal-entities")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// LegalEntityEdit change information about legal entity
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-legal-entities-code-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.LegalEntityEdit(retailcrm.LegalEntity{
// Code: "legal-entity-1",
// CertificateDate: "2012-12-12",
// }
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) LegalEntityEdit(legalEntity LegalEntity) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&legalEntity)
p := url.Values{
"legalEntity": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/legal-entities/%s/edit", legalEntity.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrderMethods returns list of order methods
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-order-methods
func (c *Client) OrderMethods() (OrderMethodsResponse, int, error) {
var resp OrderMethodsResponse
data, status, err := c.GetRequest("/reference/order-methods")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrderMethodEdit order method create/edit
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-order-methods-code-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrderMethodEdit(retailcrm.OrderMethod{
// Code: "method-1",
// Active: false,
// DefaultForCRM: false,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) OrderMethodEdit(orderMethod OrderMethod) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&orderMethod)
p := url.Values{
"orderMethod": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/order-methods/%s/edit", orderMethod.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrderTypes return list of order types
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-order-types
func (c *Client) OrderTypes() (OrderTypesResponse, int, error) {
var resp OrderTypesResponse
data, status, err := c.GetRequest("/reference/order-types")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// OrderTypeEdit create/edit order type
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-order-methods-code-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrderTypeEdit(retailcrm.OrderType{
// Code: "order-type-1",
// Active: false,
// DefaultForCRM: false,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) OrderTypeEdit(orderType OrderType) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&orderType)
p := url.Values{
"orderType": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/order-types/%s/edit", orderType.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PaymentStatuses returns list of payment statuses
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-payment-statuses
func (c *Client) PaymentStatuses() (PaymentStatusesResponse, int, error) {
var resp PaymentStatusesResponse
data, status, err := c.GetRequest("/reference/payment-statuses")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PaymentStatusEdit payment status creation/editing
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-payment-statuses-code-edit
func (c *Client) PaymentStatusEdit(paymentStatus PaymentStatus) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&paymentStatus)
p := url.Values{
"paymentStatus": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/payment-statuses/%s/edit", paymentStatus.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PaymentTypes returns list of payment types
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-payment-types
func (c *Client) PaymentTypes() (PaymentTypesResponse, int, error) {
var resp PaymentTypesResponse
data, status, err := c.GetRequest("/reference/payment-types")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PaymentTypeEdit payment type create/edit
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-payment-types-code-edit
func (c *Client) PaymentTypeEdit(paymentType PaymentType) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&paymentType)
p := url.Values{
"paymentType": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/payment-types/%s/edit", paymentType.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PriceTypes returns list of price types
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-price-types
func (c *Client) PriceTypes() (PriceTypesResponse, int, error) {
var resp PriceTypesResponse
data, status, err := c.GetRequest("/reference/price-types")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PriceTypeEdit price type create/edit
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-price-types-code-edit
func (c *Client) PriceTypeEdit(priceType PriceType) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&priceType)
p := url.Values{
"priceType": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/price-types/%s/edit", priceType.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// ProductStatuses returns list of item statuses in order
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-product-statuses
func (c *Client) ProductStatuses() (ProductStatusesResponse, int, error) {
var resp ProductStatusesResponse
data, status, err := c.GetRequest("/reference/product-statuses")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// ProductStatusEdit order item status create/edit
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-product-statuses-code-edit
func (c *Client) ProductStatusEdit(productStatus ProductStatus) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&productStatus)
p := url.Values{
"productStatus": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/product-statuses/%s/edit", productStatus.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Sites returns the sites list
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-sites
func (c *Client) Sites() (SitesResponse, int, error) {
var resp SitesResponse
data, status, err := c.GetRequest("/reference/sites")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// SiteEdit site create/edit
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-sites-code-edit
func (c *Client) SiteEdit(site Site) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&site)
p := url.Values{
"site": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/sites/%s/edit", site.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// StatusGroups returns list of order status groups
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-status-groups
func (c *Client) StatusGroups() (StatusGroupsResponse, int, error) {
var resp StatusGroupsResponse
data, status, err := c.GetRequest("/reference/status-groups")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Statuses returns list of order statuses
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-statuses
func (c *Client) Statuses() (StatusesResponse, int, error) {
var resp StatusesResponse
data, status, err := c.GetRequest("/reference/statuses")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// StatusEdit order status create/edit
//
// For more information see www.retailcrm.pro/docs/Developers/ApiVersion5#post--api-v5-reference-sites-code-edit.
func (c *Client) StatusEdit(st Status) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&st)
p := url.Values{
"status": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/statuses/%s/edit", st.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Stores returns list of warehouses
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-stores
func (c *Client) Stores() (StoresResponse, int, error) {
var resp StoresResponse
data, status, err := c.GetRequest("/reference/stores")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// StoreEdit warehouse create/edit
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-stores-code-edit
func (c *Client) StoreEdit(store Store) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&store)
p := url.Values{
"store": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/stores/%s/edit", store.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Units returns units list
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-reference-units
func (c *Client) Units() (UnitsResponse, int, error) {
var resp UnitsResponse
data, status, err := c.GetRequest("/reference/units")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// UnitEdit unit create/edit
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-reference-units-code-edit
func (c *Client) UnitEdit(unit Unit) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
objJSON, _ := json.Marshal(&unit)
p := url.Values{
"unit": {string(objJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/reference/units/%s/edit", unit.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Segments returns segments
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-segments
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Segments(SegmentsRequest{
// Filter: retailcrm.SegmentsFilter{
// Ids: []int{1,2,3}
// }
// })
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
//
// for _, value := range data.Segments {
// fmt.Printf("%v\n", value)
// }
func (c *Client) Segments(parameters SegmentsRequest) (SegmentsResponse, int, error) {
var resp SegmentsResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/segments?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Settings returns system settings
//
// For more information see https://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-settings
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Settings()
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
//
// fmt.Printf("%#v\n", data)
func (c *Client) Settings() (SettingsResponse, int, error) {
var resp SettingsResponse
data, status, err := c.GetRequest("/settings")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Inventories returns leftover stocks and purchasing prices
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-store-inventories
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Inventories(retailcrm.InventoriesRequest{Filter: retailcrm.InventoriesFilter{Details: 1, ProductActive: 1}, Page: 1})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Offers {
// log.Printf("%v\n", value)
// }
func (c *Client) Inventories(parameters InventoriesRequest) (InventoriesResponse, int, error) {
var resp InventoriesResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/store/inventories?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// InventoriesUpload updates the leftover stocks and purchasing prices
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-store-inventories-upload
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.InventoriesUpload(
// []retailcrm.InventoryUpload{
// {
// XMLID: "pT22K9YzX21HTdzFCe1",
// Stores: []InventoryUploadStore{
// {Code: "test-store-v5", Available: 10, PurchasePrice: 1500},
// {Code: "test-store-v4", Available: 20, PurchasePrice: 1530},
// {Code: "test-store", Available: 30, PurchasePrice: 1510},
// },
// },
// {
// XMLID: "JQICtiSpOV3AAfMiQB3",
// Stores: []InventoryUploadStore{
// {Code: "test-store-v5", Available: 45, PurchasePrice: 1500},
// {Code: "test-store-v4", Available: 32, PurchasePrice: 1530},
// {Code: "test-store", Available: 46, PurchasePrice: 1510},
// },
// },
// },
// )
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
//
// fmt.Printf("%v\n", data.NotFoundOffers)
func (c *Client) InventoriesUpload(inventories []InventoryUpload, site ...string) (StoreUploadResponse, int, error) {
var resp StoreUploadResponse
uploadJSON, _ := json.Marshal(&inventories)
p := url.Values{
"offers": {string(uploadJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/store/inventories/upload", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// PricesUpload updates prices
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-store-prices-upload
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.PricesUpload([]retailcrm.OfferPriceUpload{
// {
// ID 1
// Site "store-1"
// Prices []PriceUpload{{Code: "price-1"}}
// },
// {
// ID 2
// Site "store-1"
// Prices []PriceUpload{{Code: "price-2"}}
// },
// })
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
//
// fmt.Printf("%v\n", data.NotFoundOffers)
func (c *Client) PricesUpload(prices []OfferPriceUpload) (StoreUploadResponse, int, error) {
var resp StoreUploadResponse
uploadJSON, _ := json.Marshal(&prices)
p := url.Values{
"prices": {string(uploadJSON)},
}
data, status, err := c.PostRequest("/store/prices/upload", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// ProductsGroup returns list of product groups
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-store-product-groups
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.ProductsGroup(retailcrm.ProductsGroupsRequest{
// Filter: retailcrm.ProductsGroupsFilter{
// Active: 1,
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.ProductGroup {
// log.Printf("%v\n", value)
// }
func (c *Client) ProductsGroup(parameters ProductsGroupsRequest) (ProductsGroupsResponse, int, error) {
var resp ProductsGroupsResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/store/product-groups?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Products returns list of products and SKU
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-store-products
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Products(retailcrm.ProductsRequest{
// Filter: retailcrm.ProductsFilter{
// Active: 1,
// MinPrice: 1000,
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Products {
// log.Printf("%v\n", value)
// }
func (c *Client) Products(parameters ProductsRequest) (ProductsResponse, int, error) {
var resp ProductsResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/store/products?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// ProductsProperties returns list of item properties, matching the specified filters
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-store-products-properties
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.ProductsProperties(retailcrm.ProductsPropertiesRequest{
// Filter: retailcrm.ProductsPropertiesFilter{
// Sites: []string["store"],
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Properties {
// log.Printf("%v\n", value)
// }
func (c *Client) ProductsProperties(parameters ProductsPropertiesRequest) (ProductsPropertiesResponse, int, error) {
var resp ProductsPropertiesResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/store/products/properties?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Tasks returns task list
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-tasks
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Tasks(retailcrm.TasksRequest{
// Filter: TasksFilter{
// DateFrom: "2012-12-12",
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Tasks {
// log.Printf("%v\n", value)
// }
func (c *Client) Tasks(parameters TasksRequest) (TasksResponse, int, error) {
var resp TasksResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/tasks?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// TaskCreate create a task
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-tasks-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Tasks(retailcrm.Task{
// Text: "task №1",
// PerformerID: 12,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.ID)
// }
func (c *Client) TaskCreate(task Task, site ...string) (CreateResponse, int, error) {
var resp CreateResponse
taskJSON, _ := json.Marshal(&task)
p := url.Values{
"task": {string(taskJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/tasks/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Task returns task
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-tasks-id
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Task(12)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.Task)
// }
func (c *Client) Task(id int) (TaskResponse, int, error) {
var resp TaskResponse
data, status, err := c.GetRequest(fmt.Sprintf("/tasks/%d", id))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// TaskEdit edit a task
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-tasks-id-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Task(retailcrm.Task{
// ID: 12
// Text: "task №2",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) TaskEdit(task Task, site ...string) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
var uid = strconv.Itoa(task.ID)
taskJSON, _ := json.Marshal(&task)
p := url.Values{
"task": {string(taskJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/tasks/%s/edit", uid), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
if !resp.Success {
a := CreateAPIError(data)
return resp, status, a
}
return resp, status, nil
}
// UserGroups returns list of user groups
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-user-groups
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.UserGroups(retailcrm.UserGroupsRequest{Page: 1})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Groups {
// log.Printf("%v\n", value)
// }
func (c *Client) UserGroups(parameters UserGroupsRequest) (UserGroupsResponse, int, error) {
var resp UserGroupsResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/user-groups?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Users returns list of users matched the specified filters
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-users
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Users(retailcrm.UsersRequest{Filter: retailcrm.UsersFilter{Active: 1}, Page: 1})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Users {
// log.Printf("%v\n", value)
// }
func (c *Client) Users(parameters UsersRequest) (UsersResponse, int, error) {
var resp UsersResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/users?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// User returns information about user
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-users-id
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.User(12)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.User)
// }
func (c *Client) User(id int) (UserResponse, int, error) {
var resp UserResponse
data, status, err := c.GetRequest(fmt.Sprintf("/users/%d", id))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// UserStatus change user status
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-users
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.UserStatus(12, "busy")
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) UserStatus(id int, status string) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
p := url.Values{
"status": {status},
}
data, st, err := c.PostRequest(fmt.Sprintf("/users/%d/status", id), p)
if err != nil {
return resp, st, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, st, err
}
if !resp.Success {
return resp, st, CreateAPIError(data)
}
return resp, st, nil
}
// StaticticsUpdate updates statistics
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-statistic-update
func (c *Client) StaticticsUpdate() (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
data, status, err := c.GetRequest("/statistic/update")
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Costs returns costs list
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-costs
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Costs(CostsRequest{
// Filter: CostsFilter{
// Ids: []string{"1","2","3"},
// MinSumm: "1000"
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.Costs {
// log.Printf("%v\n", value.Summ)
// }
func (c *Client) Costs(costs CostsRequest) (CostsResponse, int, error) {
var resp CostsResponse
params, _ := query.Values(costs)
data, status, err := c.GetRequest(fmt.Sprintf("/costs?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CostCreate create the cost
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-costs-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CostCreate(
// retailcrm.CostRecord{
// DateFrom: "2012-12-12",
// DateTo: "2012-12-12",
// Summ: 12,
// CostItem: "calculation-of-costs",
// Order: Order{
// Number: "1"
// },
// Sites: []string{"store"},
// },
// "store"
// )
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// If data.Success == true {
// log.Printf("%v", data.ID)
// }
func (c *Client) CostCreate(cost CostRecord, site ...string) (CreateResponse, int, error) {
var resp CreateResponse
costJSON, _ := json.Marshal(&cost)
p := url.Values{
"cost": {string(costJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest("/costs/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CostsDelete removes a cost
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-costs-delete
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.client.CostsDelete([]int{1, 2, 3, 48, 49, 50})
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// If data.Success == true {
// log.Printf("Not removed costs: %v", data.NotRemovedIds)
// }
func (c *Client) CostsDelete(ids []int) (CostsDeleteResponse, int, error) {
var resp CostsDeleteResponse
costJSON, _ := json.Marshal(&ids)
p := url.Values{
"ids": {string(costJSON)},
}
data, status, err := c.PostRequest("/costs/delete", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CostsUpload batch costs upload
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-costs-upload
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CostCreate([]retailcrm.CostRecord{
// {
// DateFrom: "2012-12-12",
// DateTo: "2012-12-12",
// Summ: 12,
// CostItem: "calculation-of-costs",
// Order: Order{
// Number: "1"
// },
// Sites: []string{"store"},
// },
// {
// DateFrom: "2012-12-13",
// DateTo: "2012-12-13",
// Summ: 13,
// CostItem: "seo",
// }
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// If data.Success == true {
// log.Printf("Uploaded costs: %v", data.UploadedCosts)
// }
func (c *Client) CostsUpload(cost []CostRecord) (CostsUploadResponse, int, error) {
var resp CostsUploadResponse
costJSON, _ := json.Marshal(&cost)
p := url.Values{
"costs": {string(costJSON)},
}
data, status, err := c.PostRequest("/costs/upload", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Cost returns information about specified cost
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-costs-id
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Cost(1)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// If data.Success == true {
// log.Printf("%v", data.Cost)
// }
func (c *Client) Cost(id int) (CostResponse, int, error) {
var resp CostResponse
data, status, err := c.GetRequest(fmt.Sprintf("/costs/%d", id))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CostDelete removes cost
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-costs-id-delete
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CostDelete(1)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) CostDelete(id int) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
costJSON, _ := json.Marshal(&id)
p := url.Values{
"costs": {string(costJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/costs/%d/delete", id), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CostEdit edit a cost
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-costs-id-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CostEdit(1, retailcrm.Cost{
// DateFrom: "2012-12-12",
// DateTo: "2018-12-13",
// Summ: 321,
// CostItem: "seo",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// If data.Success == true {
// log.Printf("%v", data.ID)
// }
func (c *Client) CostEdit(id int, cost CostRecord, site ...string) (CreateResponse, int, error) {
var resp CreateResponse
costJSON, _ := json.Marshal(&cost)
p := url.Values{
"cost": {string(costJSON)},
}
fillSite(&p, site)
data, status, err := c.PostRequest(fmt.Sprintf("/costs/%d/edit", id), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// Files returns files list
//
// For more information see https://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-files
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.Files(FilesRequest{
// Filter: FilesFilter{
// Filename: "image.jpeg",
// },
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) Files(files FilesRequest) (FilesResponse, int, error) {
var resp FilesResponse
params, _ := query.Values(files)
data, status, err := c.GetRequest(fmt.Sprintf("/files?%s", params.Encode()))
if err != nil && err.Error() != "" {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// FileUpload uploads file to RetailCRM
//
// For more information see https://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-files
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// file, err := os.Open("file.jpg")
// if err != nil {
// fmt.Print(err)
// }
//
// data, status, err := client.FileUpload(file)
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
func (c *Client) FileUpload(reader io.Reader) (FileUploadResponse, int, error) {
var resp FileUploadResponse
data, status, err := c.PostRequest("/files/upload", reader, "application/octet-stream")
if err != nil && err.Error() != "" {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// File returns a file info
//
// For more information see https://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-files
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.File(112)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v\n", data.File)
// }
func (c *Client) File(id int) (FileResponse, int, error) {
var resp FileResponse
data, status, err := c.GetRequest(fmt.Sprintf("/files/%d", id))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// FileDelete removes file from RetailCRM
//
// For more information see https://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-files
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.FileDelete(123)
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
func (c *Client) FileDelete(id int) (SuccessfulResponse, int, error) {
var resp SuccessfulResponse
data, status, err := c.PostRequest(fmt.Sprintf("/files/%d/delete", id), strings.NewReader(""))
if err != nil && err.Error() != "" {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// FileDownload downloads file from RetailCRM
//
// For more information see https://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-files
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// fileData, status, err := client.FileDownload(123)
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
func (c *Client) FileDownload(id int) (io.ReadCloser, int, error) {
data, status, err := c.GetRequest(fmt.Sprintf("/files/%d/download", id))
if status != http.StatusOK {
return nil, status, err
}
closer := ioutil.NopCloser(bytes.NewReader(data))
return closer, status, nil
}
// FileEdit edits file name and relations with orders and customers in RetailCRM
//
// For more information see https://help.retailcrm.pro/Developers/ApiVersion5#get--api-v5-files
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.FileEdit(123, File{Filename: "image2.jpg"})
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
func (c *Client) FileEdit(id int, file File) (FileResponse, int, error) {
var resp FileResponse
req, _ := json.Marshal(file)
data, status, err := c.PostRequest(
fmt.Sprintf("/files/%d/edit", id), url.Values{
"file": {string(req)},
},
)
if err != nil && err.Error() != "" {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomFields returns list of custom fields
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-custom-fields
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomFields(retailcrm.CustomFieldsRequest{
// Type: "string",
// Entity: "customer",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.CustomFields {
// fmt.Printf("%v\n", value)
// }
func (c *Client) CustomFields(customFields CustomFieldsRequest) (CustomFieldsResponse, int, error) {
var resp CustomFieldsResponse
params, _ := query.Values(customFields)
data, status, err := c.GetRequest(fmt.Sprintf("/custom-fields?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomDictionaries returns list of custom directory
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-custom-fields-dictionaries
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomDictionaries(retailcrm.CustomDictionariesRequest{
// Filter: retailcrm.CustomDictionariesFilter{
// Name: "Dictionary-1",
// },
// })
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
//
// for _, value := range data.CustomDictionaries {
// fmt.Printf("%v\n", value.Elements)
// }
func (c *Client) CustomDictionaries(customDictionaries CustomDictionariesRequest) (
CustomDictionariesResponse, int, error,
) {
var resp CustomDictionariesResponse
params, _ := query.Values(customDictionaries)
data, status, err := c.GetRequest(fmt.Sprintf("/custom-fields/dictionaries?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomDictionariesCreate creates a custom dictionary
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-custom-fields-dictionaries-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomDictionariesCreate(retailcrm.CustomDictionary{
// Name: "Courier profiles",
// Code: "courier-profiles",
// Elements: []Element{
// {
// Name: "Name",
// Code: "name",
// },
// {
// Name: "Lastname",
// Code: "lastname",
// }
// },
// })
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
//
// If data.Success == true {
// fmt.Printf("%v", data.Code)
// }
func (c *Client) CustomDictionariesCreate(customDictionary CustomDictionary) (CustomResponse, int, error) {
var resp CustomResponse
costJSON, _ := json.Marshal(&customDictionary)
p := url.Values{
"customDictionary": {string(costJSON)},
}
data, status, err := c.PostRequest("/custom-fields/dictionaries/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomDictionary returns information about dictionary
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-custom-fields-entity-code
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomDictionary("courier-profiles")
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// If data.Success == true {
// log.Printf("%v", data.CustomDictionary.Name)
// }
func (c *Client) CustomDictionary(code string) (CustomDictionaryResponse, int, error) {
var resp CustomDictionaryResponse
data, status, err := c.GetRequest(fmt.Sprintf("/custom-fields/dictionaries/%s", code))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomDictionaryEdit edit custom dictionary
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-custom-fields-dictionaries-code-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomDictionaryEdit(retailcrm.CustomDictionary{
// Name: "Courier profiles",
// Code: "courier-profiles",
// Elements: []Element{
// {
// Name: "Name",
// Code: "name",
// },
// {
// Name: "Lastname",
// Code: "lastname",
// }
// },
// })
//
// if err.Error() != "" {
// fmt.Printf("%v", err.Error())
// }
//
// if status >= http.StatusBadRequest {
// fmt.Printf("%v", err.Error())
// }
//
// If data.Success == true {
// fmt.Printf("%v", data.Code)
// }
func (c *Client) CustomDictionaryEdit(customDictionary CustomDictionary) (CustomResponse, int, error) {
var resp CustomResponse
costJSON, _ := json.Marshal(&customDictionary)
p := url.Values{
"customDictionary": {string(costJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/custom-fields/dictionaries/%s/edit", customDictionary.Code), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomFieldsCreate creates custom field
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-custom-fields-entity-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomFieldsCreate(CustomFields{
// Name: "First order",
// Code: "first-order",
// Type: "bool",
// Entity: "order",
// DisplayArea: "customer",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// If data.Success == true {
// log.Printf("%v", data.Code)
// }
func (c *Client) CustomFieldsCreate(customFields CustomFields) (CustomResponse, int, error) {
var resp CustomResponse
costJSON, _ := json.Marshal(&customFields)
p := url.Values{
"customField": {string(costJSON)},
}
data, status, err := c.PostRequest(fmt.Sprintf("/custom-fields/%s/create", customFields.Entity), p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomField returns information about custom fields
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-custom-fields-entity-code
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomField("order", "first-order")
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// If data.Success == true {
// log.Printf("%v", data.CustomField)
// }
func (c *Client) CustomField(entity, code string) (CustomFieldResponse, int, error) {
var resp CustomFieldResponse
data, status, err := c.GetRequest(fmt.Sprintf("/custom-fields/%s/%s", entity, code))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// CustomFieldEdit list method
//
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-custom-fields-entity-code-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.CustomFieldEdit(CustomFields{
// Code: "first-order",
// Entity: "order",
// DisplayArea: "delivery",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// If data.Success == true {
// log.Printf("%v", data.Code)
// }
func (c *Client) CustomFieldEdit(customFields CustomFields) (CustomResponse, int, error) {
var resp CustomResponse
costJSON, _ := json.Marshal(&customFields)
p := url.Values{
"customField": {string(costJSON)},
}
data, status, err := c.PostRequest(
fmt.Sprintf("/custom-fields/%s/%s/edit", customFields.Entity, customFields.Code), p,
)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// BonusOperations returns history of the bonus account for all participations
//
// For more information see https://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-loyalty-bonus-operations
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.BonusOperations(retailcrm.BonusOperationsRequest{
// Filter: BonusOperationsFilter{
// LoyaltyId: []int{123, 456},
// },
// Limit: 20,
// Cursor: "123456",
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.BonusOperations {
// log.Printf("%v\n", value)
// }
func (c *Client) BonusOperations(parameters BonusOperationsRequest) (BonusOperationsResponse, int, error) {
var resp BonusOperationsResponse
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf("/loyalty/bonus/operations?%s", params.Encode()))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// AccountBonusOperations returns history of the bonus account for a specific participation
//
// For more information see https://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-loyalty-account-id-bonus-operations
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.AccountBonusOperations(retailcrm.AccountBonusOperationsRequest{
// Filter: AccountBonusOperationsFilter{
// CreatedAtFrom: "2012-12-12",
// CreatedAtTo: "2012-12-13",
// },
// Limit: 20,
// Page: 3,
// })
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// for _, value := range data.BonusOperations {
// log.Printf("%v\n", value)
// }
func (c *Client) AccountBonusOperations(id int, parameters AccountBonusOperationsRequest) (BonusOperationsResponse, int, error) {
var resp BonusOperationsResponse
if id == 0 {
c.writeLog("cannot get loyalty bonus operations for user with id %d", id)
}
params, _ := query.Values(parameters)
data, status, err := c.GetRequest(fmt.Sprintf(
"/loyalty/account/%d/bonus/operations?%s",
id, params.Encode(),
))
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// ProductsBatchEdit perform editing products batch
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-store-products-batch-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// products := []ProductEdit{{
// CatalogID: 3,
// BaseProduct: BaseProduct{
// Name: "Product 1",
// URL: "https://example.com/p/1",
// Article: "p1",
// ExternalID: "ext1",
// },
// ID: 194,
// Site: "second",
// Groups: []ProductEditGroupInput{{ID: 19}},
// }}
//
// data, status, err := client.ProductsBatchEdit(products)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", data.ProcessedProductsCount)
// }
func (c *Client) ProductsBatchEdit(products []ProductEdit) (ProductsBatchEditResponse, int, error) {
var resp ProductsBatchEditResponse
productsEditJSON, _ := json.Marshal(products)
p := url.Values{
"products": {string(productsEditJSON)},
}
data, status, err := c.PostRequest("/store/products/batch/edit", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// ProductsBatchCreate perform adding products batch
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-store-products-batch-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// products := []ProductCreate{{
// CatalogID: 3,
// BaseProduct: BaseProduct{
// Name: "Product 1",
// URL: "https://example.com/p/1",
// Article: "p1",
// ExternalID: "ext1",
// },
// Groups: []ProductEditGroupInput{{ID: 19}},
// }}
//
// data, status, err := client.ProductsBatchCreate(products)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", data.AddedProducts)
// }
func (c *Client) ProductsBatchCreate(products []ProductCreate) (ProductsBatchEditResponse, int, error) {
var resp ProductsBatchEditResponse
productsEditJSON, _ := json.Marshal(products)
p := url.Values{
"products": {string(productsEditJSON)},
}
data, status, err := c.PostRequest("/store/products/batch/create", p)
if err != nil {
return resp, status, err
}
err = json.Unmarshal(data, &resp)
if err != nil {
return resp, status, err
}
return resp, status, nil
}
// LoyaltyAccountCreate аdd a client to the loyalty program
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-loyalty-account-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
// acc := SerializedCreateLoyaltyAccount{
// SerializedBaseLoyaltyAccount: SerializedBaseLoyaltyAccount{
// PhoneNumber: "89151005004",
// CustomFields: []string{"dog"},
// },
// Customer: SerializedEntityCustomer{
// ID: 123,
// },
// }
//
// data, status, err := client.LoyaltyAccountCreate("site", acc)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", data.LoyaltyAccount.ID)
// }
func (c *Client) LoyaltyAccountCreate(site string, loyaltyAccount SerializedCreateLoyaltyAccount) (CreateLoyaltyAccountResponse, int, error) {
var result CreateLoyaltyAccountResponse
loyaltyAccountJSON, _ := json.Marshal(loyaltyAccount)
p := url.Values{
"site": {site},
"loyaltyAccount": {string(loyaltyAccountJSON)},
}
resp, status, err := c.PostRequest("/loyalty/account/create", p)
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// LoyaltyAccountEdit edit a client in the loyalty program
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-loyalty-account-id-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
// acc := SerializedEditLoyaltyAccount{
// SerializedBaseLoyaltyAccount: SerializedBaseLoyaltyAccount{
// PhoneNumber: "89151005004",
// CustomFields: []string{"dog"},
// },
// }
//
// data, status, err := client.LoyaltyAccountEdit(13, acc)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", data.LoyaltyAccount.PhoneNumber)
// }
func (c *Client) LoyaltyAccountEdit(id int, loyaltyAccount SerializedEditLoyaltyAccount) (EditLoyaltyAccountResponse, int, error) {
var result EditLoyaltyAccountResponse
loyaltyAccountJSON, _ := json.Marshal(loyaltyAccount)
p := url.Values{
"loyaltyAccount": {string(loyaltyAccountJSON)},
}
resp, status, err := c.PostRequest(fmt.Sprintf("/loyalty/account/%d/edit", id), p)
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// LoyaltyAccount return information about client in the loyalty program
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#get--api-v5-loyalty-account-id
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.LoyaltyAccount(13)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", data.LoyaltyAccount.PhoneNumber)
// }
func (c *Client) LoyaltyAccount(id int) (LoyaltyAccountResponse, int, error) {
var result LoyaltyAccountResponse
resp, status, err := c.GetRequest(fmt.Sprintf("/loyalty/account/%d", id))
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// LoyaltyAccountActivate activate participation in the loyalty program for client
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-loyalty-account-id-activate
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.LoyaltyAccountActivate(13)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", data.LoyaltyAccount.Active)
// }
func (c *Client) LoyaltyAccountActivate(id int) (LoyaltyAccountActivateResponse, int, error) {
var result LoyaltyAccountActivateResponse
resp, status, err := c.PostRequest(fmt.Sprintf("/loyalty/account/%d/activate", id), strings.NewReader(""))
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// LoyaltyBonusCredit accrue bonus participation in the program of loyalty
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-loyalty-account-id-bonus-credit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// req := LoyaltyBonusCreditRequest{
// Amount: 120,
// ExpiredDate: "2023-11-24 12:39:37",
// Comment: "Test",
// }
//
// data, status, err := client.LoyaltyBonusCredit(13, req)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", data.LoyaltyBonus.ActivationDate)
// }
func (c *Client) LoyaltyBonusCredit(id int, req LoyaltyBonusCreditRequest) (LoyaltyBonusCreditResponse, int, error) {
var result LoyaltyBonusCreditResponse
p, _ := query.Values(req)
resp, status, err := c.PostRequest(fmt.Sprintf("/loyalty/account/%d/bonus/credit", id), p)
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// LoyaltyBonusStatusDetails get details on the bonus account
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#get--api-v5-loyalty-account-id-bonus-status-details
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// req := LoyaltyBonusStatusDetailsRequest{
// Limit: 20,
// Page: 3,
// }
//
// data, status, err := client.LoyaltyBonusStatusDetails(13, "waiting_activation", req)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// for _, bonus := range data.Bonuses {
// log.Printf("%v", bonus.Amount)
// }
// }
func (c *Client) LoyaltyBonusStatusDetails(
id int, statusType string, request LoyaltyBonusStatusDetailsRequest,
) (LoyaltyBonusDetailsResponse, int, error) {
var result LoyaltyBonusDetailsResponse
p, _ := query.Values(request)
resp, status, err := c.GetRequest(fmt.Sprintf("/loyalty/account/%d/bonus/%s/details?%s", id, statusType, p.Encode()))
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// LoyaltyAccounts return list of participations in the loyalty program
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#get--api-v5-loyalty-accounts
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// req := LoyaltyAccountsRequest{
// Filter: LoyaltyAccountAPIFilter{
// Status: "activated",
// PhoneNumber: "89185556363",
// Ids: []int{14},
// Level: 5,
// Loyalties: []int{2},
// CustomerID: "109",
// },
// }
//
// data, status, err := client.LoyaltyAccounts(req)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// for _, account := range data.LoyaltyAccounts {
// log.Printf("%v", account.Status)
// }
// }
func (c *Client) LoyaltyAccounts(req LoyaltyAccountsRequest) (LoyaltyAccountsResponse, int, error) {
var result LoyaltyAccountsResponse
p, _ := query.Values(req)
resp, status, err := c.GetRequest(fmt.Sprintf("/loyalty/accounts?%s", p.Encode()))
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// LoyaltyCalculate calculations of the maximum discount
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-loyalty-calculate
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// req := LoyaltyCalculateRequest{
// Site: "main",
// Order: Order{
// PrivilegeType: "loyalty_level",
// Customer: &Customer{
// ID: 123,
// },
// Items: []OrderItem{
// {
// InitialPrice: 10000,
// Quantity: 1,
// Offer: Offer{ID: 214},
// PriceType: &PriceType{Code: "base"},
// },
// },
// },
// Bonuses: 10,
// }
//
// data, status, err := client.LoyaltyCalculate(req)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", data.Order.PrivilegeType)
// log.Printf("%v", data.Order.BonusesCreditTotal)
// }
func (c *Client) LoyaltyCalculate(req LoyaltyCalculateRequest) (LoyaltyCalculateResponse, int, error) {
var result LoyaltyCalculateResponse
orderJSON, _ := json.Marshal(req.Order)
p := url.Values{
"site": {req.Site},
"order": {string(orderJSON)},
"bonuses": {fmt.Sprintf("%f", req.Bonuses)},
}
resp, status, err := c.PostRequest("/loyalty/calculate", p)
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// GetLoyalties returns list of loyalty programs
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#get--api-v5-loyalty-loyalties
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// req := LoyaltiesRequest{
// Filter: LoyaltyAPIFilter{
// Active: active,
// Ids: []int{2},
// Sites: []string{"main"},
// },
// }
//
// data, status, err := client.GetLoyalties(req)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// for _, l := range data.Loyalties {
// log.Printf("%v", l.ID)
// log.Printf("%v", l.Active)
// }
// }
func (c *Client) GetLoyalties(req LoyaltiesRequest) (LoyaltiesResponse, int, error) {
var result LoyaltiesResponse
p, _ := query.Values(req)
resp, status, err := c.GetRequest(fmt.Sprintf("/loyalty/loyalties?%s", p.Encode()))
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// GetLoyaltyByID return program of loyalty by id
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#get--api-v5-loyalty-loyalties-id
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.GetLoyaltyByID(2)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", res.Loyalty.ID)
// log.Printf("%v", res.Loyalty.Active)
// }
func (c *Client) GetLoyaltyByID(id int) (LoyaltyResponse, int, error) {
var result LoyaltyResponse
resp, status, err := c.GetRequest(fmt.Sprintf("/loyalty/loyalties/%d", id))
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// OrderIntegrationDeliveryCancel cancels of integration delivery
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-orders-externalId-delivery-cancel
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.OrderIntegrationDeliveryCancel("externalId", false, "1001C")
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", res.Success)
// }
func (c *Client) OrderIntegrationDeliveryCancel(by string, force bool, id string) (SuccessfulResponse, int, error) {
var result SuccessfulResponse
p := url.Values{
"by": {checkBy(by)},
"force": {fmt.Sprintf("%t", force)},
}
resp, status, err := c.PostRequest(fmt.Sprintf("/orders/%s/delivery/cancel?%s", id, p.Encode()), strings.NewReader(""))
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// CreateProductsGroup adds a product group
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-store-product-groups-create
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// group := ProductGroup{
// ParentID: 125,
// Name: "Фрукты",
// Site: "main",
// Active: true,
// ExternalID: "abc22",
// }
//
// data, status, err := client.CreateProductsGroup(group)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", res.ID)
// }
func (c *Client) CreateProductsGroup(group ProductGroup) (ActionProductsGroupResponse, int, error) {
var result ActionProductsGroupResponse
groupJSON, _ := json.Marshal(group)
p := url.Values{
"productGroup": {string(groupJSON)},
}
resp, status, err := c.PostRequest("/store/product-groups/create", p)
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// EditProductsGroup edits a product group
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-store-product-groups-externalId-edit
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// group := ProductGroup{
// Name: "Овощи",
// Active: true,
// ExternalID: "abc22",
// }
//
// data, status, err := client.EditProductsGroup("id", "125", "main", group)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data.Success == true {
// log.Printf("%v", res.ID)
// }
func (c *Client) EditProductsGroup(by, id, site string, group ProductGroup) (ActionProductsGroupResponse, int, error) {
var result ActionProductsGroupResponse
groupJSON, _ := json.Marshal(group)
p := url.Values{
"by": {checkBy(by)},
"site": {site},
"productGroup": {string(groupJSON)},
}
resp, status, err := c.PostRequest(fmt.Sprintf("/store/product-groups/%s/edit", id), p)
if err != nil {
return result, status, err
}
err = json.Unmarshal(resp, &result)
if err != nil {
return result, status, err
}
return result, status, nil
}
// GetOrderPlate receives a print form file for the order
//
// # Body of response is already closed
//
// For more information see https://help.retailcrm.ru/api_v5_ru.html#get--api-v5-orders-externalId-plates-plateId-print
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// data, status, err := client.GetOrderPlate("id", "107", "main", 1)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
//
// if data != nil {
// fileData, err := io.ReadAll(data)
// if err != nil {
// return
// }
//
// log.Printf("%s", fileData)
// }
func (c *Client) GetOrderPlate(by, orderID, site string, plateID int) (io.ReadCloser, int, error) {
p := url.Values{
"by": {checkBy(by)},
"site": {site},
}
requestURL := fmt.Sprintf("%s/api/v5/orders/%s/plates/%d/print?%s", c.URL, orderID, plateID, p.Encode())
req, err := http.NewRequest("GET", requestURL, nil)
if err != nil {
return nil, 0, err
}
req.Header.Set("X-API-KEY", c.Key)
if c.Debug {
c.writeLog("API Request: %s %s", requestURL, c.Key)
}
resp, err := c.httpClient.Do(req)
if err != nil {
return nil, 0, err
}
if resp.StatusCode >= http.StatusInternalServerError {
return nil, resp.StatusCode, CreateGenericAPIError(
fmt.Sprintf("HTTP request error. Status code: %d.", resp.StatusCode))
}
if resp.StatusCode >= http.StatusBadRequest && resp.StatusCode < http.StatusInternalServerError {
res, err := buildRawResponse(resp)
if err != nil {
return nil, 0, err
}
return nil, resp.StatusCode, CreateAPIError(res)
}
reader := resp.Body
err = reader.Close()
if err != nil {
return nil, 0, err
}
return reader, resp.StatusCode, nil
}
// NotificationsSend send a notification
//
// For more information see https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-notifications-send
//
// Example:
//
// var client = retailcrm.New("https://demo.url", "09jIJ")
//
// req := retailcrm.NotificationsSendRequest{
// UserGroups: []retailcrm.UserGroupType{retailcrm.UserGroupSuperadmins},
// Type: retailcrm.NotificationTypeInfo,
// Message: "Hello everyone!",
// }
//
// status, err := client.NotificationsSend(req)
//
// if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok {
// log.Fatalf("http status: %d, %s", status, apiErr.String())
// }
//
// log.Fatalf("http status: %d, error: %s", status, err)
// }
func (c *Client) NotificationsSend(req NotificationsSendRequest) (int, error) {
marshaled, err := json.Marshal(req)
if err != nil {
return 0, err
}
_, status, err := c.PostRequest("/notifications/send",
url.Values{"notification": {string(marshaled)}})
if err != nil {
return status, err
}
return status, nil
}