add logs and debug logic with contacts

This commit is contained in:
Pavel 2024-06-23 16:48:44 +03:00
parent 135217fc38
commit 09a4271a9a
3 changed files with 60 additions and 18 deletions

@ -39,11 +39,11 @@ type LinkedContactReq struct {
ToEntityID int32 `json:"to_entity_id"` // ID связанной сущности ToEntityID int32 `json:"to_entity_id"` // ID связанной сущности
ToEntityType string `json:"to_entity_type"` // Тип связанной сущности (leads, contacts, companies, customers, catalog_elements) ToEntityType string `json:"to_entity_type"` // Тип связанной сущности (leads, contacts, companies, customers, catalog_elements)
Metadata struct { Metadata struct {
CatalogID int `json:"catalog_id"` // ID каталога //CatalogID int `json:"catalog_id"` // ID каталога
Quantity int `json:"quantity"` // Количество прикрепленных элементов каталогов //Quantity int `json:"quantity"` // Количество прикрепленных элементов каталогов
IsMain bool `json:"is_main"` // Является ли контакт главным IsMain bool `json:"is_main"` // Является ли контакт главным
UpdatedBy int `json:"updated_by"` // ID пользователя, от имени которого осуществляется прикрепление //UpdatedBy int `json:"updated_by"` // ID пользователя, от имени которого осуществляется прикрепление
PriceID int `json:"price_id"` // ID поля типа Цена, которое будет установлено для привязанного элемента в контексте сущности //PriceID int `json:"price_id"` // ID поля типа Цена, которое будет установлено для привязанного элемента в контексте сущности
} `json:"metadata"` } `json:"metadata"`
} }

