amocrm/internal/tools/construct.go

229 lines
7.9 KiB
Go
Raw Normal View History

2024-04-17 12:21:06 +00:00
package tools
import (
"amocrm/internal/models"
2024-05-07 15:56:02 +00:00
"encoding/json"
2024-05-06 08:48:38 +00:00
"fmt"
2024-04-17 12:21:06 +00:00
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
2024-05-06 08:48:38 +00:00
"strings"
2024-05-05 12:22:54 +00:00
"time"
2024-05-06 08:48:38 +00:00
"unicode/utf8"
2024-04-17 12:21:06 +00:00
)
func ToPipeline(amoPipelines []models.Pipeline) []model.Pipeline {
var pipelines []model.Pipeline
for _, p := range amoPipelines {
pipeline := model.Pipeline{
2024-04-18 11:13:03 +00:00
Amoid: int32(p.ID),
2024-04-17 12:21:06 +00:00
Name: p.Name,
Isarchive: p.IsArchive,
2024-04-18 11:13:03 +00:00
AccountID: int32(p.AccountID),
2024-04-17 12:21:06 +00:00
}
pipelines = append(pipelines, pipeline)
}
return pipelines
}
func ToStep(amoStatuses []models.Statuses) []model.Step {
var steps []model.Step
for _, s := range amoStatuses {
step := model.Step{
2024-04-18 11:13:03 +00:00
Amoid: int32(s.ID),
2024-04-17 12:21:06 +00:00
Name: s.Name,
2024-04-18 11:13:03 +00:00
Pipelineid: int32(s.PipelineID),
2024-04-17 12:21:06 +00:00
Color: s.Color,
2024-04-18 11:13:03 +00:00
Accountid: int32(s.AccountID),
2024-04-17 12:21:06 +00:00
}
steps = append(steps, step)
}
return steps
}
2024-04-18 11:13:03 +00:00
func ToTag(amoTag []models.Tag, entity model.EntityType) []model.Tag {
2024-04-17 12:21:06 +00:00
var tags []model.Tag
for _, t := range amoTag {
tag := model.Tag{
2024-04-18 11:13:03 +00:00
Amoid: int32(t.ID),
Entity: entity,
Name: t.Name,
Color: t.Color,
2024-04-17 12:21:06 +00:00
}
tags = append(tags, tag)
}
return tags
}
2024-04-18 11:13:03 +00:00
func ToField(amoField []models.CustomField, entity model.EntityType) []model.Field {
2024-04-17 12:21:06 +00:00
var fields []model.Field
for _, f := range amoField {
field := model.Field{
2024-04-18 11:13:03 +00:00
Amoid: int32(f.ID),
Code: f.Code,
Name: f.Name,
Entity: entity,
2024-04-28 13:12:25 +00:00
Type: model.FieldType(f.Type),
2024-04-17 12:21:06 +00:00
}
fields = append(fields, field)
}
return fields
}
2024-05-04 18:38:36 +00:00
func ConstructField(allAnswers []model.ResultAnswer, result model.AmoUsersTrueResults) ([]models.FieldsValues, []models.Contact, []models.Company, []models.Customer, error) {
dateCreating := time.Now().Unix()
2024-05-05 12:22:54 +00:00
entityFieldsMap := make(map[model.EntityType]map[int][]models.Values)
entityFieldsMap[model.LeadsType] = make(map[int][]models.Values)
entityFieldsMap[model.CompaniesType] = make(map[int][]models.Values)
entityFieldsMap[model.CustomersType] = make(map[int][]models.Values)
2024-05-04 18:38:36 +00:00
2024-05-05 12:22:54 +00:00
entityRules := make(map[model.EntityType][]model.FieldRule)
entityRules[model.LeadsType] = result.FieldsRule.Lead
entityRules[model.CompaniesType] = result.FieldsRule.Company
entityRules[model.CustomersType] = result.FieldsRule.Customer
2024-05-04 18:38:36 +00:00
2024-05-05 12:22:54 +00:00
for entityType, ruleList := range entityRules {
for _, rule := range ruleList {
2024-05-04 18:38:36 +00:00
for _, data := range allAnswers {
if fieldID, ok := rule.Questionid[int(data.QuestionID)]; ok {
2024-05-05 12:22:54 +00:00
values := entityFieldsMap[entityType][fieldID]
2024-05-06 08:48:38 +00:00
values = append(values, models.Values{Value: emojiUnicode(data.Content)})
2024-05-05 12:22:54 +00:00
entityFieldsMap[entityType][fieldID] = values
2024-05-04 18:38:36 +00:00
}
}
}
}
2024-05-05 12:22:54 +00:00
var leadFields []models.FieldsValues
var contactFields []models.FieldsValues
var companyFields []models.FieldsValues
var customerFields []models.FieldsValues
2024-05-04 18:38:36 +00:00
2024-05-05 12:22:54 +00:00
for entityType, fieldMap := range entityFieldsMap {
for fieldID, values := range fieldMap {
field := models.FieldsValues{
FieldID: fieldID,
Values: values,
}
switch entityType {
case model.LeadsType:
leadFields = append(leadFields, field)
case model.CompaniesType:
companyFields = append(companyFields, field)
case model.CustomersType:
customerFields = append(customerFields, field)
2024-05-04 18:38:36 +00:00
}
}
}
2024-05-07 15:56:02 +00:00
var resultInfo model.ResultContent
err := json.Unmarshal([]byte(result.Content), &resultInfo)
if err != nil {
return nil, nil, nil, nil, err
}
name := resultInfo.Name
if name == "" {
name = fmt.Sprintf("empty name, quiz %d, triggered by answer - %d", result.QuizID, result.AnswerID)
2024-05-07 15:56:02 +00:00
}
contactRuleMap := result.FieldsRule.Contact.ContactRuleMap
contactFields = addContactField(contactFields, resultInfo.Name, model.TypeContactName, contactRuleMap)
contactFields = addContactField(contactFields, resultInfo.Phone, model.TypeContactPhone, contactRuleMap)
contactFields = addContactField(contactFields, resultInfo.Text, model.TypeContactText, contactRuleMap)
contactFields = addContactField(contactFields, resultInfo.Email, model.TypeContactEmail, contactRuleMap)
contactFields = addContactField(contactFields, resultInfo.Address, model.TypeContactAddress, contactRuleMap)
2024-05-05 12:22:54 +00:00
return leadFields, []models.Contact{
{
Name: name,
2024-05-05 12:22:54 +00:00
ResponsibleUserID: result.PerformerID,
2024-05-05 16:06:49 +00:00
CreatedBy: 0,
UpdatedBy: 0,
CreatedAt: dateCreating,
2024-05-05 12:22:54 +00:00
CustomFieldsValues: contactFields,
},
}, []models.Company{
{
Name: fmt.Sprintf("Компания %d", result.AnswerID),
2024-05-05 12:22:54 +00:00
ResponsibleUserID: result.PerformerID,
CreatedBy: 0,
UpdatedBy: 0,
CreatedAt: dateCreating,
2024-05-05 12:22:54 +00:00
CustomFieldsValues: companyFields,
},
}, []models.Customer{
{
// в амо имя покупателя не может быть пустым, надо как то с этим жить
Name: name,
ResponsibleUserID: result.PerformerID,
//StatusID: ,
CreatedBy: 0,
UpdatedBy: 0,
CreatedAt: dateCreating,
CustomFields: customerFields,
RequestID: fmt.Sprint(result.AnswerID),
},
2024-05-07 15:56:02 +00:00
}, nil
2024-05-04 18:38:36 +00:00
}
2024-05-06 08:48:38 +00:00
func isEmoji(r rune) bool {
// https://symbl.cc/ru/unicode/blocks/emoticons/
return (r >= 0x1F600 && r <= 0x1F64F) || // эмотикоины
(r >= 0x1F650 && r <= 0x1F67F) || // орнаментные символы
(r >= 0x1F680 && r <= 0x1F6FF) || // Транспортные и картографические символы
(r >= 0x1F700 && r <= 0x1F77F) || // Алхимические символы
(r >= 0x1F780 && r <= 0x1F7FF) || // Расширенные геометрические фигуры
(r >= 0x1F800 && r <= 0x1F8FF) || // Дополнительные стрелки — С
(r >= 0x1F900 && r <= 0x1F9FF) || // Дополнительные символы и пиктограммы
(r >= 0x1FA00 && r <= 0x1FA6F) || // Шахматные символы
(r >= 0x1FA70 && r <= 0x1FAFF) || // Расширенные символы и пиктограммы — A
(r >= 0x1FB00 && r <= 0x1FBFF) || // Символы наследия вычислительной техники
(r >= 0x20000 && r <= 0x2A6DF) || // Унифицированные идеограммы ККЯ. Расширение B
(r >= 0x2A700 && r <= 0x2B73F) || // Унифицированные идеограммы ККЯ. Расширение C
(r >= 0x2B740 && r <= 0x2B81F) || // Унифицированные идеограммы ККЯ. Расширение D
(r >= 0x2B820 && r <= 0x2CEAF) || // Унифицированные идеограммы ККЯ. Расширение E
(r >= 0x2CEB0 && r <= 0x2EBEF) || // Унифицированные идеограммы ККЯ. Расширение F
(r >= 0x2EBF0 && r <= 0x2EE5F) || // CJK Unified Ideographs Extension I
(r >= 0x2F800 && r <= 0x2FA1F) || // Дополнение к совместимым идеограммам ККЯ
(r >= 0x30000 && r <= 0x3134F) || // Унифицированные идеограммы ККЯ. Расширение G
(r >= 0x31350 && r <= 0x323AF) || // Унифицированные идеограммы ККЯ. Расширение H
(r >= 0xE0000 && r <= 0xE007F) || // Теги
(r >= 0xE0100 && r <= 0xE01EF) // Дополнение к селекторам вариантов начертания
}
func emojiUnicode(text string) string {
var result strings.Builder
for len(text) > 0 {
r, size := utf8.DecodeRuneInString(text)
if size == -1 {
result.WriteString(text[:1])
text = text[1:]
} else {
if isEmoji(r) {
result.WriteString(fmt.Sprintf(`"0x%x"`, r))
} else {
result.WriteRune(r)
}
text = text[size:]
}
}
return result.String()
}
2024-05-07 15:56:02 +00:00
func addContactField(contactFields []models.FieldsValues, fieldValue string, fieldType model.ContactQuizConfig, fieldMap map[string]int) []models.FieldsValues {
if fieldValue != "" {
contactFields = append(contactFields, models.FieldsValues{
FieldID: fieldMap[string(fieldType)],
Values: []models.Values{
{
Value: fieldValue,
},
},
})
}
return contactFields
}