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 связанной сущности
ToEntityType string `json:"to_entity_type"` // Тип связанной сущности (leads, contacts, companies, customers, catalog_elements)
Metadata struct {
CatalogID int `json:"catalog_id"` // ID каталога
Quantity int `json:"quantity"` // Количество прикрепленных элементов каталогов
//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 поля типа Цена, которое будет установлено для привязанного элемента в контексте сущности
//UpdatedBy int `json:"updated_by"` // ID пользователя, от имени которого осуществляется прикрепление
//PriceID int `json:"price_id"` // ID поля типа Цена, которое будет установлено для привязанного элемента в контексте сущности
} `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) {
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 == "" {

@ -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))