diff --git a/go.mod b/go.mod index 9bbd93c..459a1ee 100644 --- a/go.mod +++ b/go.mod @@ -12,12 +12,14 @@ require ( github.com/twmb/franz-go v1.16.1 go.uber.org/zap v1.27.0 google.golang.org/protobuf v1.33.0 - penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621172746-5cbeb2b88f0a + penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621165314-e374d50e42e6 ) require ( + github.com/ClickHouse/clickhouse-go v1.5.4 // indirect github.com/andybalholm/brotli v1.0.5 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dustin/go-humanize v1.0.1 // indirect diff --git a/go.sum b/go.sum index a9a58ff..6963eb6 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,15 @@ +github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0= +github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk= +github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= github.com/caarlos0/env/v8 v8.0.0 h1:POhxHhSpuxrLMIdvTGARuZqR4Jjm8AYmoi/JKlcScs0= github.com/caarlos0/env/v8 v8.0.0/go.mod h1:7K4wMY9bH0esiXSSHlfHLX5xKGQMnkH5Fk4TDSSSzfo= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -15,6 +21,7 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM= github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= @@ -28,6 +35,7 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -43,6 +51,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -52,6 +61,7 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= github.com/minio/minio-go/v7 v7.0.69 h1:l8AnsQFyY1xiwa/DaQskY4NXSLA2yrGsW5iD9nRPVS0= @@ -69,6 +79,8 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.19 h1:tYLzDnjDXh9qIxSTKHwXwOYmm9d887Y7Y1ZkyXYHAN4= github.com/pierrec/lz4/v4 v4.1.19/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -130,15 +142,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6 h1:oV+/HNX+JPoQ3/GUx08hio7d45WpY0AMGrFs7j70QlA= penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6/go.mod h1:lTmpjry+8evVkXWbEC+WMOELcFkRD1lFMc7J09mOndM= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240612153845-6a7e3f9ea52f h1:7pzOupQPADYOi7nH5lLZBzoAntV3rP8J4tlHg/eXkJA= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240612153845-6a7e3f9ea52f/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240619123238-dd521165c55a h1:u4soF4G76TAIN+/GLHdi+0Hc1qgN3W1s8g4hDvzqwyI= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240619123238-dd521165c55a/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240619180437-6d449201156e h1:ymGwJmQls96uNdY1301zLwJtC8YqSinZN0Rs+UGvYgA= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240619180437-6d449201156e/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621103513-9616b086fa4a h1:RPuYgZri2A15IF/kOshgstLdf6L0tV9m4FhFQUfzW/A= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621103513-9616b086fa4a/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621150128-4b70022ad675 h1:w9I3PSvR3XsxL48fgyi65zLhbnpJXUknKz3ZqkCltzI= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621150128-4b70022ad675/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621172746-5cbeb2b88f0a h1:all9W8RrLcr+47k6dAQgdyjVGuXbO3H29AkMGMTcJ28= -penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621172746-5cbeb2b88f0a/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398= +penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621165314-e374d50e42e6 h1:Ts1PGn2drIA3WJoSdlGvtMqsWBSQ02Pp/q4NxqIq/0c= +penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621165314-e374d50e42e6/go.mod h1:nfZkoj8MCYaoP+xiPeUn5D0lIzinUr1qDkNfX0ng9rk= diff --git a/internal/models/createContact.go b/internal/models/createContact.go index 5f21680..c647bf8 100644 --- a/internal/models/createContact.go +++ b/internal/models/createContact.go @@ -39,11 +39,11 @@ type LinkedContactReq struct { ToEntityID int32 `json:"to_entity_id"` // ID связанной сущности ToEntityType string `json:"to_entity_type"` // Тип связанной сущности (leads, contacts, companies, customers, catalog_elements) Metadata struct { - CatalogID int `json:"catalog_id"` // ID каталога - Quantity int `json:"quantity"` // Количество прикрепленных элементов каталогов - IsMain bool `json:"is_main"` // Является ли контакт главным - UpdatedBy int `json:"updated_by"` // ID пользователя, от имени которого осуществляется прикрепление - PriceID int `json:"price_id"` // ID поля типа Цена, которое будет установлено для привязанного элемента в контексте сущности + //CatalogID int `json:"catalog_id"` // ID каталога + //Quantity int `json:"quantity"` // Количество прикрепленных элементов каталогов + IsMain bool `json:"is_main"` // Является ли контакт главным + //UpdatedBy int `json:"updated_by"` // ID пользователя, от имени которого осуществляется прикрепление + //PriceID int `json:"price_id"` // ID поля типа Цена, которое будет установлено для привязанного элемента в контексте сущности } `json:"metadata"` } diff --git a/internal/tools/for_rules.go b/internal/tools/for_rules.go index a7d9813..90004b7 100644 --- a/internal/tools/for_rules.go +++ b/internal/tools/for_rules.go @@ -57,13 +57,15 @@ func ToCreatedUpdateQuestionRules(questionsTypeMap map[model.EntityType][]model. for entity, questions := range questionsTypeMap { for _, question := range questions { // если заголоввок пустой у вопроса делаем ему заголовок чтоб в амо легли филды нормально - title := strings.ReplaceAll(question.Title, " ", "") + title := strings.ToLower(strings.ReplaceAll(question.Title, " ", "")) if title == "" { question.Title = fmt.Sprintf("Вопрос №%d", question.Page) } + title = strings.ToLower(strings.ReplaceAll(question.Title, " ", "")) matched := false for _, field := range currentFields { - if question.Title == field.Name && entity == field.Entity { + fieldName := strings.ToLower(strings.ReplaceAll(field.Name, " ", "")) + if title == fieldName && entity == field.Entity { toUpdate[int(question.Id)] = ToUpdate{ FieldID: int(field.Amoid), Entity: entity, diff --git a/internal/workers/post_deals_worker/deals_worker.go b/internal/workers/post_deals_worker/deals_worker.go index 1ec2925..20f743a 100644 --- a/internal/workers/post_deals_worker/deals_worker.go +++ b/internal/workers/post_deals_worker/deals_worker.go @@ -316,15 +316,17 @@ func (wc *PostDeals) constructField(ctx context.Context, allAnswers []model.Resu if err != nil && !errors.Is(err, pj_errors.ErrNotFound) { return nil, nil, nil, nil, err } - - if errors.Is(err, pj_errors.ErrNotFound) { - contactResp, err := wc.amoClient.CreateContact(models.CreateContactReq{ - Name: resultInfo.Name, - ResponsibleUserID: result.PerformerID, - CreatedBy: 0, - UpdatedBy: 0, - CreatedAt: dateCreating, - CustomFieldsValues: contactFields, + if errors.Is(err, pj_errors.ErrNotFound) || len(existContactData) == 0 { + fmt.Println("NO CONTACT") + contactResp, err := wc.amoClient.CreateContact([]models.CreateContactReq{ + { + Name: resultInfo.Name, + ResponsibleUserID: result.PerformerID, + CreatedBy: 0, + UpdatedBy: 0, + CreatedAt: dateCreating, + CustomFieldsValues: contactFields, + }, }, result.SubDomain, result.AccessToken) if err != nil { return nil, nil, nil, nil, err @@ -409,6 +411,7 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am for _, contact := range contactVariants { if contact.Field == resultInfo.Email { if _, ok := phoneMatchedContacts[contact.AmoID]; ok { + fmt.Println("нашлось телефон и емайл в бд, с одинаковым амоид", resultInfo.Name, resultInfo.Phone, resultInfo.Email) return contact.AmoID, nil } } @@ -431,11 +434,18 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am } if phoneContactID != 0 && emailContactID != 0 && phoneContactID != emailContactID { + fmt.Println("нашлось телефон и емайл в бд, но это пока разные контакты", resultInfo.Name, resultInfo.Phone, resultInfo.Email) // делаем обновление телефона там где уже есть email var valuePhone []models.FieldsValues valuePhone = tools.AddContactFields(valuePhone, resultInfo.Phone, model.TypeContactPhone, contactRuleMap) - + name := resultInfo.Name + if name == "" { + name = fmt.Sprintf("empty name, quiz %d, triggered by answer - %d", result.QuizID, result.AnswerID) + } _, err := wc.amoClient.UpdateContact(models.CreateContactReq{ + Name: name, + UpdatedBy: 0, + ResponsibleUserID: result.PerformerID, CustomFieldsValues: valuePhone, }, result.SubDomain, result.AccessToken, emailContactID) if err != nil { @@ -447,14 +457,29 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am return 0, err } - _, err = wc.amoClient.LinkedContactToContact(models.LinkedContactReq{ - EntityID: emailContactID, - ToEntityID: phoneContactID, - ToEntityType: string(model.ContactsType), - }, result.SubDomain, result.AccessToken) - if err != nil { - return 0, err - } + // todo пока без линковки + //_, err = wc.amoClient.LinkedContactToContact([]models.LinkedContactReq{ + // { + // ToEntityID: emailContactID, + // ToEntityType: "contacts", + // //Metadata: struct { + // // //CatalogID int `json:"catalog_id"` + // // //Quantity int `json:"quantity"` + // // IsMain bool `json:"is_main"` + // // //UpdatedBy int `json:"updated_by"` + // // //PriceID int `json:"price_id"` + // //}(struct { + // // //CatalogID int + // // //Quantity int + // // IsMain bool + // // //UpdatedBy int + // // //PriceID int + // //}{IsMain: true}), + // }, + //}, result.SubDomain, result.AccessToken, phoneContactID) + //if err != nil { + // return 0, err + //} return emailContactID, nil } @@ -477,9 +502,17 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am } if !emailExists && resultInfo.Email != "" { // email пустой обновляем контакт добавляя email, если не пустой + fmt.Println("нашлось телефон, емайл не пустой, а в бд пустой. обновляем контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email) var valueEmail []models.FieldsValues valueEmail = tools.AddContactFields(valueEmail, resultInfo.Email, model.TypeContactEmail, contactRuleMap) + name := resultInfo.Name + if name == "" { + name = fmt.Sprintf("empty name, quiz %d, triggered by answer - %d", result.QuizID, result.AnswerID) + } _, err := wc.amoClient.UpdateContact(models.CreateContactReq{ + Name: name, + UpdatedBy: 0, + ResponsibleUserID: result.PerformerID, CustomFieldsValues: valueEmail, }, result.SubDomain, result.AccessToken, contact.AmoID) if err != nil { @@ -497,17 +530,20 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am } if emailExists && resultInfo.Email != "" { // email не пустой значит это новый контакт создаем если наш email тоже не пустой + fmt.Println("нашлось телефон, емайл не пустой и в бд не пустой. создаем новый контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email) name := resultInfo.Name if name == "" { name = fmt.Sprintf("empty name, quiz %d, triggered by answer - %d", result.QuizID, result.AnswerID) } - resp, err := wc.amoClient.CreateContact(models.CreateContactReq{ - Name: name, - ResponsibleUserID: result.PerformerID, - CreatedBy: 0, - UpdatedBy: 0, - CreatedAt: dateCreating, - CustomFieldsValues: contactFields, + resp, err := wc.amoClient.CreateContact([]models.CreateContactReq{ + { + Name: name, + ResponsibleUserID: result.PerformerID, + CreatedBy: 0, + UpdatedBy: 0, + CreatedAt: dateCreating, + CustomFieldsValues: contactFields, + }, }, result.SubDomain, result.AccessToken) if err != nil { return 0, err @@ -537,6 +573,7 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am return contactID, nil } // если пустой то это нужный контакт возвращаем его id, так как если мейл пустой у нас но номер совпадает а в бд не пустой значит оно нам надо + fmt.Println("нашлось телефон, емайл пустой возвращаем существующий контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email) return contact.AmoID, nil } } @@ -560,9 +597,17 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am } if !phoneExists && resultInfo.Phone != "" { // телефон пустой обновляем контакт добавляя телефон, если не пустой + fmt.Println("нашлось емайл, телефон не пустой, а в бд пустой. обновляем контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email) var valuePhone []models.FieldsValues valuePhone = tools.AddContactFields(valuePhone, resultInfo.Phone, model.TypeContactPhone, contactRuleMap) + name := resultInfo.Name + if name == "" { + name = fmt.Sprintf("empty name, quiz %d, triggered by answer - %d", result.QuizID, result.AnswerID) + } _, err := wc.amoClient.UpdateContact(models.CreateContactReq{ + Name: name, + UpdatedBy: 0, + ResponsibleUserID: result.PerformerID, CustomFieldsValues: valuePhone, }, result.SubDomain, result.AccessToken, contact.AmoID) if err != nil { @@ -580,17 +625,20 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am } if phoneExists && resultInfo.Phone != "" { // телефон не пустой значит это новый контакт создаем если наш телефон не пустой + fmt.Println("нашлось емайл, телефон не пустой и в бд не пустой. создаем новый контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email) name := resultInfo.Name if name == "" { name = fmt.Sprintf("empty name, quiz %d, triggered by answer - %d", result.QuizID, result.AnswerID) } - resp, err := wc.amoClient.CreateContact(models.CreateContactReq{ - Name: name, - ResponsibleUserID: result.PerformerID, - CreatedBy: 0, - UpdatedBy: 0, - CreatedAt: dateCreating, - CustomFieldsValues: contactFields, + resp, err := wc.amoClient.CreateContact([]models.CreateContactReq{ + { + Name: name, + ResponsibleUserID: result.PerformerID, + CreatedBy: 0, + UpdatedBy: 0, + CreatedAt: dateCreating, + CustomFieldsValues: contactFields, + }, }, result.SubDomain, result.AccessToken) if err != nil { return 0, err @@ -621,24 +669,28 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am } // если пустой то это нужный контакт возвращаем его id, так как если телефон пустой у нас но мейл совпадает а в бд не пустой значит оно нам надо + fmt.Println("нашлось емайл, телефон пустой возвращаем существующий контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email) return contact.AmoID, nil } } } } + fmt.Println("ничего не нашлось, создаем новый контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email) // если дошлю до сюда то это новый контакт с новым email and phone name := resultInfo.Name if name == "" { name = fmt.Sprintf("empty name, quiz %d, triggered by answer - %d", result.QuizID, result.AnswerID) } - resp, err := wc.amoClient.CreateContact(models.CreateContactReq{ - Name: name, - ResponsibleUserID: result.PerformerID, - CreatedBy: 0, - UpdatedBy: 0, - CreatedAt: dateCreating, - CustomFieldsValues: contactFields, + resp, err := wc.amoClient.CreateContact([]models.CreateContactReq{ + { + Name: name, + ResponsibleUserID: result.PerformerID, + CreatedBy: 0, + UpdatedBy: 0, + CreatedAt: dateCreating, + CustomFieldsValues: contactFields, + }, }, result.SubDomain, result.AccessToken) if err != nil { return 0, err diff --git a/internal/workers_methods/methods.go b/internal/workers_methods/methods.go index 57f9870..6309f04 100644 --- a/internal/workers_methods/methods.go +++ b/internal/workers_methods/methods.go @@ -679,12 +679,14 @@ func (m *Methods) CheckFieldRule(ctx context.Context, token string, msg models.K } if questionID == int(question.Id) { // тут также делаем чтобы сверить филд с вопросом - title := strings.ReplaceAll(question.Title, " ", "") + title := strings.ToLower(strings.ReplaceAll(question.Title, " ", "")) if title == "" { question.Title = fmt.Sprintf("Вопрос №%d", question.Page) } + title = strings.ToLower(strings.ReplaceAll(question.Title, " ", "")) for _, field := range newFields { - if question.Title == field.Name && field.Entity == currentEntity { + fieldName := strings.ToLower(strings.ReplaceAll(field.Name, " ", "")) + if title == fieldName && field.Entity == currentEntity { ruleMap := make(map[int]int) ruleMap[questionID] = int(field.Amoid) *fieldRule = append(*fieldRule, model.FieldRule{Questionid: ruleMap}) diff --git a/pkg/amoClient/amo.go b/pkg/amoClient/amo.go index 5e158f5..c85c31a 100644 --- a/pkg/amoClient/amo.go +++ b/pkg/amoClient/amo.go @@ -722,7 +722,7 @@ func (a *Amo) createPart(uploadData models.UploadSession, file *os.File) (*model return nil, nil } -func (a *Amo) CreateContact(req models.CreateContactReq, domain, accessToken string) (*models.ContactResponse, error) { +func (a *Amo) CreateContact(req []models.CreateContactReq, domain, accessToken string) (*models.ContactResponse, error) { for { if a.rateLimiter.Check() { uri := fmt.Sprintf("https://%s/api/v4/contacts", domain) @@ -804,10 +804,10 @@ func (a *Amo) UpdateContact(req models.CreateContactReq, domain, accessToken str } } -func (a *Amo) LinkedContactToContact(req models.LinkedContactReq, domain, accessToken string) (*models.LinkedContactResponse, error) { +func (a *Amo) LinkedContactToContact(req []models.LinkedContactReq, domain, accessToken string, id int32) (*models.LinkedContactResponse, error) { for { if a.rateLimiter.Check() { - uri := fmt.Sprintf("https://%s/api/v4/contacts/link", domain) + uri := fmt.Sprintf("https://%s/api/v4/contacts/%d/link", domain, id) bodyBytes, err := json.Marshal(req) if err != nil { a.logger.Error("error marshal req in Linked Contact To Contact:", zap.Error(err))