@ -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) { 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 ищем контакт в котором совпадает и телефон и емайл // 1 ищем контакт в котором совпадает и телефон и емайл
if resultInfo.Phone != "" && resultInfo.Email != "" { if resultInfo.Phone != "" && resultInfo.Email != "" {
phoneMatchedContacts := make(map[int32]bool) phoneMatchedContacts := make(map[int32]bool)
@ -413,6 +411,7 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am
for _, contact := range contactVariants { for _, contact := range contactVariants {
if contact.Field == resultInfo.Email { if contact.Field == resultInfo.Email {
if _, ok := phoneMatchedContacts[contact.AmoID]; ok { if _, ok := phoneMatchedContacts[contact.AmoID]; ok {
fmt.Println("нашлось телефон и емайл в бд, с одинаковым амоид", resultInfo.Name, resultInfo.Phone, resultInfo.Email)
return contact.AmoID, nil 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 { if phoneContactID != 0 && emailContactID != 0 && phoneContactID != emailContactID {
fmt.Println("нашлось телефон и емайл в бд, но это пока разные контакты", resultInfo.Name, resultInfo.Phone, resultInfo.Email)
// делаем обновление телефона там где уже есть email // делаем обновление телефона там где уже есть email
var valuePhone []models.FieldsValues var valuePhone []models.FieldsValues
valuePhone = tools.AddContactFields(valuePhone, resultInfo.Phone, model.TypeContactPhone, contactRuleMap) 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{ _, err := wc.amoClient.UpdateContact(models.CreateContactReq{
Name: name,
UpdatedBy: 0,
ResponsibleUserID: result.PerformerID,
CustomFieldsValues: valuePhone, CustomFieldsValues: valuePhone,
}, result.SubDomain, result.AccessToken, emailContactID) }, result.SubDomain, result.AccessToken, emailContactID)
if err != nil { if err != nil {
@ -451,14 +457,29 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am
return 0, err return 0, err
} }
_, err = wc.amoClient.LinkedContactToContact(models.LinkedContactReq{ // todo пока без линковки
EntityID: emailContactID, //_, err = wc.amoClient.LinkedContactToContact([]models.LinkedContactReq{
ToEntityID: phoneContactID, // {
ToEntityType: string(model.ContactsType), // ToEntityID: emailContactID,
}, result.SubDomain, result.AccessToken) // ToEntityType: "contacts",
if err != nil { // //Metadata: struct {
return 0, err // // //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 return emailContactID, nil
} }
@ -481,9 +502,17 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am
} }
if !emailExists && resultInfo.Email != "" { if !emailExists && resultInfo.Email != "" {
// email пустой обновляем контакт добавляя email, если не пустой // email пустой обновляем контакт добавляя email, если не пустой
fmt.Println("нашлось телефон, емайл не пустой, а в бд пустой. обновляем контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email)
var valueEmail []models.FieldsValues var valueEmail []models.FieldsValues
valueEmail = tools.AddContactFields(valueEmail, resultInfo.Email, model.TypeContactEmail, contactRuleMap) 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{ _, err := wc.amoClient.UpdateContact(models.CreateContactReq{
Name: name,
UpdatedBy: 0,
ResponsibleUserID: result.PerformerID,
CustomFieldsValues: valueEmail, CustomFieldsValues: valueEmail,
}, result.SubDomain, result.AccessToken, contact.AmoID) }, result.SubDomain, result.AccessToken, contact.AmoID)
if err != nil { if err != nil {
@ -501,6 +530,7 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am
} }
if emailExists && resultInfo.Email != "" { if emailExists && resultInfo.Email != "" {
// email не пустой значит это новый контакт создаем если наш email тоже не пустой // email не пустой значит это новый контакт создаем если наш email тоже не пустой
fmt.Println("нашлось телефон, емайл не пустой и в бд не пустой. создаем новый контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email)
name := resultInfo.Name name := resultInfo.Name
if name == "" { if name == "" {
name = fmt.Sprintf("empty name, quiz %d, triggered by answer - %d", result.QuizID, result.AnswerID) 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 return contactID, nil
} }
// если пустой то это нужный контакт возвращаем его id, так как если мейл пустой у нас но номер совпадает а в бд не пустой значит оно нам надо // если пустой то это нужный контакт возвращаем его id, так как если мейл пустой у нас но номер совпадает а в бд не пустой значит оно нам надо
fmt.Println("нашлось телефон, емайл пустой возвращаем существующий контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email)
return contact.AmoID, nil return contact.AmoID, nil
} }
} }
@ -566,9 +597,17 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am
} }
if !phoneExists && resultInfo.Phone != "" { if !phoneExists && resultInfo.Phone != "" {
// телефон пустой обновляем контакт добавляя телефон, если не пустой // телефон пустой обновляем контакт добавляя телефон, если не пустой
fmt.Println("нашлось емайл, телефон не пустой, а в бд пустой. обновляем контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email)
var valuePhone []models.FieldsValues var valuePhone []models.FieldsValues
valuePhone = tools.AddContactFields(valuePhone, resultInfo.Phone, model.TypeContactPhone, contactRuleMap) 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{ _, err := wc.amoClient.UpdateContact(models.CreateContactReq{
Name: name,
UpdatedBy: 0,
ResponsibleUserID: result.PerformerID,
CustomFieldsValues: valuePhone, CustomFieldsValues: valuePhone,
}, result.SubDomain, result.AccessToken, contact.AmoID) }, result.SubDomain, result.AccessToken, contact.AmoID)
if err != nil { if err != nil {
@ -586,6 +625,7 @@ func (wc *PostDeals) chooseAndCreateContact(ctx context.Context, result model.Am
} }
if phoneExists && resultInfo.Phone != "" { if phoneExists && resultInfo.Phone != "" {
// телефон не пустой значит это новый контакт создаем если наш телефон не пустой // телефон не пустой значит это новый контакт создаем если наш телефон не пустой
fmt.Println("нашлось емайл, телефон не пустой и в бд не пустой. создаем новый контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email)
name := resultInfo.Name name := resultInfo.Name
if name == "" { if name == "" {
name = fmt.Sprintf("empty name, quiz %d, triggered by answer - %d", result.QuizID, result.AnswerID) 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, так как если телефон пустой у нас но мейл совпадает а в бд не пустой значит оно нам надо // если пустой то это нужный контакт возвращаем его id, так как если телефон пустой у нас но мейл совпадает а в бд не пустой значит оно нам надо
fmt.Println("нашлось емайл, телефон пустой возвращаем существующий контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email)
return contact.AmoID, nil return contact.AmoID, nil
} }
} }
} }
} }
fmt.Println("ничего не нашлось, создаем новый контакт", resultInfo.Name, resultInfo.Phone, resultInfo.Email)
// если дошлю до сюда то это новый контакт с новым email and phone // если дошлю до сюда то это новый контакт с новым email and phone
name := resultInfo.Name name := resultInfo.Name
if name == "" { if name == "" {

@ -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 { for {
if a.rateLimiter.Check() { 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) bodyBytes, err := json.Marshal(req)
if err != nil { if err != nil {
a.logger.Error("error marshal req in Linked Contact To Contact:", zap.Error(err)) a.logger.Error("error marshal req in Linked Contact To Contact:", zap.Error(err))