mirror of
https://github.com/retailcrm/api-client-go.git
synced 2024-11-22 04:46:03 +03:00
add new API methods & new parameters
This commit is contained in:
commit
c2a33378b8
1
api-client-go
Submodule
1
api-client-go
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 5c6d2ebead217f5916767a9a542117fa496c677b
|
317
client.go
317
client.go
@ -2109,6 +2109,323 @@ func (c *Client) IntegrationModule(code string) (IntegrationModuleResponse, int,
|
|||||||
return resp, status, nil
|
return resp, status, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LinksCreate creates a link
|
||||||
|
//
|
||||||
|
// For more information see https://www.simla.com/docs/Developers/API/APIVersions/APIv5#post--api-v5-orders-links-create
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// var client = retailcrm.New("https://demo.url", "09jIJ")
|
||||||
|
//
|
||||||
|
// data, status, err := client.LinksCreate(retailcrm.SerializedOrderLink{
|
||||||
|
// Comment: "comment for link",
|
||||||
|
// Orders: []retailcrm.LinkedOrder{{ID: 10}, {ID: 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.Println("Creating a link")
|
||||||
|
// }
|
||||||
|
func (c *Client) LinksCreate(link SerializedOrderLink, site ...string) (SuccessfulResponse, int, error) {
|
||||||
|
var resp SuccessfulResponse
|
||||||
|
|
||||||
|
linkJSON, err := json.Marshal(link)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return resp, http.StatusBadRequest, err
|
||||||
|
}
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"link": {string(linkJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
fillSite(&p, site)
|
||||||
|
|
||||||
|
data, status, err := c.PostRequest("/orders/links/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
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClientIdsUpload uploading of web analytics clientId
|
||||||
|
//
|
||||||
|
// For more information see https://docs.simla.com/Developers/API/APIVersions/APIv5#post--api-v5-web-analytics-client-ids-upload
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// var client = retailcrm.New("https://demo.url", "09jIJ")
|
||||||
|
//
|
||||||
|
// data, status, err := client.ClientIdsUpload([]retailcrm.ClientID{
|
||||||
|
// {
|
||||||
|
// Value: "value",
|
||||||
|
// Order: LinkedOrder{ID: 10, ExternalID: "externalID", Number: "number"},
|
||||||
|
// Customer: SerializedEntityCustomer{ID: 10, ExternalID: "externalID"},
|
||||||
|
// Site: "site",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Value: "value",
|
||||||
|
// Order: LinkedOrder{ID: 12, ExternalID: "externalID2", Number: "number2"},
|
||||||
|
// Customer: SerializedEntityCustomer{ID: 12, ExternalID: "externalID2"},
|
||||||
|
// Site: "site2",
|
||||||
|
// },
|
||||||
|
// })
|
||||||
|
//
|
||||||
|
// 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.Println("Upload is successful")
|
||||||
|
// }
|
||||||
|
func (c *Client) ClientIdsUpload(clientIds []ClientID) (ClientIDResponse, int, error) {
|
||||||
|
var resp ClientIDResponse
|
||||||
|
clientIdsJSON, err := json.Marshal(&clientIds)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return resp, http.StatusBadRequest, err
|
||||||
|
}
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"clientIds": {string(clientIdsJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
data, status, err := c.PostRequest("/web-analytics/client-ids/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
|
||||||
|
}
|
||||||
|
|
||||||
|
// SourcesUpload uploading of sources
|
||||||
|
//
|
||||||
|
// For more information see https://docs.simla.com/Developers/API/APIVersions/APIv5#post--api-v5-web-analytics-sources-upload
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// var client = retailcrm.New("https://demo.url", "09jIJ")
|
||||||
|
//
|
||||||
|
// data, status, err := client.SourcesUpload([]retailcrm.Source{
|
||||||
|
// {
|
||||||
|
// Source: "source",
|
||||||
|
// Medium: "medium",
|
||||||
|
// Campaign: "campaign",
|
||||||
|
// Keyword: "keyword",
|
||||||
|
// Content: "content",
|
||||||
|
// ClientID: "10",
|
||||||
|
// Order: LinkedOrder{ID: 10, ExternalID: "externalId", Number: "number"},
|
||||||
|
// Customer: SerializedEntityCustomer{ID: 10, ExternalID: "externalId"},
|
||||||
|
// Site: "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.Println("Upload is successful!")
|
||||||
|
// }
|
||||||
|
func (c *Client) SourcesUpload(sources []Source) (SourcesResponse, int, error) {
|
||||||
|
var resp SourcesResponse
|
||||||
|
sourcesJSON, err := json.Marshal(&sources)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return resp, http.StatusBadRequest, err
|
||||||
|
}
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"sources": {string(sourcesJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
data, status, err := c.PostRequest("/web-analytics/sources/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
|
||||||
|
}
|
||||||
|
|
||||||
|
// Currencies returns a list of currencies
|
||||||
|
//
|
||||||
|
// For more information see https://docs.simla.com/Developers/API/APIVersions/APIv5#get--api-v5-reference-currencies
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// var client = retailcrm.New("https://demo.url", "09jIJ")
|
||||||
|
//
|
||||||
|
// data, status, err := client.Currencies()
|
||||||
|
//
|
||||||
|
// 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.Currencies {
|
||||||
|
// log.Printf("%v\n", value)
|
||||||
|
// }
|
||||||
|
func (c *Client) Currencies() (CurrencyResponse, int, error) {
|
||||||
|
var resp CurrencyResponse
|
||||||
|
|
||||||
|
data, status, err := c.GetRequest("/reference/currencies")
|
||||||
|
if err != nil {
|
||||||
|
return resp, status, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal(data, &resp)
|
||||||
|
if err != nil {
|
||||||
|
return resp, status, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, status, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CurrenciesCreate create currency
|
||||||
|
//
|
||||||
|
// For more information see https://docs.simla.com/Developers/API/APIVersions/APIv5#post--api-v5-reference-currencies-create
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// var client = retailcrm.New("https://demo.url", "09jIJ")
|
||||||
|
//
|
||||||
|
// data, status, err := client.CurrenciesCreate(retailcrm.Currency{
|
||||||
|
// Code: "RUB",
|
||||||
|
// IsBase: true,
|
||||||
|
// IsAutoConvert: true,
|
||||||
|
// AutoConvertExtraPercent: 1,
|
||||||
|
// ManualConvertNominal: 1,
|
||||||
|
// ManualConvertValue: 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.Println("Create currency")
|
||||||
|
// }
|
||||||
|
func (c *Client) CurrenciesCreate(currency Currency) (CurrencyCreateResponse, int, error) {
|
||||||
|
var resp CurrencyCreateResponse
|
||||||
|
currencyJSON, err := json.Marshal(¤cy)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return resp, http.StatusBadRequest, err
|
||||||
|
}
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"currency": {string(currencyJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
data, status, err := c.PostRequest("/reference/currencies/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
|
||||||
|
}
|
||||||
|
|
||||||
|
// CurrenciesEdit edit an currency
|
||||||
|
//
|
||||||
|
// For more information see https://docs.simla.com/Developers/API/APIVersions/APIv5#post--api-v5-reference-currencies-id-edit
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// var client = retailcrm.New("https://demo.url", "09jIJ")
|
||||||
|
//
|
||||||
|
// data, status, err := client.CurrenciesEdit(
|
||||||
|
// retailcrm.Currency{
|
||||||
|
// ID: 10,
|
||||||
|
// Code: "RUB",
|
||||||
|
// IsBase: true,
|
||||||
|
// IsAutoConvert: true,
|
||||||
|
// AutoConvertExtraPercent: 1,
|
||||||
|
// ManualConvertNominal: 1,
|
||||||
|
// ManualConvertValue: 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.Println("Currency was edit")
|
||||||
|
// }
|
||||||
|
func (c *Client) CurrenciesEdit(currency Currency) (SuccessfulResponse, int, error) {
|
||||||
|
var resp SuccessfulResponse
|
||||||
|
var uid = strconv.Itoa(currency.ID)
|
||||||
|
|
||||||
|
currencyJSON, err := json.Marshal(¤cy)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return resp, http.StatusBadRequest, err
|
||||||
|
}
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"currency": {string(currencyJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
data, status, err := c.PostRequest(fmt.Sprintf("/reference/currencies/%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
|
||||||
|
}
|
||||||
|
|
||||||
// IntegrationModuleEdit integration module create/edit
|
// IntegrationModuleEdit integration module create/edit
|
||||||
//
|
//
|
||||||
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-integration-modules-code
|
// For more information see http://www.simla.com/docs/Developers/API/APIVersions/APIv5#get--api-v5-integration-modules-code
|
||||||
|
413
client_test.go
413
client_test.go
@ -1988,6 +1988,419 @@ func TestClient_OrdersOrders_Fail(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestClient_LinksCreate(t *testing.T) {
|
||||||
|
c := client()
|
||||||
|
|
||||||
|
orders := []LinkedOrder{{ID: 10}, {ID: 12}}
|
||||||
|
|
||||||
|
link := SerializedOrderLink{
|
||||||
|
Comment: "comment",
|
||||||
|
Orders: orders,
|
||||||
|
}
|
||||||
|
|
||||||
|
linkJSON, _ := json.Marshal(link)
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"link": {string(linkJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
defer gock.Off()
|
||||||
|
|
||||||
|
gock.New(crmURL).
|
||||||
|
Post("/links/create").
|
||||||
|
BodyString(p.Encode()).
|
||||||
|
Reply(201).
|
||||||
|
BodyString(`{"success": true}`)
|
||||||
|
|
||||||
|
data, status, err := c.LinksCreate(link)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if status >= http.StatusBadRequest {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Success != true {
|
||||||
|
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestClient_LinksCreate_Fail(t *testing.T) {
|
||||||
|
c := client()
|
||||||
|
|
||||||
|
orders := []LinkedOrder{{ID: 10}}
|
||||||
|
|
||||||
|
link := SerializedOrderLink{
|
||||||
|
Comment: "comment",
|
||||||
|
Orders: orders,
|
||||||
|
}
|
||||||
|
|
||||||
|
linkJSON, _ := json.Marshal(link)
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"link": {string(linkJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
defer gock.Off()
|
||||||
|
|
||||||
|
gock.New(crmURL).
|
||||||
|
Post("/links/create").
|
||||||
|
BodyString(p.Encode()).
|
||||||
|
Reply(400).
|
||||||
|
BodyString(`{"errorMsg": "Errors in the entity format", errors: [orders: "This collection should contain 2 elements or more."}`)
|
||||||
|
|
||||||
|
data, _, err := c.LinksCreate(link)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
t.Error("Error must be return")
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Success != false {
|
||||||
|
t.Error(successFail)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestClient_ClientIdsUpload(t *testing.T) {
|
||||||
|
c := client()
|
||||||
|
|
||||||
|
clientIds := []ClientID{
|
||||||
|
{
|
||||||
|
Value: "value",
|
||||||
|
Order: LinkedOrder{ID: 10, ExternalID: "externalID", Number: "number"},
|
||||||
|
Customer: SerializedEntityCustomer{ID: 10, ExternalID: "externalID"},
|
||||||
|
Site: "site",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: "value2",
|
||||||
|
Order: LinkedOrder{ID: 12, ExternalID: "externalID2", Number: "number2"},
|
||||||
|
Customer: SerializedEntityCustomer{ID: 12, ExternalID: "externalID2"},
|
||||||
|
Site: "site2",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
clientIdsJSON, _ := json.Marshal(&clientIds)
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"clientIds": {string(clientIdsJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
defer gock.Off()
|
||||||
|
gock.New(crmURL).
|
||||||
|
Post("/web-analytics/client-ids/upload").
|
||||||
|
BodyString(p.Encode()).
|
||||||
|
Reply(201).
|
||||||
|
BodyString(`{"success": true}`)
|
||||||
|
|
||||||
|
data, status, err := c.ClientIdsUpload(clientIds)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if status >= http.StatusBadRequest {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Success != true {
|
||||||
|
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestClient_ClientIdsUpload_Fail(t *testing.T) {
|
||||||
|
c := client()
|
||||||
|
|
||||||
|
clientIds := []ClientID{
|
||||||
|
{
|
||||||
|
Value: "value",
|
||||||
|
Order: LinkedOrder{ID: 10},
|
||||||
|
Customer: SerializedEntityCustomer{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
clientIdsJSON, _ := json.Marshal(&clientIds)
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"clientIds": {string(clientIdsJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
defer gock.Off()
|
||||||
|
gock.New(crmURL).
|
||||||
|
Post("/web-analytics/client-ids/upload").
|
||||||
|
BodyString(p.Encode()).
|
||||||
|
Reply(400).
|
||||||
|
BodyString(`
|
||||||
|
{
|
||||||
|
"errorMsg": "ClientIds are loaded with errors",
|
||||||
|
"errors": [0: "customer: Set one of the following fields: id, externalId"]
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
data, _, err := c.ClientIdsUpload(clientIds)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
t.Error("Error must be return")
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Success != false {
|
||||||
|
t.Error(successFail)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestClient_SourcesUpload(t *testing.T) {
|
||||||
|
c := client()
|
||||||
|
|
||||||
|
sources := []Source{
|
||||||
|
{
|
||||||
|
Source: "source",
|
||||||
|
Medium: "medium",
|
||||||
|
Campaign: "campaign",
|
||||||
|
Keyword: "keyword",
|
||||||
|
Content: "content",
|
||||||
|
ClientID: "10",
|
||||||
|
Order: LinkedOrder{ID: 10, ExternalID: "externalId", Number: "number"},
|
||||||
|
Customer: SerializedEntityCustomer{ID: 10, ExternalID: "externalId"},
|
||||||
|
Site: "site",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
sourcesJSON, _ := json.Marshal(&sources)
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"sources": {string(sourcesJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
defer gock.Off()
|
||||||
|
gock.New(crmURL).
|
||||||
|
Post("/web-analytics/sources/upload").
|
||||||
|
BodyString(p.Encode()).
|
||||||
|
Reply(201).
|
||||||
|
BodyString(`{"success": true}`)
|
||||||
|
|
||||||
|
data, status, err := c.SourcesUpload(sources)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if status >= http.StatusBadRequest {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Success != true {
|
||||||
|
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestClient_SourcesUpload_Fail(t *testing.T) {
|
||||||
|
c := client()
|
||||||
|
|
||||||
|
sources := []Source{
|
||||||
|
{
|
||||||
|
Source: "source",
|
||||||
|
Medium: "medium",
|
||||||
|
Campaign: "campaign",
|
||||||
|
Keyword: "keyword",
|
||||||
|
Content: "content",
|
||||||
|
ClientID: "12",
|
||||||
|
Order: LinkedOrder{ID: 10, ExternalID: "externalId", Number: "number"},
|
||||||
|
Customer: SerializedEntityCustomer{},
|
||||||
|
Site: "site",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
sourcesJSON, _ := json.Marshal(&sources)
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"sources": {string(sourcesJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
gock.New(crmURL).
|
||||||
|
Post("/web-analytics/sources/upload").
|
||||||
|
BodyString(p.Encode()).
|
||||||
|
Reply(400).
|
||||||
|
BodyString(`
|
||||||
|
{
|
||||||
|
"errorMsg": "ClientIds are loaded with errors",
|
||||||
|
"errors": [0: "customer: Set one of the following fields: id, externalId"]
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
data, _, err := c.SourcesUpload(sources)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
t.Error("Error must be return")
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Success != false {
|
||||||
|
t.Error(successFail)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestClient_Currencies(t *testing.T) {
|
||||||
|
c := client()
|
||||||
|
|
||||||
|
defer gock.Off()
|
||||||
|
gock.New(crmURL).
|
||||||
|
Get("/reference/currencies").
|
||||||
|
Reply(200).
|
||||||
|
BodyString(`
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"currencies": [
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"code": "code",
|
||||||
|
"isBase": true,
|
||||||
|
"isAutoConvert": true,
|
||||||
|
"autoConvertExtraPercent": 1,
|
||||||
|
"manualConvertNominal": 1,
|
||||||
|
"manualConvertValue": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"code": "code2",
|
||||||
|
"isBase": false,
|
||||||
|
"isAutoConvert": false,
|
||||||
|
"autoConvertExtra_percent": 2,
|
||||||
|
"manualConvertNominal": 5,
|
||||||
|
"manualConvertValue": 60.25
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}`)
|
||||||
|
|
||||||
|
resp := CurrencyResponse{
|
||||||
|
Success: true,
|
||||||
|
Currencies: []Currency{
|
||||||
|
{
|
||||||
|
ID: 10,
|
||||||
|
Code: "code",
|
||||||
|
IsBase: true,
|
||||||
|
IsAutoConvert: true,
|
||||||
|
AutoConvertExtraPercent: 1,
|
||||||
|
ManualConvertNominal: 1,
|
||||||
|
ManualConvertValue: 1.5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 12,
|
||||||
|
Code: "code2",
|
||||||
|
IsBase: false,
|
||||||
|
IsAutoConvert: false,
|
||||||
|
AutoConvertExtraPercent: 0,
|
||||||
|
ManualConvertNominal: 5,
|
||||||
|
ManualConvertValue: 60.25,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
data, status, err := c.Currencies()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if status >= http.StatusBadRequest {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Success != true {
|
||||||
|
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(t, resp, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestClient_CurrenciesCreate(t *testing.T) {
|
||||||
|
c := client()
|
||||||
|
|
||||||
|
currency := Currency{
|
||||||
|
ID: 10,
|
||||||
|
Code: "RUB",
|
||||||
|
IsBase: true,
|
||||||
|
IsAutoConvert: true,
|
||||||
|
AutoConvertExtraPercent: 1,
|
||||||
|
ManualConvertNominal: 1,
|
||||||
|
ManualConvertValue: 1.5,
|
||||||
|
}
|
||||||
|
|
||||||
|
currencyJSON, _ := json.Marshal(¤cy)
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"currency": {string(currencyJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
defer gock.Off()
|
||||||
|
gock.New(crmURL).
|
||||||
|
Post("/reference/currencies/create").
|
||||||
|
BodyString(p.Encode()).
|
||||||
|
Reply(201).
|
||||||
|
BodyString(`{"success": true, "id": 10}`)
|
||||||
|
|
||||||
|
data, status, err := c.CurrenciesCreate(currency)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if status >= http.StatusBadRequest {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Success != true {
|
||||||
|
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(t, currency.ID, data.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestClient_CurrenciesEdit(t *testing.T) {
|
||||||
|
c := client()
|
||||||
|
|
||||||
|
currency := Currency{
|
||||||
|
ID: 10,
|
||||||
|
Code: "code",
|
||||||
|
IsBase: true,
|
||||||
|
IsAutoConvert: true,
|
||||||
|
AutoConvertExtraPercent: 1,
|
||||||
|
ManualConvertNominal: 1,
|
||||||
|
ManualConvertValue: 1.5,
|
||||||
|
}
|
||||||
|
var uid = strconv.Itoa(currency.ID)
|
||||||
|
currencyJSON, _ := json.Marshal(¤cy)
|
||||||
|
|
||||||
|
p := url.Values{
|
||||||
|
"currency": {string(currencyJSON)},
|
||||||
|
}
|
||||||
|
|
||||||
|
defer gock.Off()
|
||||||
|
gock.New(crmURL).
|
||||||
|
Post(fmt.Sprintf("/reference/currencies/%s/edit", uid)).
|
||||||
|
BodyString(p.Encode()).
|
||||||
|
Reply(200).
|
||||||
|
BodyString(`{"success": true}`)
|
||||||
|
|
||||||
|
data, status, err := c.CurrenciesEdit(currency)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if status >= http.StatusBadRequest {
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Success != true {
|
||||||
|
|
||||||
|
t.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestClient_OrderChange(t *testing.T) {
|
func TestClient_OrderChange(t *testing.T) {
|
||||||
c := client()
|
c := client()
|
||||||
|
|
||||||
|
@ -199,6 +199,7 @@ type OrdersFilter struct {
|
|||||||
PaymentStatuses []string `url:"paymentStatuses,omitempty,brackets"`
|
PaymentStatuses []string `url:"paymentStatuses,omitempty,brackets"`
|
||||||
PaymentTypes []string `url:"paymentTypes,omitempty,brackets"`
|
PaymentTypes []string `url:"paymentTypes,omitempty,brackets"`
|
||||||
DeliveryTypes []string `url:"deliveryTypes,omitempty,brackets"`
|
DeliveryTypes []string `url:"deliveryTypes,omitempty,brackets"`
|
||||||
|
DeliveryServices []string `url:"deliveryServices,omitempty,brackets"`
|
||||||
OrderMethods []string `url:"orderMethods,omitempty,brackets"`
|
OrderMethods []string `url:"orderMethods,omitempty,brackets"`
|
||||||
ShipmentStores []string `url:"shipmentStores,omitempty,brackets"`
|
ShipmentStores []string `url:"shipmentStores,omitempty,brackets"`
|
||||||
Couriers []string `url:"couriers,omitempty,brackets"`
|
Couriers []string `url:"couriers,omitempty,brackets"`
|
||||||
@ -448,8 +449,8 @@ type LoyaltyAccountAPIFilter struct {
|
|||||||
ID string `url:"id,omitempty"`
|
ID string `url:"id,omitempty"`
|
||||||
Status string `url:"status,,omitempty"`
|
Status string `url:"status,,omitempty"`
|
||||||
Customer string `url:"customer,omitempty"`
|
Customer string `url:"customer,omitempty"`
|
||||||
MinOrderSum string `url:"minOrderSum,omitempty"`
|
MinOrderSum string `url:"minOrdersSum,omitempty"`
|
||||||
MaxOrderSum string `url:"maxOrderSum,omitempty"`
|
MaxOrderSum string `url:"maxOrdersSum,omitempty"`
|
||||||
MinAmount string `url:"minAmount,omitempty"`
|
MinAmount string `url:"minAmount,omitempty"`
|
||||||
MaxAmount string `url:"maxAmount,omitempty"`
|
MaxAmount string `url:"maxAmount,omitempty"`
|
||||||
PhoneNumber string `url:"phoneNumber,omitempty"`
|
PhoneNumber string `url:"phoneNumber,omitempty"`
|
||||||
|
28
response.go
28
response.go
@ -596,6 +596,34 @@ type AccountBonusOperationsResponse struct {
|
|||||||
BonusOperations []BonusOperation `json:"bonusOperations,omitempty"`
|
BonusOperations []BonusOperation `json:"bonusOperations,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ClientIDResponse type.
|
||||||
|
type ClientIDResponse struct {
|
||||||
|
ErrorMsg string `json:"errorMsg,omitempty"`
|
||||||
|
Errors map[string]string `json:"errors,omitempty"`
|
||||||
|
FailedClientIds []ClientID `json:"failed_client_ids,omitempty"`
|
||||||
|
Success bool `json:"success"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SourcesResponse type.
|
||||||
|
type SourcesResponse struct {
|
||||||
|
ErrorMsg string `json:"errorMsg,omitempty"`
|
||||||
|
Errors map[string]string `json:"errors,omitempty"`
|
||||||
|
FailedSources []Source `json:"failed_sources,omitempty"`
|
||||||
|
Success bool `json:"success"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CurrencyResponse type.
|
||||||
|
type CurrencyResponse struct {
|
||||||
|
Currencies []Currency `json:"currencies,omitempty"`
|
||||||
|
Success bool `json:"success"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CurrencyCreateResponse type.
|
||||||
|
type CurrencyCreateResponse struct {
|
||||||
|
Success bool `json:"success"`
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
type LoyaltyAccountResponse struct {
|
type LoyaltyAccountResponse struct {
|
||||||
SuccessfulResponse
|
SuccessfulResponse
|
||||||
LoyaltyAccount `json:"loyaltyAccount"`
|
LoyaltyAccount `json:"loyaltyAccount"`
|
||||||
|
56
types.go
56
types.go
@ -69,6 +69,10 @@ type Source struct {
|
|||||||
Campaign string `json:"campaign,omitempty"`
|
Campaign string `json:"campaign,omitempty"`
|
||||||
Keyword string `json:"keyword,omitempty"`
|
Keyword string `json:"keyword,omitempty"`
|
||||||
Content string `json:"content,omitempty"`
|
Content string `json:"content,omitempty"`
|
||||||
|
ClientID string `json:"client_id,omitempty"`
|
||||||
|
Site string `json:"site,omitempty"`
|
||||||
|
Order LinkedOrder `json:"order,omitempty"`
|
||||||
|
Customer SerializedEntityCustomer `json:"customer,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Contragent type.
|
// Contragent type.
|
||||||
@ -344,6 +348,49 @@ type Order struct {
|
|||||||
ApplyRound *bool `json:"applyRound,omitempty"`
|
ApplyRound *bool `json:"applyRound,omitempty"`
|
||||||
PrivilegeType string `json:"privilegeType,omitempty"`
|
PrivilegeType string `json:"privilegeType,omitempty"`
|
||||||
DialogID int `json:"dialogId,omitempty"`
|
DialogID int `json:"dialogId,omitempty"`
|
||||||
|
Links []OrderLink `json:"links,omitempty"`
|
||||||
|
Currency string `json:"currency,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// LinkedOrder type.
|
||||||
|
type LinkedOrder struct {
|
||||||
|
Number string `json:"number,omitempty"`
|
||||||
|
ExternalID string `json:"externalID,omitempty"`
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrderLink type.
|
||||||
|
type OrderLink struct {
|
||||||
|
Comment string `json:"comment,omitempty"`
|
||||||
|
CreatedAt string `json:"createdAt,omitempty"`
|
||||||
|
Order LinkedOrder `json:"order,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SerializedOrderLink type.
|
||||||
|
type SerializedOrderLink struct {
|
||||||
|
Comment string `json:"comment,omitempty"`
|
||||||
|
CreatedAt string `json:"createdAt,omitempty"`
|
||||||
|
Orders []LinkedOrder `json:"orders,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClientID type.
|
||||||
|
type ClientID struct {
|
||||||
|
Value string `json:"value"`
|
||||||
|
CreateAt string `json:"createAt,omitempty"`
|
||||||
|
Site string `json:"site,omitempty"`
|
||||||
|
Customer SerializedEntityCustomer `json:"customer,omitempty"`
|
||||||
|
Order LinkedOrder `json:"order,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Currency type.
|
||||||
|
type Currency struct {
|
||||||
|
Code string `json:"code,omitempty"`
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
ManualConvertNominal int `json:"manualConvertNominal,omitempty"`
|
||||||
|
AutoConvertExtraPercent int `json:"autoConvertExtraPercent,omitempty"`
|
||||||
|
IsBase bool `json:"isBase,omitempty"`
|
||||||
|
IsAutoConvert bool `json:"isAutoConvert,omitempty"`
|
||||||
|
ManualConvertValue float32 `json:"manualConvertValue,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// OrdersStatus type.
|
// OrdersStatus type.
|
||||||
@ -580,6 +627,7 @@ type OfferPrice struct {
|
|||||||
Price float32 `json:"price,omitempty"`
|
Price float32 `json:"price,omitempty"`
|
||||||
Ordering int `json:"ordering,omitempty"`
|
Ordering int `json:"ordering,omitempty"`
|
||||||
PriceType string `json:"priceType,omitempty"`
|
PriceType string `json:"priceType,omitempty"`
|
||||||
|
Currency string `json:"currency,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// OfferPriceUpload type.
|
// OfferPriceUpload type.
|
||||||
@ -619,6 +667,7 @@ type User struct {
|
|||||||
CreatedAt string `json:"createdAt,omitempty"`
|
CreatedAt string `json:"createdAt,omitempty"`
|
||||||
Active bool `json:"active,omitempty"`
|
Active bool `json:"active,omitempty"`
|
||||||
Online bool `json:"online,omitempty"`
|
Online bool `json:"online,omitempty"`
|
||||||
|
Position string `json:"position,omitempty"`
|
||||||
IsAdmin bool `json:"isAdmin,omitempty"`
|
IsAdmin bool `json:"isAdmin,omitempty"`
|
||||||
IsManager bool `json:"isManager,omitempty"`
|
IsManager bool `json:"isManager,omitempty"`
|
||||||
Email string `json:"email,omitempty"`
|
Email string `json:"email,omitempty"`
|
||||||
@ -832,6 +881,7 @@ type DeliveryType struct {
|
|||||||
DeliveryServices []string `json:"deliveryServices,omitempty"`
|
DeliveryServices []string `json:"deliveryServices,omitempty"`
|
||||||
PaymentTypes []string `json:"paymentTypes,omitempty"` // Deprecated, use DeliveryPaymentTypes
|
PaymentTypes []string `json:"paymentTypes,omitempty"` // Deprecated, use DeliveryPaymentTypes
|
||||||
DeliveryPaymentTypes []DeliveryPaymentType `json:"deliveryPaymentTypes,omitempty"`
|
DeliveryPaymentTypes []DeliveryPaymentType `json:"deliveryPaymentTypes,omitempty"`
|
||||||
|
Currency string `json:"currency,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeliveryPaymentType struct {
|
type DeliveryPaymentType struct {
|
||||||
@ -863,7 +913,7 @@ type LegalEntity struct {
|
|||||||
|
|
||||||
type SerializedEntityCustomer struct {
|
type SerializedEntityCustomer struct {
|
||||||
ID int `json:"id,omitempty"`
|
ID int `json:"id,omitempty"`
|
||||||
ExternalID int `json:"externalId,omitempty"`
|
ExternalID string `json:"externalId,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// OrderMethod type.
|
// OrderMethod type.
|
||||||
@ -921,6 +971,7 @@ type PriceType struct {
|
|||||||
Ordering int `json:"ordering,omitempty"`
|
Ordering int `json:"ordering,omitempty"`
|
||||||
Groups []string `json:"groups,omitempty"`
|
Groups []string `json:"groups,omitempty"`
|
||||||
Geo []GeoHierarchyRow `json:"geo,omitempty"`
|
Geo []GeoHierarchyRow `json:"geo,omitempty"`
|
||||||
|
Currency string `json:"currency,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProductStatus type.
|
// ProductStatus type.
|
||||||
@ -974,6 +1025,7 @@ type Site struct {
|
|||||||
IsDemo bool `json:"isDemo,omitempty"`
|
IsDemo bool `json:"isDemo,omitempty"`
|
||||||
CatalogID string `json:"catalogId,omitempty"`
|
CatalogID string `json:"catalogId,omitempty"`
|
||||||
IsCatalogMainSite bool `json:"isCatalogMainSite,omitempty"`
|
IsCatalogMainSite bool `json:"isCatalogMainSite,omitempty"`
|
||||||
|
Currency string `json:"currency,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store type.
|
// Store type.
|
||||||
@ -1381,6 +1433,7 @@ type Loyalty struct {
|
|||||||
ActivatedAt string `json:"activatedAt,omitempty"`
|
ActivatedAt string `json:"activatedAt,omitempty"`
|
||||||
DeactivatedAt string `json:"deactivatedAt,omitempty"`
|
DeactivatedAt string `json:"deactivatedAt,omitempty"`
|
||||||
BlockedAt string `json:"blockedAt,omitempty"`
|
BlockedAt string `json:"blockedAt,omitempty"`
|
||||||
|
Currency string `json:"currency,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoyaltyLevel type.
|
// LoyaltyLevel type.
|
||||||
@ -1424,6 +1477,7 @@ type SerializedLoyaltyOrder struct {
|
|||||||
Delivery Delivery `json:"delivery,omitempty"`
|
Delivery Delivery `json:"delivery,omitempty"`
|
||||||
Site string `json:"site,omitempty"`
|
Site string `json:"site,omitempty"`
|
||||||
Items []LoyaltyItems `json:"items,omitempty"`
|
Items []LoyaltyItems `json:"items,omitempty"`
|
||||||
|
Currency string `json:"currency,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type LoyaltyEventDiscount struct {
|
type LoyaltyEventDiscount struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user