Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 130 additions & 2 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2592,6 +2592,88 @@ func TestClient_OrdersOrders(t *testing.T) {
}
}

func TestClient_OrdersActualDTOFields(t *testing.T) {
c := client()

defer gock.Off()

gock.New(crmURL).
Get("/orders").
MatchParam("filter[segment]", "vip").
MatchParam("filter[customerType]", "customer").
MatchParam("filter[productSearchType]", "name").
MatchParam("filter[statusHistorySequence][]", "new").
MatchParam("filter[deliveryStates][]", "processing").
MatchParam("filter[deliveryExternalId]", "delivery-1").
MatchParam("filter[companyName]", "RetailCRM").
MatchParam("filter[deliveryAddressNotes]", "front door").
MatchParam("filter[productGroups][]", "12").
MatchParam("filter[receiptOrderStatus]", "done").
MatchParam("filter[mgChannels][]", "7").
MatchParam("filter[tasksCounts]", "2").
MatchParam("filter[tags][]", "priority").
MatchParam("filter[attachedTags][]", "new-client").
Reply(http.StatusOK).
BodyString(`{
"success": true,
"orders": [{
"id": 1,
"company": {
"averageSumm": 1000,
"avgMarginSumm": 200,
"costSumm": 300,
"marginSumm": 400,
"ordersCount": 5,
"totalSumm": 6000
},
"items": [{
"offer": {
"displayName": "SKU display name"
}
}],
"links": [{
"order": {
"id": 2,
"number": "1002",
"externalId": "external-2"
}
}]
}]
}`)

data, status, err := c.Orders(OrdersRequest{
Filter: OrdersFilter{
Segment: "vip",
CustomerType: "customer",
ProductSearchType: "name",
StatusHistorySequence: []string{"new"},
DeliveryStates: []string{"processing"},
DeliveryExternalID: "delivery-1",
CompanyName: "RetailCRM",
DeliveryAddressNotes: "front door",
ProductGroups: []int{12},
ReceiptOrderStatus: "done",
MGChannels: []int{7},
TasksCounts: 2,
Tags: []string{"priority"},
AttachedTags: []string{"new-client"},
},
})

assert.NoError(t, err)
assert.Equal(t, http.StatusOK, status)
assert.True(t, data.Success)
assert.Len(t, data.Orders, 1)
assert.Equal(t, float32(1000), data.Orders[0].Company.AverageSumm)
assert.Equal(t, float32(200), data.Orders[0].Company.AvgMarginSumm)
assert.Equal(t, float32(300), data.Orders[0].Company.CostSumm)
assert.Equal(t, float32(400), data.Orders[0].Company.MarginSumm)
assert.Equal(t, 5, data.Orders[0].Company.OrdersCount)
assert.Equal(t, float32(6000), data.Orders[0].Company.TotalSumm)
assert.Equal(t, "SKU display name", data.Orders[0].Items[0].Offer.DisplayName)
assert.Equal(t, "external-2", data.Orders[0].Links[0].Order.ExternalID)
}

