mirror of
https://github.com/retailcrm/api-client-go.git
synced 2025-04-11 21:10:56 +00:00
Compare commits
62 commits
Author | SHA1 | Date | |
---|---|---|---|
c62a02aa1f | |||
|
871459c8b7 | ||
d0b0dd59d6 | |||
|
cc83657f32 | ||
53e2ab5130 | |||
0123057e86 | |||
a8cae8b200 | |||
5fa64ff23e | |||
e2113a640e | |||
2f33b56cd3 | |||
|
8892fe6895 | ||
|
908f16b173 | ||
2859073353 | |||
a482cd1a2f | |||
92a5741c84 | |||
634ec386b1 | |||
d101ddb097 | |||
|
3186470ed9 | ||
904796f97a | |||
|
2f0f55be42 | ||
c79e6c0497 | |||
2587dd786a | |||
|
2333dbf493 | ||
|
d195460141 | ||
|
e6fc8f1e0e | ||
c9e5b1f79d | |||
3282ab045e | |||
4398f85214 | |||
|
77b49e04ab | ||
29062b8bf0 | |||
7c8e142cab | |||
e28631dcb2 | |||
a4de6df146 | |||
81a09e24d4 | |||
b5e7c3ff33 | |||
76135226fb | |||
a72a57fbe1 | |||
c2a33378b8 | |||
|
583362bfe3 | ||
|
ab648cd06a | ||
|
5c6d2ebead | ||
407ecf5066 | |||
|
2875b8620a | ||
b445dfdfe5 | |||
1e9692ec15 | |||
|
0ed90e8351 | ||
076ce77bdb | |||
|
8377a8789d | ||
280f078632 | |||
|
e6efd56497 | ||
|
9bd3d646fc | ||
|
16e2bc304c | ||
d08ed4e1b2 | |||
|
afb7c1b881 | ||
e513134df9 | |||
5b7ed8697e | |||
107a4d150b | |||
a51bab6df4 | |||
|
49905ab9c6 | ||
06b0395a93 | |||
67d72f2fe1 | |||
|
bafdf24755 |
15 changed files with 2780 additions and 305 deletions
24
.github/workflows/ci.yml
vendored
24
.github/workflows/ci.yml
vendored
|
@ -20,10 +20,10 @@ jobs:
|
|||
steps:
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v2
|
||||
- name: Set up Go 1.17
|
||||
uses: actions/setup-go@v2
|
||||
- name: Set up Go 1.23
|
||||
uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: '1.17'
|
||||
go-version: '1.23'
|
||||
- name: Get dependencies
|
||||
run: |
|
||||
go mod tidy
|
||||
|
@ -31,7 +31,7 @@ jobs:
|
|||
- name: Lint code with golangci-lint
|
||||
uses: golangci/golangci-lint-action@v3
|
||||
with:
|
||||
version: v1.45.2
|
||||
version: v1.62.2
|
||||
only-new-issues: true
|
||||
skip-pkg-cache: true
|
||||
args: --build-tags=testutils
|
||||
|
@ -40,13 +40,13 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
go-version: ['1.13', '1.14', '1.15', '1.16', '1.17']
|
||||
go-version: ['1.19', '1.20', '1.21', '1.22', '1.23', 'stable']
|
||||
include:
|
||||
- go-version: '1.17'
|
||||
- go-version: '1.23'
|
||||
coverage: 1
|
||||
steps:
|
||||
- name: Set up Go ${{ matrix.go-version }}
|
||||
uses: actions/setup-go@v2
|
||||
uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: ${{ matrix.go-version }}
|
||||
- name: Check out code into the Go module directory
|
||||
|
@ -59,17 +59,21 @@ jobs:
|
|||
env:
|
||||
COVERAGE: ${{ matrix.coverage }}
|
||||
if: env.COVERAGE != 1
|
||||
run: go test -tags=testutils ./...
|
||||
run: |
|
||||
go install gotest.tools/gotestsum@latest
|
||||
gotestsum --format testdox ./... -tags=testutils -v -cpu 2 -timeout 60s -race
|
||||
- name: Tests with coverage
|
||||
env:
|
||||
COVERAGE: ${{ matrix.coverage }}
|
||||
if: env.COVERAGE == 1
|
||||
run: |
|
||||
go test -tags=testutils ./... -race -coverprofile=coverage.txt -covermode=atomic "$d"
|
||||
go install gotest.tools/gotestsum@latest
|
||||
gotestsum --format testdox ./... -tags=testutils -v -cpu 2 -timeout 60s -race -cover -coverprofile=coverage.txt -covermode=atomic "$d"
|
||||
- name: Coverage
|
||||
env:
|
||||
COVERAGE: ${{ matrix.coverage }}
|
||||
if: env.COVERAGE == 1
|
||||
run: |
|
||||
go install github.com/axw/gocov/gocov@latest
|
||||
gocov convert ./coverage.txt | gocov report
|
||||
bash <(curl -s https://codecov.io/bash)
|
||||
rm coverage.txt
|
||||
|
|
103
.golangci.yml
103
.golangci.yml
|
@ -1,32 +1,70 @@
|
|||
run:
|
||||
skip-dirs-use-default: true
|
||||
allow-parallel-runners: true
|
||||
skip-files:
|
||||
|
||||
issues:
|
||||
exclude-files:
|
||||
- testutils.go
|
||||
exclude-rules:
|
||||
- path: _test\.go
|
||||
linters:
|
||||
- lll
|
||||
- errcheck
|
||||
- misspell
|
||||
- ineffassign
|
||||
- whitespace
|
||||
- makezero
|
||||
- errcheck
|
||||
- funlen
|
||||
- goconst
|
||||
- gocognit
|
||||
- gocyclo
|
||||
- godot
|
||||
- unused
|
||||
- errchkjson
|
||||
- varnamelen
|
||||
exclude-use-default: true
|
||||
exclude-case-sensitive: false
|
||||
max-issues-per-linter: 0
|
||||
max-same-issues: 0
|
||||
fix: true
|
||||
|
||||
output:
|
||||
format: colored-line-number
|
||||
formats:
|
||||
- format: colored-line-number
|
||||
sort-results: true
|
||||
|
||||
# Linters below do not support go1.18 yet because of generics.
|
||||
# See https://github.com/golangci/golangci-lint/issues/2649
|
||||
# - bodyclose
|
||||
# - sqlclosecheck
|
||||
|
||||
linters:
|
||||
disable-all: true
|
||||
enable:
|
||||
- deadcode
|
||||
- asciicheck
|
||||
- asasalint
|
||||
- varnamelen
|
||||
- reassign
|
||||
- nilnil
|
||||
- nilerr
|
||||
- nakedret
|
||||
- goprintffuncname
|
||||
- typecheck
|
||||
- errchkjson
|
||||
- errcheck
|
||||
- gosimple
|
||||
- govet
|
||||
- ineffassign
|
||||
- staticcheck
|
||||
- structcheck
|
||||
- unused
|
||||
- unparam
|
||||
- varcheck
|
||||
- bodyclose
|
||||
- dogsled
|
||||
- dupl
|
||||
- errorlint
|
||||
- exhaustive
|
||||
- exportloopref
|
||||
- copyloopvar
|
||||
- funlen
|
||||
- gocognit
|
||||
- goconst
|
||||
|
@ -35,16 +73,13 @@ linters:
|
|||
- godot
|
||||
- goimports
|
||||
- revive
|
||||
- gomnd
|
||||
- gosec
|
||||
- ifshort
|
||||
- lll
|
||||
- makezero
|
||||
- misspell
|
||||
- nestif
|
||||
- prealloc
|
||||
- predeclared
|
||||
- sqlclosecheck
|
||||
- unconvert
|
||||
- whitespace
|
||||
|
||||
|
@ -55,6 +90,7 @@ linters-settings:
|
|||
enable:
|
||||
- assign
|
||||
- atomic
|
||||
- atomicalign
|
||||
- bools
|
||||
- buildtag
|
||||
- copylocks
|
||||
|
@ -69,7 +105,6 @@ linters-settings:
|
|||
- unmarshal
|
||||
- unreachable
|
||||
- unsafeptr
|
||||
- unused
|
||||
settings:
|
||||
printf:
|
||||
funcs:
|
||||
|
@ -137,11 +172,13 @@ linters-settings:
|
|||
threshold: 200
|
||||
errorlint:
|
||||
errorf: true
|
||||
asserts: false
|
||||
comparison: false
|
||||
exhaustive:
|
||||
check-generated: false
|
||||
default-signifies-exhaustive: false
|
||||
funlen:
|
||||
lines: 60
|
||||
lines: 90
|
||||
statements: 40
|
||||
gocognit:
|
||||
min-complexity: 25
|
||||
|
@ -151,8 +188,6 @@ linters-settings:
|
|||
local-prefixes: github.com/retailcrm/api-client-go/v2
|
||||
lll:
|
||||
line-length: 160
|
||||
maligned:
|
||||
suggest-new: true
|
||||
misspell:
|
||||
locale: US
|
||||
nestif:
|
||||
|
@ -160,41 +195,19 @@ linters-settings:
|
|||
whitespace:
|
||||
multi-if: false
|
||||
multi-func: false
|
||||
|
||||
issues:
|
||||
exclude-rules:
|
||||
- path: _test\.go
|
||||
linters:
|
||||
- gomnd
|
||||
- lll
|
||||
- bodyclose
|
||||
- errcheck
|
||||
- sqlclosecheck
|
||||
- misspell
|
||||
- ineffassign
|
||||
- whitespace
|
||||
- makezero
|
||||
- maligned
|
||||
- ifshort
|
||||
- errcheck
|
||||
- funlen
|
||||
- goconst
|
||||
- gocognit
|
||||
- gocyclo
|
||||
- godot
|
||||
- gocritic
|
||||
- gosec
|
||||
- staticcheck
|
||||
- unused
|
||||
exclude-use-default: true
|
||||
exclude-case-sensitive: false
|
||||
max-issues-per-linter: 0
|
||||
max-same-issues: 0
|
||||
fix: true
|
||||
varnamelen:
|
||||
max-distance: 10
|
||||
ignore-map-index-ok: true
|
||||
ignore-type-assert-ok: true
|
||||
ignore-chan-recv-ok: true
|
||||
ignore-decls:
|
||||
- t *testing.T
|
||||
- e error
|
||||
- i int
|
||||
|
||||
severity:
|
||||
default-severity: error
|
||||
case-sensitive: false
|
||||
|
||||
service:
|
||||
golangci-lint-version: 1.36.x
|
||||
golangci-lint-version: 1.62.x
|
||||
|
|
1043
client_test.go
1043
client_test.go
File diff suppressed because it is too large
Load diff
8
enum.go
Normal file
8
enum.go
Normal file
|
@ -0,0 +1,8 @@
|
|||
package retailcrm
|
||||
|
||||
var UserGroupSuperadmins UserGroupType = "superadmins"
|
||||
|
||||
var (
|
||||
NotificationTypeError NotificationType = "api.error"
|
||||
NotificationTypeInfo NotificationType = "api.info"
|
||||
)
|
2
error.go
2
error.go
|
@ -9,6 +9,8 @@ import (
|
|||
|
||||
var missingParameterMatcher = regexp.MustCompile(`^Parameter \'([\w\]\[\_\-]+)\' is missing$`)
|
||||
var (
|
||||
// ErrRateLimited will be returned if request was rate limited.
|
||||
ErrRateLimited = NewAPIError("rate limit exceeded")
|
||||
// ErrMissingCredentials will be returned if no API key was provided to the API.
|
||||
ErrMissingCredentials = NewAPIError(`apiKey is missing`)
|
||||
// ErrInvalidCredentials will be returned if provided API key is invalid.
|
||||
|
|
40
filters.go
40
filters.go
|
@ -199,6 +199,7 @@ type OrdersFilter struct {
|
|||
PaymentStatuses []string `url:"paymentStatuses,omitempty,brackets"`
|
||||
PaymentTypes []string `url:"paymentTypes,omitempty,brackets"`
|
||||
DeliveryTypes []string `url:"deliveryTypes,omitempty,brackets"`
|
||||
DeliveryServices []string `url:"deliveryServices,omitempty,brackets"`
|
||||
OrderMethods []string `url:"orderMethods,omitempty,brackets"`
|
||||
ShipmentStores []string `url:"shipmentStores,omitempty,brackets"`
|
||||
Couriers []string `url:"couriers,omitempty,brackets"`
|
||||
|
@ -351,6 +352,7 @@ type ProductsFilter struct {
|
|||
ExternalID string `url:"externalId,omitempty"`
|
||||
Manufacturer string `url:"manufacturer,omitempty"`
|
||||
URL string `url:"url,omitempty"`
|
||||
URLLike string `url:"urlLike,omitempty"`
|
||||
PriceType string `url:"priceType,omitempty"`
|
||||
OfferExternalID string `url:"offerExternalId,omitempty"`
|
||||
Sites []string `url:"sites,omitempty,brackets"`
|
||||
|
@ -379,22 +381,22 @@ type ShipmentFilter struct {
|
|||
|
||||
// CostsFilter type.
|
||||
type CostsFilter struct {
|
||||
MinSumm string `url:"minSumm,omitempty"`
|
||||
MaxSumm string `url:"maxSumm,omitempty"`
|
||||
MinSumm int `url:"minSumm,omitempty"`
|
||||
MaxSumm int `url:"maxSumm,omitempty"`
|
||||
OrderNumber string `url:"orderNumber,omitempty"`
|
||||
Comment string `url:"orderNumber,omitempty"`
|
||||
Ids []string `url:"ids,omitempty,brackets"`
|
||||
IDs []int `url:"ids,omitempty,brackets"`
|
||||
Sites []string `url:"sites,omitempty,brackets"`
|
||||
CreatedBy []string `url:"createdBy,omitempty,brackets"`
|
||||
CreatedBy []int `url:"createdBy,omitempty,brackets"`
|
||||
CostGroups []string `url:"costGroups,omitempty,brackets"`
|
||||
CostItems []string `url:"costItems,omitempty,brackets"`
|
||||
Users []string `url:"users,omitempty,brackets"`
|
||||
Users []int `url:"users,omitempty,brackets"`
|
||||
DateFrom string `url:"dateFrom,omitempty"`
|
||||
DateTo string `url:"dateTo,omitempty"`
|
||||
CreatedAtFrom string `url:"createdAtFrom,omitempty"`
|
||||
CreatedAtTo string `url:"createdAtTo,omitempty"`
|
||||
OrderIds []string `url:"orderIds,omitempty,brackets"`
|
||||
OrderExternalIds []string `url:"orderIds,omitempty,brackets"`
|
||||
OrderIDs []int `url:"orderIds,omitempty,brackets"`
|
||||
OrderExternalIDs []string `url:"orderExternalIds,omitempty,brackets"`
|
||||
}
|
||||
|
||||
// FilesFilter type.
|
||||
|
@ -448,8 +450,8 @@ type LoyaltyAccountAPIFilter struct {
|
|||
ID string `url:"id,omitempty"`
|
||||
Status string `url:"status,,omitempty"`
|
||||
Customer string `url:"customer,omitempty"`
|
||||
MinOrderSum string `url:"minOrderSum,omitempty"`
|
||||
MaxOrderSum string `url:"maxOrderSum,omitempty"`
|
||||
MinOrderSum string `url:"minOrdersSum,omitempty"`
|
||||
MaxOrderSum string `url:"maxOrdersSum,omitempty"`
|
||||
MinAmount string `url:"minAmount,omitempty"`
|
||||
MaxAmount string `url:"maxAmount,omitempty"`
|
||||
PhoneNumber string `url:"phoneNumber,omitempty"`
|
||||
|
@ -473,3 +475,23 @@ type LoyaltyAPIFilter struct {
|
|||
Ids []int `url:"ids,omitempty,brackets"`
|
||||
Sites []string `url:"sites,omitempty,brackets"`
|
||||
}
|
||||
|
||||
type OffersFilter struct {
|
||||
Ids []int `url:"ids,omitempty,brackets"`
|
||||
Active *int `url:"active,omitempty"`
|
||||
}
|
||||
|
||||
type SiteFilter struct {
|
||||
// SiteBy contains information about what is betrayed site id or site code.
|
||||
// id|code, default is code.
|
||||
SiteBy string `url:"siteBy,omitempty"`
|
||||
}
|
||||
|
||||
type GetCartFilter struct {
|
||||
// SiteBy contains information about what is betrayed site id or site code.
|
||||
// id|code, default is code.
|
||||
SiteBy string `url:"siteBy,omitempty"`
|
||||
// By contains information about what is betrayed: customer id or customer externalId.
|
||||
// id|externalId, default is externalId.
|
||||
By string `url:"by,omitempty"`
|
||||
}
|
||||
|
|
|
@ -58,6 +58,30 @@ func (l *StringMap) UnmarshalJSON(data []byte) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (l *CustomFieldMap) UnmarshalJSON(data []byte) error {
|
||||
var i interface{}
|
||||
var items CustomFieldMap
|
||||
if err := json.Unmarshal(data, &i); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch e := i.(type) {
|
||||
case map[string]interface{}:
|
||||
items = make(CustomFieldMap, len(e))
|
||||
for idx, val := range e {
|
||||
items[idx] = val
|
||||
}
|
||||
case []interface{}:
|
||||
items = make(CustomFieldMap, len(e))
|
||||
for idx, val := range e {
|
||||
items[strconv.Itoa(idx)] = val
|
||||
}
|
||||
}
|
||||
|
||||
*l = items
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *OrderPayments) UnmarshalJSON(data []byte) error {
|
||||
var i interface{}
|
||||
var m OrderPayments
|
||||
|
|
|
@ -44,7 +44,7 @@ func TestAPIErrorsList_UnmarshalJSON(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestCustomFieldsList_UnmarshalJSON(t *testing.T) {
|
||||
var list StringMap
|
||||
var list CustomFieldMap
|
||||
|
||||
require.NoError(t, json.Unmarshal([]byte(`["first", "second"]`), &list))
|
||||
assert.Len(t, list, 2)
|
||||
|
@ -56,6 +56,13 @@ func TestCustomFieldsList_UnmarshalJSON(t *testing.T) {
|
|||
assert.Equal(t, list["a"], "first")
|
||||
assert.Equal(t, list["b"], "second")
|
||||
|
||||
require.NoError(t, json.Unmarshal([]byte(`{"a": ["first", "second"], "b": "second"}`), &list))
|
||||
assert.Len(t, list, 2)
|
||||
assert.Len(t, list["a"].([]interface{}), 2)
|
||||
assert.Equal(t, list["a"].([]interface{})[0], "first")
|
||||
assert.Equal(t, list["a"].([]interface{})[1], "second")
|
||||
assert.Equal(t, list["b"], "second")
|
||||
|
||||
require.NoError(t, json.Unmarshal([]byte(`[]`), &list))
|
||||
assert.Len(t, list, 0)
|
||||
}
|
||||
|
|
36
request.go
36
request.go
|
@ -194,6 +194,22 @@ type DeliveryShipmentsRequest struct {
|
|||
Page int `url:"page,omitempty"`
|
||||
}
|
||||
|
||||
// ClearCartRequest type.
|
||||
type ClearCartRequest struct {
|
||||
ClearedAt string `url:"clearedAt,omitempty"`
|
||||
Customer CartCustomer `url:"customer,omitempty"`
|
||||
Order ClearCartOrder `url:"order,omitempty"`
|
||||
}
|
||||
|
||||
// SetCartRequest type.
|
||||
type SetCartRequest struct {
|
||||
ExternalID string `url:"externalId,omitempty"`
|
||||
DroppedAt string `url:"droppedAt,omitempty"`
|
||||
Link string `url:"link,omitempty"`
|
||||
Customer CartCustomer `url:"customer,omitempty"`
|
||||
Items []SetCartItem `url:"items,omitempty"`
|
||||
}
|
||||
|
||||
// CostsRequest type.
|
||||
type CostsRequest struct {
|
||||
Filter CostsFilter `url:"filter,omitempty"`
|
||||
|
@ -249,7 +265,7 @@ type AccountBonusOperationsRequest struct {
|
|||
type LoyaltyBonusCreditRequest struct {
|
||||
Amount float64 `url:"amount"`
|
||||
ActivationDate string `url:"activationDate,omitempty"`
|
||||
ExpiredDate string `url:"expiredDate,omitempty"`
|
||||
ExpiredDate string `url:"expireDate,omitempty"`
|
||||
Comment string `url:"comment,omitempty"`
|
||||
}
|
||||
|
||||
|
@ -261,7 +277,7 @@ type LoyaltyBonusStatusDetailsRequest struct {
|
|||
|
||||
type LoyaltyAccountsRequest struct {
|
||||
Limit int `url:"limit,omitempty"`
|
||||
Page int `url:"limit,omitempty"`
|
||||
Page int `url:"page,omitempty"`
|
||||
Filter LoyaltyAccountAPIFilter `url:"filter,omitempty"`
|
||||
}
|
||||
|
||||
|
@ -277,6 +293,18 @@ type LoyaltiesRequest struct {
|
|||
Filter LoyaltyAPIFilter `url:"filter,omitempty"`
|
||||
}
|
||||
|
||||
type NotificationsSendRequest struct {
|
||||
UserGroups []UserGroupType `json:"userGroups,omitempty"`
|
||||
Type NotificationType `json:"type"`
|
||||
Message string `json:"message"`
|
||||
UserIDs []string `json:"userIds,omitempty"`
|
||||
}
|
||||
|
||||
type EditMGChannelTemplateRequest struct {
|
||||
Templates []MGChannelTemplate `json:"templates"`
|
||||
Removed []int `json:"removed"`
|
||||
}
|
||||
|
||||
// SystemURL returns system URL from the connection request without trailing slash.
|
||||
func (r ConnectRequest) SystemURL() string {
|
||||
if r.URL == "" {
|
||||
|
@ -298,3 +326,7 @@ func (r ConnectRequest) Verify(secret string) bool {
|
|||
}
|
||||
return hmac.Equal([]byte(r.Token), []byte(hex.EncodeToString(mac.Sum(nil))))
|
||||
}
|
||||
|
||||
type OffersRequest struct {
|
||||
OffersFilter `url:"filter,omitempty"`
|
||||
}
|
||||
|
|
46
response.go
46
response.go
|
@ -407,6 +407,12 @@ type ProductsPropertiesResponse struct {
|
|||
Properties []Property `json:"properties,omitempty"`
|
||||
}
|
||||
|
||||
// CartResponse type.
|
||||
type CartResponse struct {
|
||||
SuccessfulResponse
|
||||
Cart Cart `json:"cart"`
|
||||
}
|
||||
|
||||
// DeliveryShipmentsResponse type.
|
||||
type DeliveryShipmentsResponse struct {
|
||||
Success bool `json:"success"`
|
||||
|
@ -596,6 +602,34 @@ type AccountBonusOperationsResponse struct {
|
|||
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 {
|
||||
SuccessfulResponse
|
||||
LoyaltyAccount `json:"loyaltyAccount"`
|
||||
|
@ -651,3 +685,15 @@ type ActionProductsGroupResponse struct {
|
|||
SuccessfulResponse
|
||||
ID int `json:"id"`
|
||||
}
|
||||
|
||||
type MGChannelTemplatesResponse struct {
|
||||
Pagination *Pagination `json:"pagination"`
|
||||
Templates []MGChannelTemplate `json:"templates"`
|
||||
SuccessfulResponse
|
||||
}
|
||||
|
||||
type StoreOffersResponse struct {
|
||||
Pagination *Pagination `json:"pagination"`
|
||||
SuccessfulResponse
|
||||
Offers []Offer `json:"offers,omitempty"`
|
||||
}
|
||||
|
|
30
system_time.go
Normal file
30
system_time.go
Normal file
|
@ -0,0 +1,30 @@
|
|||
package retailcrm
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type SystemTime time.Time
|
||||
|
||||
const systemTimeLayout = "2006-01-02 15:04:05"
|
||||
|
||||
// UnmarshalJSON parses time.Time from system format.
|
||||
func (st *SystemTime) UnmarshalJSON(b []byte) (err error) {
|
||||
s := strings.Trim(string(b), `"`)
|
||||
nt, err := time.Parse(systemTimeLayout, s)
|
||||
*st = SystemTime(nt)
|
||||
return
|
||||
}
|
||||
|
||||
// MarshalJSON will marshal time.Time to system format.
|
||||
func (st SystemTime) MarshalJSON() ([]byte, error) {
|
||||
return []byte(st.String()), nil
|
||||
}
|
||||
|
||||
// String returns the time in the custom format.
|
||||
func (st *SystemTime) String() string {
|
||||
t := time.Time(*st)
|
||||
return fmt.Sprintf("%q", t.Format(systemTimeLayout))
|
||||
}
|
122
template.go
Normal file
122
template.go
Normal file
|
@ -0,0 +1,122 @@
|
|||
package retailcrm
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
const (
|
||||
// TemplateItemTypeText is a type for text chunk in template.
|
||||
TemplateItemTypeText uint8 = iota
|
||||
// TemplateItemTypeVar is a type for variable in template.
|
||||
TemplateItemTypeVar
|
||||
QuickReply ButtonType = "QUICK_REPLY"
|
||||
PhoneNumber ButtonType = "PHONE_NUMBER"
|
||||
URL ButtonType = "URL"
|
||||
)
|
||||
|
||||
const (
|
||||
// TemplateVarCustom is a custom variable type.
|
||||
TemplateVarCustom = "custom"
|
||||
// TemplateVarName is a name variable type.
|
||||
TemplateVarName = "name"
|
||||
// TemplateVarFirstName is a first name variable type.
|
||||
TemplateVarFirstName = "first_name"
|
||||
// TemplateVarLastName is a last name variable type.
|
||||
TemplateVarLastName = "last_name"
|
||||
)
|
||||
|
||||
// templateVarAssoc for checking variable validity, only for internal use.
|
||||
var templateVarAssoc = map[string]interface{}{
|
||||
TemplateVarCustom: nil,
|
||||
TemplateVarName: nil,
|
||||
TemplateVarFirstName: nil,
|
||||
TemplateVarLastName: nil,
|
||||
}
|
||||
|
||||
type Text struct {
|
||||
Parts []TextTemplateItem `json:"parts"`
|
||||
Example []string `json:"example,omitempty"`
|
||||
}
|
||||
|
||||
type Media struct {
|
||||
Example string `json:"example,omitempty"`
|
||||
}
|
||||
|
||||
type Header struct {
|
||||
Text *Text `json:"text,omitempty"`
|
||||
Document *Media `json:"document,omitempty"`
|
||||
Image *Media `json:"image,omitempty"`
|
||||
Video *Media `json:"video,omitempty"`
|
||||
}
|
||||
|
||||
type TemplateItemList []TextTemplateItem
|
||||
|
||||
// TextTemplateItem is a part of template.
|
||||
type TextTemplateItem struct {
|
||||
Text string
|
||||
VarType string
|
||||
Type uint8
|
||||
}
|
||||
|
||||
// MarshalJSON controls how TextTemplateItem will be marshaled into JSON.
|
||||
func (t TextTemplateItem) MarshalJSON() ([]byte, error) {
|
||||
switch t.Type {
|
||||
case TemplateItemTypeText:
|
||||
return json.Marshal(t.Text)
|
||||
case TemplateItemTypeVar:
|
||||
return json.Marshal(map[string]interface{}{
|
||||
"var": t.VarType,
|
||||
})
|
||||
}
|
||||
|
||||
return nil, errors.New("unknown TextTemplateItem type")
|
||||
}
|
||||
|
||||
// UnmarshalJSON will correctly unmarshal TextTemplateItem.
|
||||
func (t *TextTemplateItem) UnmarshalJSON(b []byte) error {
|
||||
var obj interface{}
|
||||
err := json.Unmarshal(b, &obj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch bodyPart := obj.(type) {
|
||||
case string:
|
||||
t.Type = TemplateItemTypeText
|
||||
t.Text = bodyPart
|
||||
case map[string]interface{}:
|
||||
// {} case
|
||||
if len(bodyPart) == 0 {
|
||||
t.Type = TemplateItemTypeText
|
||||
t.Text = "{}"
|
||||
return nil
|
||||
}
|
||||
|
||||
if varTypeCurr, ok := bodyPart["var"].(string); ok {
|
||||
if _, ok := templateVarAssoc[varTypeCurr]; !ok {
|
||||
return fmt.Errorf("invalid placeholder var '%s'", varTypeCurr)
|
||||
}
|
||||
|
||||
t.Type = TemplateItemTypeVar
|
||||
t.VarType = varTypeCurr
|
||||
} else {
|
||||
return errors.New("invalid TextTemplateItem")
|
||||
}
|
||||
default:
|
||||
return errors.New("invalid TextTemplateItem")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type ButtonType string
|
||||
|
||||
type Button struct {
|
||||
Type ButtonType `json:"type"`
|
||||
URL string `json:"url,omitempty"`
|
||||
Text string `json:"text,omitempty"`
|
||||
PhoneNumber string `json:"phoneNumber,omitempty"`
|
||||
Example []string `json:"example,omitempty"`
|
||||
}
|
149
testutils.go
149
testutils.go
|
@ -85,7 +85,7 @@ func getLoyaltyAccountCreate() SerializedCreateLoyaltyAccount {
|
|||
return SerializedCreateLoyaltyAccount{
|
||||
SerializedBaseLoyaltyAccount: SerializedBaseLoyaltyAccount{
|
||||
PhoneNumber: "89151005004",
|
||||
CustomFields: []string{"dog"},
|
||||
CustomFields: []interface{}{"dog"},
|
||||
},
|
||||
Customer: SerializedEntityCustomer{
|
||||
ID: 123,
|
||||
|
@ -103,7 +103,9 @@ func getLoyaltyAccountCreateResponse() CreateLoyaltyAccountResponse {
|
|||
LoyaltyLevel: LoyaltyLevel{},
|
||||
CreatedAt: "2022-11-24 12:39:37",
|
||||
ActivatedAt: "2022-11-24 12:39:37",
|
||||
CustomFields: []string{"dog"},
|
||||
CustomFields: map[string]interface{}{
|
||||
"animal": "dog",
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -118,7 +120,9 @@ func getLoyaltyAccountEditResponse() EditLoyaltyAccountResponse {
|
|||
LoyaltyLevel: LoyaltyLevel{},
|
||||
CreatedAt: "2022-11-24 12:39:37",
|
||||
ActivatedAt: "2022-11-24 12:39:37",
|
||||
CustomFields: []string{"dog"},
|
||||
CustomFields: map[string]interface{}{
|
||||
"animal": "dog",
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -134,7 +138,7 @@ func getLoyaltyAccountResponse() string {
|
|||
},
|
||||
"customer": {
|
||||
"id": 123,
|
||||
"customFields": [],
|
||||
"customFields": {},
|
||||
"firstName": "Руслан1",
|
||||
"lastName": "Ефанов",
|
||||
"patronymic": ""
|
||||
|
@ -154,7 +158,12 @@ func getLoyaltyAccountResponse() string {
|
|||
"createdAt": "2022-11-24 12:39:37",
|
||||
"activatedAt": "2022-11-24 12:39:37",
|
||||
"status": "activated",
|
||||
"customFields": []
|
||||
"customFields": {
|
||||
"custom_multiselect": ["test1", "test3"],
|
||||
"custom_select": "test2",
|
||||
"custom_integer": 456,
|
||||
"custom_float": 8.43
|
||||
}
|
||||
}
|
||||
}`
|
||||
}
|
||||
|
@ -424,3 +433,133 @@ func getLoyaltyResponse() string {
|
|||
}
|
||||
}`
|
||||
}
|
||||
|
||||
func getMGTemplatesResponse() string {
|
||||
return `{
|
||||
"success": true,
|
||||
"pagination": {
|
||||
"limit": 10,
|
||||
"totalCount": 100,
|
||||
"currentPage": 5,
|
||||
"totalPageCount": 10
|
||||
},
|
||||
"templates": [
|
||||
{
|
||||
"id": 1,
|
||||
"externalId": 0,
|
||||
"channel": {
|
||||
"allowedSendByPhone": false,
|
||||
"id": 1,
|
||||
"externalId": 1,
|
||||
"type": "fbmessenger",
|
||||
"active": true,
|
||||
"name": "fbmessenger"
|
||||
},
|
||||
"code": "namespace#NAMEAAA#ru",
|
||||
"name": "NAMEAAA",
|
||||
"active": true,
|
||||
"template": [
|
||||
"Text_0",
|
||||
{
|
||||
"var": "custom"
|
||||
}
|
||||
],
|
||||
"templateExample": ["Text_1"],
|
||||
"namespace": "namespace_0",
|
||||
"lang": "en",
|
||||
"category": "test_0",
|
||||
"header": {
|
||||
"text": {
|
||||
"parts": [
|
||||
"JABAAA",
|
||||
{
|
||||
"var": "custom"
|
||||
}
|
||||
],
|
||||
"example": [
|
||||
"AAAAAA"
|
||||
]
|
||||
},
|
||||
"image": {
|
||||
"example": "https://example.com/file/123.png"
|
||||
},
|
||||
"document": {
|
||||
"example": "https://example.com/file/123.pdf"
|
||||
},
|
||||
"video": {
|
||||
"example": "https://example.com/file/123.mp4"
|
||||
}
|
||||
},
|
||||
"footer": "footer_0",
|
||||
"buttons": [
|
||||
{
|
||||
"type": "PHONE_NUMBER",
|
||||
"text": "your-phone-button-text",
|
||||
"phoneNumber": "+79895553535"
|
||||
},
|
||||
{
|
||||
"type": "QUICK_REPLY",
|
||||
"text": "Yes"
|
||||
},
|
||||
{
|
||||
"type": "URL",
|
||||
"url": "https://example.com/file/{{1}}",
|
||||
"text": "button",
|
||||
"example": [
|
||||
"https://www.website.com/dynamic-url-example"
|
||||
]
|
||||
}
|
||||
],
|
||||
"verificationStatus": "APPROVED"
|
||||
}
|
||||
]
|
||||
}`
|
||||
}
|
||||
|
||||
func getMGTemplatesForEdit() string {
|
||||
return `[{"header":{"text":{"parts":["Hello,",{"var":"custom"}],"example":["Henry"]},"document":{"example":"https://example.com/file/123.pdf"},"image":{"example":"https://example.com/file/123.png"},"video":{"example":"https://example.com/file/123.mp4"}},"lang":"en","category":"test_0","code":"namespace#name_0#ru","name":"name_0","namespace":"namespace","footer":"footer_0","verificationStatus":"REJECTED","template":["Text_0",{"var":"custom"}],"buttons":[{"type":"PHONE_NUMBER","text":"your-phone-button-text","phoneNumber":"+79895553535"},{"type":"QUICK_REPLY","text":"Yes"},{"type":"URL","url":"https://example.com/file/{{1}}","text":"button","example":["https://www.website.com/dynamic-url-example"]}],"templateExample":["WIU"],"id":1,"externalId":10,"mgChannelId":110,"active":true}]`
|
||||
}
|
||||
|
||||
func getStoreOfferResponse() string {
|
||||
return `{
|
||||
"success": true,
|
||||
"pagination": {
|
||||
"limit": 20,
|
||||
"totalCount": 1,
|
||||
"currentPage": 1,
|
||||
"totalPageCount": 1
|
||||
},
|
||||
"offers": [
|
||||
{
|
||||
"images": [
|
||||
"https://s3-s1.retailcrm.tech/ru-central1/retailcrm/dev-vega-d32aea7f9a5bc26eba6ad986077cea03/product/65a92fa0bb737-test.jpeg"
|
||||
],
|
||||
"id": 76,
|
||||
"site": "main",
|
||||
"name": "Название\nПеревод строки",
|
||||
"article": "Артикул",
|
||||
"product": {
|
||||
"type": "product",
|
||||
"catalogId": 2,
|
||||
"id": 222
|
||||
},
|
||||
"prices": [
|
||||
{
|
||||
"priceType": "base",
|
||||
"price": 10000,
|
||||
"ordering": 991,
|
||||
"currency": "RUB"
|
||||
}
|
||||
],
|
||||
"purchasePrice": 10,
|
||||
"quantity": 5,
|
||||
"active": true,
|
||||
"unit": {
|
||||
"code": "pc",
|
||||
"name": "Штука",
|
||||
"sym": "шт."
|
||||
}
|
||||
}
|
||||
]
|
||||
}`
|
||||
}
|
||||
|
|
518
types.go
518
types.go
|
@ -5,14 +5,28 @@ import (
|
|||
"net/http"
|
||||
"reflect"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// ByID is "id" constant to use as `by` property in methods.
|
||||
const ByID = "id"
|
||||
|
||||
// ByExternalId is "externalId" constant to use as `by` property in methods.
|
||||
// ByExternalID is "externalId" constant to use as `by` property in methods.
|
||||
const ByExternalID = "externalId"
|
||||
|
||||
// RateLimiter configuration constants.
|
||||
const (
|
||||
regularPathRPS = 10 // API rate limit (requests per second).
|
||||
telephonyPathRPS = 40 // Telephony API endpoints rate limit (requests per second).
|
||||
regularDelay = time.Second / regularPathRPS // Delay between regular requests.
|
||||
telephonyDelay = time.Second / telephonyPathRPS // Delay between telephony requests.
|
||||
)
|
||||
|
||||
// HTTPStatusUnknown can return for the method `/api/v5/customers/upload`, `/api/v5/customers-corporate/upload`,
|
||||
// `/api/v5/orders/upload`.
|
||||
const HTTPStatusUnknown = 460
|
||||
|
||||
// Client type.
|
||||
type Client struct {
|
||||
URL string
|
||||
|
@ -20,6 +34,15 @@ type Client struct {
|
|||
Debug bool
|
||||
httpClient *http.Client
|
||||
logger BasicLogger
|
||||
limiter *RateLimiter
|
||||
mutex sync.Mutex
|
||||
}
|
||||
|
||||
// RateLimiter manages API request rates to prevent hitting rate limits.
|
||||
type RateLimiter struct {
|
||||
maxAttempts uint // Maximum number of retry attempts (0 = infinite).
|
||||
lastRequest time.Time // Time of the last request.
|
||||
mutex sync.Mutex
|
||||
}
|
||||
|
||||
// Pagination type.
|
||||
|
@ -53,22 +76,29 @@ type Address struct {
|
|||
Text string `json:"text,omitempty"`
|
||||
}
|
||||
|
||||
// GeoID type. Can be empty string.
|
||||
type GeoID json.Number
|
||||
|
||||
// GeoHierarchyRow type.
|
||||
type GeoHierarchyRow struct {
|
||||
Country string `json:"country,omitempty"`
|
||||
Region string `json:"region,omitempty"`
|
||||
RegionID int `json:"regionId,omitempty"`
|
||||
RegionID GeoID `json:"regionId,omitempty"`
|
||||
City string `json:"city,omitempty"`
|
||||
CityID int `json:"cityId,omitempty"`
|
||||
CityID GeoID `json:"cityId,omitempty"`
|
||||
}
|
||||
|
||||
// Source type.
|
||||
type Source struct {
|
||||
Source string `json:"source,omitempty"`
|
||||
Medium string `json:"medium,omitempty"`
|
||||
Campaign string `json:"campaign,omitempty"`
|
||||
Keyword string `json:"keyword,omitempty"`
|
||||
Content string `json:"content,omitempty"`
|
||||
Source string `json:"source,omitempty"`
|
||||
Medium string `json:"medium,omitempty"`
|
||||
Campaign string `json:"campaign,omitempty"`
|
||||
Keyword string `json:"keyword,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.
|
||||
|
@ -122,41 +152,41 @@ Customer related types
|
|||
|
||||
// Customer type.
|
||||
type Customer struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
ExternalID string `json:"externalId,omitempty"`
|
||||
FirstName string `json:"firstName,omitempty"`
|
||||
LastName string `json:"lastName,omitempty"`
|
||||
Patronymic string `json:"patronymic,omitempty"`
|
||||
Sex string `json:"sex,omitempty"`
|
||||
Email string `json:"email,omitempty"`
|
||||
Phones []Phone `json:"phones,omitempty"`
|
||||
Address *Address `json:"address,omitempty"`
|
||||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Birthday string `json:"birthday,omitempty"`
|
||||
ManagerID int `json:"managerId,omitempty"`
|
||||
Vip bool `json:"vip,omitempty"`
|
||||
Bad bool `json:"bad,omitempty"`
|
||||
Site string `json:"site,omitempty"`
|
||||
Source *Source `json:"source,omitempty"`
|
||||
Contragent *Contragent `json:"contragent,omitempty"`
|
||||
PersonalDiscount float32 `json:"personalDiscount,omitempty"`
|
||||
CumulativeDiscount float32 `json:"cumulativeDiscount,omitempty"`
|
||||
DiscountCardNumber string `json:"discountCardNumber,omitempty"`
|
||||
EmailMarketingUnsubscribedAt string `json:"emailMarketingUnsubscribedAt,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"`
|
||||
MaturationTime int `json:"maturationTime,omitempty"`
|
||||
FirstClientID string `json:"firstClientId,omitempty"`
|
||||
LastClientID string `json:"lastClientId,omitempty"`
|
||||
BrowserID string `json:"browserId,omitempty"`
|
||||
MgCustomerID string `json:"mgCustomerId,omitempty"`
|
||||
PhotoURL string `json:"photoUrl,omitempty"`
|
||||
CustomFields StringMap `json:"customFields,omitempty"`
|
||||
Tags []Tag `json:"tags,omitempty"`
|
||||
ID int `json:"id,omitempty"`
|
||||
ExternalID string `json:"externalId,omitempty"`
|
||||
FirstName string `json:"firstName,omitempty"`
|
||||
LastName string `json:"lastName,omitempty"`
|
||||
Patronymic string `json:"patronymic,omitempty"`
|
||||
Sex string `json:"sex,omitempty"`
|
||||
Email string `json:"email,omitempty"`
|
||||
Phones []Phone `json:"phones,omitempty"`
|
||||
Address *Address `json:"address,omitempty"`
|
||||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Birthday string `json:"birthday,omitempty"`
|
||||
ManagerID int `json:"managerId,omitempty"`
|
||||
Vip bool `json:"vip,omitempty"`
|
||||
Bad bool `json:"bad,omitempty"`
|
||||
Site string `json:"site,omitempty"`
|
||||
Source *Source `json:"source,omitempty"`
|
||||
Contragent *Contragent `json:"contragent,omitempty"`
|
||||
PersonalDiscount float32 `json:"personalDiscount,omitempty"`
|
||||
CumulativeDiscount float32 `json:"cumulativeDiscount,omitempty"`
|
||||
DiscountCardNumber string `json:"discountCardNumber,omitempty"`
|
||||
EmailMarketingUnsubscribedAt string `json:"emailMarketingUnsubscribedAt,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"`
|
||||
MaturationTime int `json:"maturationTime,omitempty"`
|
||||
FirstClientID string `json:"firstClientId,omitempty"`
|
||||
LastClientID string `json:"lastClientId,omitempty"`
|
||||
BrowserID string `json:"browserId,omitempty"`
|
||||
MgCustomerID string `json:"mgCustomerId,omitempty"`
|
||||
PhotoURL string `json:"photoUrl,omitempty"`
|
||||
CustomFields CustomFieldMap `json:"customFields,omitempty"`
|
||||
Tags []Tag `json:"tags,omitempty"`
|
||||
}
|
||||
|
||||
// CorporateCustomer type.
|
||||
|
@ -167,7 +197,7 @@ type CorporateCustomer struct {
|
|||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Vip bool `json:"vip,omitempty"`
|
||||
Bad bool `json:"bad,omitempty"`
|
||||
CustomFields StringMap `json:"customFields,omitempty"`
|
||||
CustomFields CustomFieldMap `json:"customFields,omitempty"`
|
||||
PersonalDiscount float32 `json:"personalDiscount,omitempty"`
|
||||
DiscountCardNumber string `json:"discountCardNumber,omitempty"`
|
||||
ManagerID int `json:"managerId,omitempty"`
|
||||
|
@ -217,6 +247,15 @@ type CorporateCustomerContactCustomer struct {
|
|||
Site string `json:"site,omitempty"`
|
||||
}
|
||||
|
||||
// CartCustomer type.
|
||||
type CartCustomer struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
ExternalID string `json:"externalId,omitempty"`
|
||||
Site string `json:"site,omitempty"`
|
||||
BrowserID string `json:"browserId,omitempty"`
|
||||
GaClientID string `json:"gaClientId,omitempty"`
|
||||
}
|
||||
|
||||
type Company struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
IsMain bool `json:"isMain,omitempty"`
|
||||
|
@ -228,7 +267,7 @@ type Company struct {
|
|||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Contragent *Contragent `json:"contragent,omitempty"`
|
||||
Address *IdentifiersPair `json:"address,omitempty"`
|
||||
CustomFields StringMap `json:"customFields,omitempty"`
|
||||
CustomFields CustomFieldMap `json:"customFields,omitempty"`
|
||||
}
|
||||
|
||||
// CorporateCustomerNote type.
|
||||
|
@ -245,15 +284,25 @@ type Phone struct {
|
|||
|
||||
// CustomerHistoryRecord type.
|
||||
type CustomerHistoryRecord struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Created bool `json:"created,omitempty"`
|
||||
Deleted bool `json:"deleted,omitempty"`
|
||||
Source string `json:"source,omitempty"`
|
||||
Field string `json:"field,omitempty"`
|
||||
User *User `json:"user,omitempty"`
|
||||
APIKey *APIKey `json:"apiKey,omitempty"`
|
||||
Customer *Customer `json:"customer,omitempty"`
|
||||
ID int `json:"id,omitempty"`
|
||||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Created bool `json:"created,omitempty"`
|
||||
Deleted bool `json:"deleted,omitempty"`
|
||||
Source string `json:"source,omitempty"`
|
||||
Field string `json:"field,omitempty"`
|
||||
OldValue interface{} `json:"oldValue,omitempty"`
|
||||
NewValue interface{} `json:"newValue,omitempty"`
|
||||
User *User `json:"user,omitempty"`
|
||||
APIKey *APIKey `json:"apiKey,omitempty"`
|
||||
Customer *Customer `json:"customer,omitempty"`
|
||||
Address *CustomerAddressWithIsMain `json:"address,omitempty"`
|
||||
}
|
||||
|
||||
type CustomerAddressWithIsMain struct {
|
||||
ID int `json:"id"`
|
||||
ExternalID string `json:"externalId,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
IsMain bool `json:"isMain"`
|
||||
}
|
||||
|
||||
// CorporateCustomerHistoryRecord type.
|
||||
|
@ -264,6 +313,8 @@ type CorporateCustomerHistoryRecord struct {
|
|||
Deleted bool `json:"deleted,omitempty"`
|
||||
Source string `json:"source,omitempty"`
|
||||
Field string `json:"field,omitempty"`
|
||||
OldValue interface{} `json:"oldValue,omitempty"`
|
||||
NewValue interface{} `json:"newValue,omitempty"`
|
||||
User *User `json:"user,omitempty"`
|
||||
APIKey *APIKey `json:"apiKey,omitempty"`
|
||||
CorporateCustomer *CorporateCustomer `json:"corporateCustomer,omitempty"`
|
||||
|
@ -275,6 +326,7 @@ Order related types
|
|||
|
||||
type OrderPayments map[string]OrderPayment
|
||||
type StringMap map[string]string
|
||||
type CustomFieldMap map[string]interface{}
|
||||
type Properties map[string]Property
|
||||
|
||||
// Order type.
|
||||
|
@ -326,10 +378,61 @@ type Order struct {
|
|||
Delivery *OrderDelivery `json:"delivery,omitempty"`
|
||||
Marketplace *OrderMarketplace `json:"marketplace,omitempty"`
|
||||
Items []OrderItem `json:"items,omitempty"`
|
||||
CustomFields StringMap `json:"customFields,omitempty"`
|
||||
CustomFields CustomFieldMap `json:"customFields,omitempty"`
|
||||
Payments OrderPayments `json:"payments,omitempty"`
|
||||
ApplyRound *bool `json:"applyRound,omitempty"`
|
||||
PrivilegeType string `json:"privilegeType,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"`
|
||||
}
|
||||
|
||||
// ClearCartOrder type.
|
||||
type ClearCartOrder struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
ExternalID string `json:"externalID,omitempty"`
|
||||
Number string `json:"number,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.
|
||||
|
@ -382,6 +485,59 @@ type OrderDeliveryData struct {
|
|||
AdditionalFields map[string]interface{}
|
||||
}
|
||||
|
||||
// SetCartItem type.
|
||||
type SetCartItem struct {
|
||||
Quantity float64 `json:"quantity,omitempty"`
|
||||
Price float64 `json:"price,omitempty"`
|
||||
Offer SetCartOffer `json:"offer,omitempty"`
|
||||
}
|
||||
|
||||
// SetCartOffer type.
|
||||
type SetCartOffer struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
ExternalID string `json:"externalID,omitempty"`
|
||||
XMLID string `json:"xmlId,omitempty"`
|
||||
}
|
||||
|
||||
// Cart type.
|
||||
type Cart struct {
|
||||
Currency string `json:"currency,omitempty"`
|
||||
ExternalID string `json:"externalId,omitempty"`
|
||||
DroppedAt string `json:"droppedAt,omitempty"`
|
||||
ClearedAt string `json:"clearedAt,omitempty"`
|
||||
Link string `json:"link,omitempty"`
|
||||
Items []CartItem `json:"items,omitempty"`
|
||||
}
|
||||
|
||||
// CartItem type.
|
||||
type CartItem struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
Quantity float64 `json:"quantity,omitempty"`
|
||||
Price float64 `json:"price,omitempty"`
|
||||
Offer CartOffer `json:"offer,omitempty"`
|
||||
}
|
||||
|
||||
// CartOffer type.
|
||||
type CartOffer struct {
|
||||
DisplayName string `json:"displayName,omitempty"`
|
||||
ID int `json:"id,omitempty"`
|
||||
ExternalID string `json:"externalId,omitempty"`
|
||||
XMLID string `json:"xmlId,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
Article string `json:"article,omitempty"`
|
||||
VatRate string `json:"vatRate,omitempty"`
|
||||
Properties StringMap `json:"properties,omitempty"`
|
||||
Unit CartUnit `json:"unit,omitempty"`
|
||||
Barcode string `json:"barcode,omitempty"`
|
||||
}
|
||||
|
||||
// CartUnit type.
|
||||
type CartUnit struct {
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
Sym string `json:"sym"`
|
||||
}
|
||||
|
||||
// UnmarshalJSON method.
|
||||
func (v *OrderDeliveryData) UnmarshalJSON(b []byte) error {
|
||||
var additionalData map[string]interface{}
|
||||
|
@ -465,15 +621,21 @@ type OrderItem struct {
|
|||
|
||||
// OrdersHistoryRecord type.
|
||||
type OrdersHistoryRecord struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Created bool `json:"created,omitempty"`
|
||||
Deleted bool `json:"deleted,omitempty"`
|
||||
Source string `json:"source,omitempty"`
|
||||
Field string `json:"field,omitempty"`
|
||||
User *User `json:"user,omitempty"`
|
||||
APIKey *APIKey `json:"apiKey,omitempty"`
|
||||
Order *Order `json:"order,omitempty"`
|
||||
ID int `json:"id,omitempty"`
|
||||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Created bool `json:"created,omitempty"`
|
||||
Deleted bool `json:"deleted,omitempty"`
|
||||
Source string `json:"source,omitempty"`
|
||||
Field string `json:"field,omitempty"`
|
||||
OldValue interface{} `json:"oldValue,omitempty"`
|
||||
NewValue interface{} `json:"newValue,omitempty"`
|
||||
User *User `json:"user,omitempty"`
|
||||
APIKey *APIKey `json:"apiKey,omitempty"`
|
||||
Order *Order `json:"order,omitempty"`
|
||||
Ancestor *Order `json:"ancestor,omitempty"`
|
||||
Item *OrderItem `json:"item,omitempty"`
|
||||
Payment *Payment `json:"payment"`
|
||||
CombinedTo *Order `json:"combinedTo,omitempty"`
|
||||
}
|
||||
|
||||
// Pack type.
|
||||
|
@ -499,14 +661,16 @@ type PackItem struct {
|
|||
|
||||
// PacksHistoryRecord type.
|
||||
type PacksHistoryRecord struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Created bool `json:"created,omitempty"`
|
||||
Deleted bool `json:"deleted,omitempty"`
|
||||
Source string `json:"source,omitempty"`
|
||||
Field string `json:"field,omitempty"`
|
||||
User *User `json:"user,omitempty"`
|
||||
Pack *Pack `json:"pack,omitempty"`
|
||||
ID int `json:"id,omitempty"`
|
||||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Created bool `json:"created,omitempty"`
|
||||
Deleted bool `json:"deleted,omitempty"`
|
||||
Source string `json:"source,omitempty"`
|
||||
Field string `json:"field,omitempty"`
|
||||
OldValue interface{} `json:"oldValue,omitempty"`
|
||||
NewValue interface{} `json:"newValue,omitempty"`
|
||||
User *User `json:"user,omitempty"`
|
||||
Pack *Pack `json:"pack,omitempty"`
|
||||
}
|
||||
|
||||
// Offer type.
|
||||
|
@ -529,6 +693,7 @@ type Offer struct {
|
|||
Prices []OfferPrice `json:"prices,omitempty"`
|
||||
Images []string `json:"images,omitempty"`
|
||||
Unit *Unit `json:"unit,omitempty"`
|
||||
Product *Product `json:"product,omitempty"`
|
||||
}
|
||||
|
||||
// Inventory type.
|
||||
|
@ -558,6 +723,7 @@ type OfferPrice struct {
|
|||
Price float32 `json:"price,omitempty"`
|
||||
Ordering int `json:"ordering,omitempty"`
|
||||
PriceType string `json:"priceType,omitempty"`
|
||||
Currency string `json:"currency,omitempty"`
|
||||
}
|
||||
|
||||
// OfferPriceUpload type.
|
||||
|
@ -597,6 +763,7 @@ type User struct {
|
|||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
Active bool `json:"active,omitempty"`
|
||||
Online bool `json:"online,omitempty"`
|
||||
Position string `json:"position,omitempty"`
|
||||
IsAdmin bool `json:"isAdmin,omitempty"`
|
||||
IsManager bool `json:"isManager,omitempty"`
|
||||
Email string `json:"email,omitempty"`
|
||||
|
@ -705,10 +872,16 @@ type WorkTime struct {
|
|||
LunchEndTime string `json:"lunch_end_time"`
|
||||
}
|
||||
|
||||
// NonWorkingDays type.
|
||||
type NonWorkingDays struct {
|
||||
StartDate string `json:"start_date"`
|
||||
EndDate string `json:"end_date"`
|
||||
}
|
||||
|
||||
type SerializedBaseLoyaltyAccount struct {
|
||||
PhoneNumber string `json:"phoneNumber,omitempty"`
|
||||
CardNumber string `json:"cardNumber,omitempty"`
|
||||
CustomFields []string `json:"customFields,omitempty"`
|
||||
PhoneNumber string `json:"phoneNumber,omitempty"`
|
||||
CardNumber string `json:"cardNumber,omitempty"`
|
||||
CustomFields []interface{} `json:"customFields,omitempty"`
|
||||
}
|
||||
|
||||
type SerializedCreateLoyaltyAccount struct {
|
||||
|
@ -720,12 +893,29 @@ type SerializedEditLoyaltyAccount struct {
|
|||
SerializedBaseLoyaltyAccount
|
||||
}
|
||||
|
||||
type ChannelSetting struct {
|
||||
Site string `json:"site"`
|
||||
OrderType string `json:"order_type"`
|
||||
OrderMethod string `json:"order_method"`
|
||||
}
|
||||
|
||||
type MgOrderCreationSettings struct {
|
||||
Channels map[int]ChannelSetting `json:"channels"`
|
||||
Default ChannelSetting `json:"default"`
|
||||
}
|
||||
|
||||
type MgSettings struct {
|
||||
OrderCreation MgOrderCreationSettings `json:"order_creation"`
|
||||
}
|
||||
|
||||
// Settings type. Contains retailCRM configuration.
|
||||
type Settings struct {
|
||||
DefaultCurrency SettingsNode `json:"default_currency"`
|
||||
SystemLanguage SettingsNode `json:"system_language"`
|
||||
Timezone SettingsNode `json:"timezone"`
|
||||
WorkTimes []WorkTime `json:"work_times"`
|
||||
DefaultCurrency SettingsNode `json:"default_currency"`
|
||||
SystemLanguage SettingsNode `json:"system_language"`
|
||||
Timezone SettingsNode `json:"timezone"`
|
||||
MgSettings MgSettings `json:"mg"`
|
||||
WorkTimes []WorkTime `json:"work_times"`
|
||||
NonWorkingDays []NonWorkingDays `json:"non_working_days"`
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -787,6 +977,7 @@ type DeliveryType struct {
|
|||
DeliveryServices []string `json:"deliveryServices,omitempty"`
|
||||
PaymentTypes []string `json:"paymentTypes,omitempty"` // Deprecated, use DeliveryPaymentTypes
|
||||
DeliveryPaymentTypes []DeliveryPaymentType `json:"deliveryPaymentTypes,omitempty"`
|
||||
Currency string `json:"currency,omitempty"`
|
||||
}
|
||||
|
||||
type DeliveryPaymentType struct {
|
||||
|
@ -817,8 +1008,8 @@ type LegalEntity struct {
|
|||
}
|
||||
|
||||
type SerializedEntityCustomer struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
ExternalID int `json:"externalId,omitempty"`
|
||||
ID int `json:"id,omitempty"`
|
||||
ExternalID string `json:"externalId,omitempty"`
|
||||
}
|
||||
|
||||
// OrderMethod type.
|
||||
|
@ -876,6 +1067,7 @@ type PriceType struct {
|
|||
Ordering int `json:"ordering,omitempty"`
|
||||
Groups []string `json:"groups,omitempty"`
|
||||
Geo []GeoHierarchyRow `json:"geo,omitempty"`
|
||||
Currency string `json:"currency,omitempty"`
|
||||
}
|
||||
|
||||
// ProductStatus type.
|
||||
|
@ -929,6 +1121,7 @@ type Site struct {
|
|||
IsDemo bool `json:"isDemo,omitempty"`
|
||||
CatalogID string `json:"catalogId,omitempty"`
|
||||
IsCatalogMainSite bool `json:"isCatalogMainSite,omitempty"`
|
||||
Currency string `json:"currency,omitempty"`
|
||||
}
|
||||
|
||||
// Store type.
|
||||
|
@ -960,24 +1153,33 @@ type ProductGroup struct {
|
|||
|
||||
// BaseProduct type.
|
||||
type BaseProduct struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
URL string `json:"url,omitempty"`
|
||||
Article string `json:"article,omitempty"`
|
||||
ExternalID string `json:"externalId,omitempty"`
|
||||
Manufacturer string `json:"manufacturer,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
Popular bool `json:"popular,omitempty"`
|
||||
Stock bool `json:"stock,omitempty"`
|
||||
Novelty bool `json:"novelty,omitempty"`
|
||||
Recommended bool `json:"recommended,omitempty"`
|
||||
Active bool `json:"active,omitempty"`
|
||||
Markable bool `json:"markable,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
Type ProductType `json:"type,omitempty"`
|
||||
URL string `json:"url,omitempty"`
|
||||
Article string `json:"article,omitempty"`
|
||||
ExternalID string `json:"externalId,omitempty"`
|
||||
Manufacturer string `json:"manufacturer,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
Popular bool `json:"popular,omitempty"`
|
||||
Stock bool `json:"stock,omitempty"`
|
||||
Novelty bool `json:"novelty,omitempty"`
|
||||
Recommended bool `json:"recommended,omitempty"`
|
||||
Active bool `json:"active,omitempty"`
|
||||
Markable bool `json:"markable,omitempty"`
|
||||
}
|
||||
|
||||
type ProductType string
|
||||
|
||||
const (
|
||||
RegularProduct ProductType = "product"
|
||||
ServiceProduct ProductType = "service"
|
||||
)
|
||||
|
||||
// Product type.
|
||||
type Product struct {
|
||||
BaseProduct
|
||||
ID int `json:"id,omitempty"`
|
||||
Type ProductType `json:"type"`
|
||||
MaxPrice float32 `json:"maxPrice,omitempty"`
|
||||
MinPrice float32 `json:"minPrice,omitempty"`
|
||||
ImageURL string `json:"imageUrl,omitempty"`
|
||||
|
@ -1148,11 +1350,21 @@ type Action struct {
|
|||
|
||||
// MgTransport type.
|
||||
type MgTransport struct {
|
||||
WebhookURL string `json:"webhookUrl,omitempty"`
|
||||
WebhookURL string `json:"webhookUrl,omitempty"`
|
||||
RefreshToken bool `json:"refreshToken,omitempty"`
|
||||
Actions *MgTransportActions `json:"actions,omitempty"`
|
||||
}
|
||||
|
||||
type MgTransportActions struct {
|
||||
Visits string `json:"visits,omitempty"`
|
||||
Online string `json:"online,omitempty"`
|
||||
ManualTemplatesSync string `json:"manualTemplatesSync,omitempty"`
|
||||
}
|
||||
|
||||
// MgBot type.
|
||||
type MgBot struct{}
|
||||
type MgBot struct {
|
||||
RefreshToken bool `json:"refreshToken,omitempty"`
|
||||
}
|
||||
|
||||
/**
|
||||
Cost related types
|
||||
|
@ -1213,11 +1425,13 @@ type CustomFields struct {
|
|||
InGroupActions bool `json:"inGroupActions,omitempty"`
|
||||
Type string `json:"type,omitempty"`
|
||||
Entity string `json:"entity,omitempty"`
|
||||
Default string `json:"default,omitempty"`
|
||||
Ordering int `json:"ordering,omitempty"`
|
||||
DisplayArea string `json:"displayArea,omitempty"`
|
||||
ViewMode string `json:"viewMode,omitempty"`
|
||||
Dictionary string `json:"dictionary,omitempty"`
|
||||
// Deprecated: Use DefaultTyped instead.
|
||||
Default string `json:"default,omitempty"`
|
||||
Ordering int `json:"ordering,omitempty"`
|
||||
DisplayArea string `json:"displayArea,omitempty"`
|
||||
ViewMode string `json:"viewMode,omitempty"`
|
||||
Dictionary string `json:"dictionary,omitempty"`
|
||||
DefaultTyped interface{} `json:"default_typed,omitempty"`
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1244,6 +1458,45 @@ type Activity struct {
|
|||
Freeze bool `json:"freeze"`
|
||||
}
|
||||
|
||||
type ChatCustomerOnline struct {
|
||||
LastOnline SystemTime `json:"lastOnline"`
|
||||
}
|
||||
|
||||
type ChatVisitsResponse struct {
|
||||
UTM *ChatUTM `json:"utm,omitempty"`
|
||||
Device ChatDevice `json:"device"`
|
||||
Country string `json:"country"`
|
||||
City string `json:"city"`
|
||||
LastVisit ChatLastVisit `json:"lastVisit"`
|
||||
CountVisits uint `json:"countVisits"`
|
||||
}
|
||||
|
||||
type ChatLastVisit struct {
|
||||
CreatedAt SystemTime `json:"createdAt"`
|
||||
EndedAt *SystemTime `json:"endedAt,omitempty"`
|
||||
Source string `json:"source"`
|
||||
Pages []ChatVisitedPage `json:"pages"`
|
||||
Duration uint `json:"duration"`
|
||||
}
|
||||
|
||||
type ChatVisitedPage struct {
|
||||
DateTime SystemTime `json:"dateTime"`
|
||||
Title string `json:"title,omitempty"`
|
||||
URL string `json:"url"`
|
||||
}
|
||||
|
||||
type ChatDevice struct {
|
||||
Lang string `json:"lang"`
|
||||
Browser string `json:"browser"`
|
||||
OS string `json:"os"`
|
||||
}
|
||||
|
||||
type ChatUTM struct {
|
||||
Source string `json:"source"`
|
||||
Medium string `json:"medium"`
|
||||
Campaign string `json:"campaign"`
|
||||
}
|
||||
|
||||
// Tag struct.
|
||||
type Tag struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
|
@ -1303,22 +1556,22 @@ type DeliveryTypeInfo struct {
|
|||
|
||||
// LoyaltyAccount type.
|
||||
type LoyaltyAccount struct {
|
||||
Active bool `json:"active"`
|
||||
ID int `json:"id"`
|
||||
PhoneNumber string `json:"phoneNumber,omitempty"`
|
||||
CardNumber string `json:"cardNumber,omitempty"`
|
||||
Amount float64 `json:"amount,omitempty"`
|
||||
LoyaltyLevel LoyaltyLevel `json:"level,omitempty"`
|
||||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
ActivatedAt string `json:"activatedAt,omitempty"`
|
||||
ConfirmedPhoneAt string `json:"confirmedPhoneAt,omitempty"`
|
||||
LastCheckID int `json:"lastCheckId,omitempty"`
|
||||
CustomFields []string `json:"customFields,omitempty"`
|
||||
Loyalty Loyalty `json:"loyalty,omitempty"`
|
||||
Customer Customer `json:"customer,omitempty"`
|
||||
Status string `json:"status,omitempty"`
|
||||
OrderSum float64 `json:"orderSum,omitempty"`
|
||||
NextLevelSum float64 `json:"nextLevelSum,omitempty"`
|
||||
Active bool `json:"active"`
|
||||
ID int `json:"id"`
|
||||
PhoneNumber string `json:"phoneNumber,omitempty"`
|
||||
CardNumber string `json:"cardNumber,omitempty"`
|
||||
Amount float64 `json:"amount,omitempty"`
|
||||
LoyaltyLevel LoyaltyLevel `json:"level,omitempty"`
|
||||
CreatedAt string `json:"createdAt,omitempty"`
|
||||
ActivatedAt string `json:"activatedAt,omitempty"`
|
||||
ConfirmedPhoneAt string `json:"confirmedPhoneAt,omitempty"`
|
||||
LastCheckID int `json:"lastCheckId,omitempty"`
|
||||
CustomFields CustomFieldMap `json:"customFields,omitempty"`
|
||||
Loyalty Loyalty `json:"loyalty,omitempty"`
|
||||
Customer Customer `json:"customer,omitempty"`
|
||||
Status string `json:"status,omitempty"`
|
||||
OrderSum float64 `json:"orderSum,omitempty"`
|
||||
NextLevelSum float64 `json:"nextLevelSum,omitempty"`
|
||||
}
|
||||
|
||||
// Loyalty type.
|
||||
|
@ -1334,6 +1587,7 @@ type Loyalty struct {
|
|||
ActivatedAt string `json:"activatedAt,omitempty"`
|
||||
DeactivatedAt string `json:"deactivatedAt,omitempty"`
|
||||
BlockedAt string `json:"blockedAt,omitempty"`
|
||||
Currency string `json:"currency,omitempty"`
|
||||
}
|
||||
|
||||
// LoyaltyLevel type.
|
||||
|
@ -1377,6 +1631,7 @@ type SerializedLoyaltyOrder struct {
|
|||
Delivery Delivery `json:"delivery,omitempty"`
|
||||
Site string `json:"site,omitempty"`
|
||||
Items []LoyaltyItems `json:"items,omitempty"`
|
||||
Currency string `json:"currency,omitempty"`
|
||||
}
|
||||
|
||||
type LoyaltyEventDiscount struct {
|
||||
|
@ -1431,3 +1686,34 @@ type SerializedLoyalty struct {
|
|||
type ExternalID struct {
|
||||
ExternalID string `json:"externalId,omitempty"`
|
||||
}
|
||||
|
||||
type UserGroupType string
|
||||
type NotificationType string
|
||||
|
||||
type MGChannel struct {
|
||||
Type string `json:"type"`
|
||||
Name string `json:"name"`
|
||||
ID int `json:"id"`
|
||||
ExternalID int `json:"externalId"`
|
||||
AllowedSendByPhone bool `json:"allowedSendByPhone"`
|
||||
Active bool `json:"active"`
|
||||
}
|
||||
|
||||
type MGChannelTemplate struct {
|
||||
Channel *MGChannel `json:"channel,omitempty"`
|
||||
Header *Header `json:"header"`
|
||||
Lang string `json:"lang"`
|
||||
Category string `json:"category"`
|
||||
Code string `json:"code,omitempty"`
|
||||
Name string `json:"name"`
|
||||
Namespace string `json:"namespace,omitempty"`
|
||||
Footer string `json:"footer,omitempty"`
|
||||
VerificationStatus string `json:"verificationStatus,omitempty"`
|
||||
BodyTemplate TemplateItemList `json:"template"`
|
||||
Buttons []Button `json:"buttons,omitempty"`
|
||||
BodyTemplateExample []string `json:"templateExample"`
|
||||
ID int `json:"id,omitempty"`
|
||||
ExternalID int `json:"externalId,omitempty"`
|
||||
MGChannelID int `json:"mgChannelId"`
|
||||
Active bool `json:"active"`
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue