186 lines
6.5 KiB
Go
186 lines
6.5 KiB
Go
package tools
|
||
|
||
import (
|
||
"amocrm/internal/models"
|
||
"fmt"
|
||
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
|
||
"strings"
|
||
"time"
|
||
"unicode/utf8"
|
||
)
|
||
|
||
func ToPipeline(amoPipelines []models.Pipeline) []model.Pipeline {
|
||
var pipelines []model.Pipeline
|
||
for _, p := range amoPipelines {
|
||
pipeline := model.Pipeline{
|
||
Amoid: int32(p.ID),
|
||
Name: p.Name,
|
||
Isarchive: p.IsArchive,
|
||
AccountID: int32(p.AccountID),
|
||
}
|
||
pipelines = append(pipelines, pipeline)
|
||
}
|
||
return pipelines
|
||
}
|
||
|
||
func ToStep(amoStatuses []models.Statuses) []model.Step {
|
||
var steps []model.Step
|
||
for _, s := range amoStatuses {
|
||
step := model.Step{
|
||
Amoid: int32(s.ID),
|
||
Name: s.Name,
|
||
Pipelineid: int32(s.PipelineID),
|
||
Color: s.Color,
|
||
Accountid: int32(s.AccountID),
|
||
}
|
||
steps = append(steps, step)
|
||
}
|
||
return steps
|
||
}
|
||
|
||
func ToTag(amoTag []models.Tag, entity model.EntityType) []model.Tag {
|
||
var tags []model.Tag
|
||
for _, t := range amoTag {
|
||
tag := model.Tag{
|
||
Amoid: int32(t.ID),
|
||
Entity: entity,
|
||
Name: t.Name,
|
||
Color: t.Color,
|
||
}
|
||
tags = append(tags, tag)
|
||
}
|
||
return tags
|
||
}
|
||
|
||
func ToField(amoField []models.CustomField, entity model.EntityType) []model.Field {
|
||
var fields []model.Field
|
||
for _, f := range amoField {
|
||
field := model.Field{
|
||
Amoid: int32(f.ID),
|
||
Code: f.Code,
|
||
Name: f.Name,
|
||
Entity: entity,
|
||
Type: model.FieldType(f.Type),
|
||
}
|
||
fields = append(fields, field)
|
||
}
|
||
|
||
return fields
|
||
}
|
||
|
||
// todo Для добавляемых сущностей (сделка, контакт, компания), можно передать не более 40 значений дополнительных полей.
|
||
func ConstructField(allAnswers []model.ResultAnswer, result model.AmoUsersTrueResults) ([]models.FieldsValues, []models.Contact, []models.Company) {
|
||
entityFieldsMap := make(map[model.EntityType]map[int][]models.Values)
|
||
entityFieldsMap[model.LeadsType] = make(map[int][]models.Values)
|
||
entityFieldsMap[model.ContactsType] = make(map[int][]models.Values)
|
||
entityFieldsMap[model.CompaniesType] = make(map[int][]models.Values)
|
||
entityFieldsMap[model.CustomersType] = make(map[int][]models.Values)
|
||
|
||
entityRules := make(map[model.EntityType][]model.FieldRule)
|
||
entityRules[model.LeadsType] = result.FieldsRule.Lead
|
||
entityRules[model.ContactsType] = result.FieldsRule.Contact
|
||
entityRules[model.CompaniesType] = result.FieldsRule.Company
|
||
entityRules[model.CustomersType] = result.FieldsRule.Customer
|
||
|
||
for entityType, ruleList := range entityRules {
|
||
for _, rule := range ruleList {
|
||
for _, data := range allAnswers {
|
||
if fieldID, ok := rule.Questionid[int(data.QuestionID)]; ok {
|
||
values := entityFieldsMap[entityType][fieldID]
|
||
values = append(values, models.Values{Value: emojiUnicode(data.Content)})
|
||
entityFieldsMap[entityType][fieldID] = values
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
var leadFields []models.FieldsValues
|
||
var contactFields []models.FieldsValues
|
||
var companyFields []models.FieldsValues
|
||
var customerFields []models.FieldsValues
|
||
|
||
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.ContactsType:
|
||
contactFields = append(contactFields, field)
|
||
case model.CompaniesType:
|
||
companyFields = append(companyFields, field)
|
||
case model.CustomersType:
|
||
customerFields = append(customerFields, field)
|
||
}
|
||
}
|
||
}
|
||
|
||
return leadFields, []models.Contact{
|
||
{
|
||
Name: result.PerformerName,
|
||
ResponsibleUserID: result.PerformerID,
|
||
CreatedBy: 0,
|
||
UpdatedBy: 0,
|
||
CreatedAt: time.Now().Unix(),
|
||
CustomFieldsValues: contactFields,
|
||
},
|
||
}, []models.Company{
|
||
{
|
||
Name: "OOO PENA CO",
|
||
ResponsibleUserID: result.PerformerID,
|
||
CreatedBy: 0,
|
||
UpdatedBy: 0,
|
||
CreatedAt: time.Now().Unix(),
|
||
CustomFieldsValues: companyFields,
|
||
},
|
||
}
|
||
}
|
||
|
||
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()
|
||
}
|