func TestClient_OrdersOrders_Fail(t *testing.T) {
c := client()

Expand Down Expand Up @@ -3190,7 +3272,26 @@ func TestClient_OrderChange(t *testing.T) {
Get(fmt.Sprintf("/orders/%s", f.ExternalID)).
MatchParam("by", ByExternalID).
Reply(200).
BodyString(`{"success": true}`)
BodyString(`{
"success": true,
"order": {
"id": 1,
"company": {
"averageSumm": 1000,
"ordersCount": 5
},
"items": [{
"offer": {
"displayName": "SKU display name"
}
}],
"links": [{
"order": {
"externalId": "external-2"
}
}]
}
}`)

data, status, err := c.Order(f.ExternalID, ByExternalID, "")
if err != nil {
Expand All @@ -3204,6 +3305,11 @@ func TestClient_OrderChange(t *testing.T) {
if data.Success != true {
t.Errorf("%v", err)
}

assert.Equal(t, float32(1000), data.Order.Company.AverageSumm)
assert.Equal(t, 5, data.Order.Company.OrdersCount)
assert.Equal(t, "SKU display name", data.Order.Items[0].Offer.DisplayName)
assert.Equal(t, "external-2", data.Order.Links[0].Order.ExternalID)
}

func TestClient_OrderChange_Fail(t *testing.T) {
Expand Down Expand Up @@ -4726,7 +4832,19 @@ func TestClient_ProductStatuses(t *testing.T) {
gock.New(crmURL).
Get("/reference/product-statuses").
Reply(200).
BodyString(`{"success": true}`)
BodyString(`{
"success": true,
"productStatuses": [{
"code": "available",
"ordering": 10,
"active": true,
"createdAt": "2026-05-11 10:00:00",
"orderStatusByProductStatus": "complete",
"orderStatusForProductStatus": "assembled",
"cancelStatus": false,
"name": "Available"
}]
}`)

data, st, err := c.ProductStatuses()
if err != nil {
Expand All @@ -4740,6 +4858,16 @@ func TestClient_ProductStatuses(t *testing.T) {
if data.Success != true {
t.Errorf("%v", err)
}

assert.Len(t, data.ProductStatuses, 1)
assert.Equal(t, "available", data.ProductStatuses[0].Code)
assert.Equal(t, 10, data.ProductStatuses[0].Ordering)
assert.True(t, data.ProductStatuses[0].Active)
assert.Equal(t, "2026-05-11 10:00:00", data.ProductStatuses[0].CreatedAt)
assert.Equal(t, "complete", data.ProductStatuses[0].OrderStatusByProductStatus)
assert.Equal(t, "assembled", data.ProductStatuses[0].OrderStatusForProductStatus)
assert.False(t, data.ProductStatuses[0].CancelStatus)
assert.Equal(t, "Available", data.ProductStatuses[0].Name)
}

func TestClient_Statuses(t *testing.T) {
Expand Down
14 changes: 14 additions & 0 deletions filters.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ type OrdersFilter struct {
Customer string `url:"customer,omitempty"`
CustomerID string `url:"customerId,omitempty"`
CustomerExternalID string `url:"customerExternalId,omitempty"`
Segment string `url:"segment,omitempty"`
CustomerType string `url:"customerType,omitempty"`
Countries []string `url:"countries,omitempty,brackets"`
City string `url:"city,omitempty"`
Region string `url:"region,omitempty"`
Expand All @@ -165,6 +167,7 @@ type OrdersFilter struct {
MinPrice string `url:"minPrice,omitempty"`
MaxPrice string `url:"maxPrice,omitempty"`
Product string `url:"product,omitempty"`
ProductSearchType string `url:"productSearchType,omitempty"`
Vip int `url:"vip,omitempty"`
Bad int `url:"bad,omitempty"`
Attachments int `url:"attachments,omitempty"`
Expand All @@ -176,6 +179,7 @@ type OrdersFilter struct {
ReceiptFiscalDocumentAttribute int `url:"receiptFiscalDocumentAttribute,omitempty"`
ReceiptStatus int `url:"receiptStatus,omitempty"`
ReceiptOperation int `url:"receiptOperation,omitempty"`
ReceiptOrderStatus string `url:"receiptOrderStatus,omitempty"`
MinDeliveryCost string `url:"minDeliveryCost,omitempty"`
MaxDeliveryCost string `url:"maxDeliveryCost,omitempty"`
MinDeliveryNetCost string `url:"minDeliveryNetCost,omitempty"`
Expand All @@ -189,6 +193,9 @@ type OrdersFilter struct {
MinCostSumm string `url:"minCostSumm,omitempty"`
MaxCostSumm string `url:"maxCostSumm,omitempty"`
TrackNumber string `url:"trackNumber,omitempty"`
DeliveryExternalID string `url:"deliveryExternalId,omitempty"`
CompanyName string `url:"companyName,omitempty"`
DeliveryAddressNotes string `url:"deliveryAddressNotes,omitempty"`
ContragentName string `url:"contragentName,omitempty"`
ContragentInn string `url:"contragentInn,omitempty"`
ContragentKpp string `url:"contragentKpp,omitempty"`
Expand All @@ -199,14 +206,20 @@ type OrdersFilter struct {
OrderTypes []string `url:"orderTypes,omitempty,brackets"`
PaymentStatuses []string `url:"paymentStatuses,omitempty,brackets"`
PaymentTypes []string `url:"paymentTypes,omitempty,brackets"`
DeliveryStates []string `url:"deliveryStates,omitempty,brackets"`
DeliveryTypes []string `url:"deliveryTypes,omitempty,brackets"`
DeliveryServices []string `url:"deliveryServices,omitempty,brackets"`
OrderMethods []string `url:"orderMethods,omitempty,brackets"`
ProductGroups []int `url:"productGroups,omitempty,brackets"`
ShipmentStores []string `url:"shipmentStores,omitempty,brackets"`
Couriers []string `url:"couriers,omitempty,brackets"`
Managers []string `url:"managers,omitempty,brackets"`
ManagerGroups []string `url:"managerGroups,omitempty,brackets"`
MGChannels []int `url:"mgChannels,omitempty,brackets"`
Sites []string `url:"sites,omitempty,brackets"`
TasksCounts int `url:"tasksCounts,omitempty"`
Tags []string `url:"tags,omitempty,brackets"`
AttachedTags []string `url:"attachedTags,omitempty,brackets"`
CreatedAtFrom string `url:"createdAtFrom,omitempty"`
CreatedAtTo string `url:"createdAtTo,omitempty"`
PaidAtFrom string `url:"paidAtFrom,omitempty"`
Expand All @@ -230,6 +243,7 @@ type OrdersFilter struct {
ShipmentDateFrom string `url:"shipmentDateFrom,omitempty"`
ShipmentDateTo string `url:"shipmentDateTo,omitempty"`
ExtendedStatus []string `url:"extendedStatus,omitempty,brackets"`
StatusHistorySequence []string `url:"statusHistorySequence,omitempty,brackets"`
SourceName string `url:"sourceName,omitempty"`
MediumName string `url:"mediumName,omitempty"`
CampaignName string `url:"campaignName,omitempty"`
Expand Down
4 changes: 2 additions & 2 deletions response.go
Original file line number Diff line number Diff line change
Expand Up @@ -327,8 +327,8 @@ type PriceTypesResponse struct {

// ProductStatusesResponse type.
type ProductStatusesResponse struct {
Success bool `json:"success"`
ProductStatuses map[string]ProductStatus `json:"productStatuses,omitempty"`
Success bool `json:"success"`
ProductStatuses []ProductStatus `json:"productStatuses,omitempty"`
}

// StatusesResponse type.
Expand Down
33 changes: 20 additions & 13 deletions types.go
Original file line number Diff line number Diff line change
Expand Up @@ -310,18 +310,24 @@ type CartCustomer struct {
}

type Company struct {
ID int `json:"id,omitempty"`
IsMain bool `json:"isMain,omitempty"`
ExternalID string `json:"externalId,omitempty"`
Customer *Customer `json:"customer,omitempty"`
Active bool `json:"active,omitempty"`
Name string `json:"name,omitempty"`
Brand string `json:"brand,omitempty"`
Site string `json:"site,omitempty"`
CreatedAt string `json:"createdAt,omitempty"`
Contragent *Contragent `json:"contragent,omitempty"`
Address *IdentifiersPair `json:"address,omitempty"`
CustomFields CustomFieldMap `json:"customFields,omitempty"`
ID int `json:"id,omitempty"`
IsMain bool `json:"isMain,omitempty"`
ExternalID string `json:"externalId,omitempty"`
Customer *Customer `json:"customer,omitempty"`
Active bool `json:"active,omitempty"`
Name string `json:"name,omitempty"`
Brand string `json:"brand,omitempty"`
Site string `json:"site,omitempty"`
CreatedAt string `json:"createdAt,omitempty"`
Contragent *Contragent `json:"contragent,omitempty"`
Address *IdentifiersPair `json:"address,omitempty"`
CustomFields CustomFieldMap `json:"customFields,omitempty"`
AvgMarginSumm float32 `json:"avgMarginSumm,omitempty"`
MarginSumm float32 `json:"marginSumm,omitempty"`
TotalSumm float32 `json:"totalSumm,omitempty"`
AverageSumm float32 `json:"averageSumm,omitempty"`
OrdersCount int `json:"ordersCount,omitempty"`
CostSumm float32 `json:"costSumm,omitempty"`
}

// CorporateCustomerNote type.
Expand Down Expand Up @@ -455,7 +461,7 @@ type Order struct {
// LinkedOrder type.
type LinkedOrder struct {
Number string `json:"number,omitempty"`
ExternalID string `json:"externalID,omitempty"`
ExternalID string `json:"externalId,omitempty"`
ID int `json:"id,omitempty"`
}

Expand Down Expand Up @@ -970,6 +976,7 @@ type Offer struct {
ID int `json:"id,omitempty"`
ExternalID string `json:"externalId,omitempty"`
Name string `json:"name,omitempty"`
DisplayName string `json:"displayName,omitempty"`
XMLID string `json:"xmlId,omitempty"`
Site string `json:"site,omitempty"`
Article string `json:"article,omitempty"`
Expand Down
Loading