From 09a4271a9a33ce3dc04ce741c881e9fb5af4c20d Mon Sep 17 00:00:00 2001 From: Pavel Date: Sun, 23 Jun 2024 16:48:44 +0300 Subject: [PATCH] add logs and debug logic with contacts --- internal/models/createContact.go | 10 +-- .../workers/post_deals_worker/deals_worker.go | 64 +++++++++++++++---- pkg/amoClient/amo.go | 4 +- 3 files changed, 60 insertions(+), 18 deletions(-) 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/workers/post_deals_worker/deals_worker.go b/internal/workers/post_deals_worker/deals_worker.go index fbf8086..20f743a 100644 --- a/internal/workers/post_deals_worker/deals_worker.go +++ b/internal/workers/post_deals_worker/deals_worker.go @@ -397,8 +397,6 @@ func (wc *PostDeals) constructField(ctx context.Context, allAnswers []model.Resu } func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.AmoUsersTrueResults, resultInfo model.ResultContent, existingContacts map[int32][]model.ContactAmo, dateCreating int64, contactFields []models.FieldsValues, contactRuleMap map[string]int) (int32, error) { - fmt.Println("check contact") - // 1 ищем контакт в котором совпадает и телефон и емайл if resultInfo.Phone != "" && resultInfo.Email != "" { phoneMatchedContacts := make(map[int32]bool) @@ -413,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 } } @@ -435,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 { @@ -451,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 } @@ -481,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 { @@ -501,6 +530,7 @@ 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) @@ -543,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 } } @@ -566,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 { @@ -586,6 +625,7 @@ 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) @@ -629,12 +669,14 @@ 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 == "" { diff --git a/pkg/amoClient/amo.go b/pkg/amoClient/amo.go index 0ab320b..c85c31a 100644 --- a/pkg/amoClient/amo.go +++ b/pkg/amoClient/amo.go @@ -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))