Merge branch 'fix' into 'staging'

Fix

See merge request backend/quiz/amocrm!17
This commit is contained in:
Mikhail 2024-06-23 21:45:10 +00:00
commit adcf172bad
7 changed files with 124 additions and 64 deletions

4
go.mod

@ -12,12 +12,14 @@ require (
github.com/twmb/franz-go v1.16.1 github.com/twmb/franz-go v1.16.1
go.uber.org/zap v1.27.0 go.uber.org/zap v1.27.0
google.golang.org/protobuf v1.33.0 google.golang.org/protobuf v1.33.0
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621172746-5cbeb2b88f0a penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621165314-e374d50e42e6
) )
require ( require (
github.com/ClickHouse/clickhouse-go v1.5.4 // indirect
github.com/andybalholm/brotli v1.0.5 // indirect github.com/andybalholm/brotli v1.0.5 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/dustin/go-humanize v1.0.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect

26
go.sum

@ -1,9 +1,15 @@
github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0=
github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk=
github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
github.com/caarlos0/env/v8 v8.0.0 h1:POhxHhSpuxrLMIdvTGARuZqR4Jjm8AYmoi/JKlcScs0= github.com/caarlos0/env/v8 v8.0.0 h1:POhxHhSpuxrLMIdvTGARuZqR4Jjm8AYmoi/JKlcScs0=
github.com/caarlos0/env/v8 v8.0.0/go.mod h1:7K4wMY9bH0esiXSSHlfHLX5xKGQMnkH5Fk4TDSSSzfo= github.com/caarlos0/env/v8 v8.0.0/go.mod h1:7K4wMY9bH0esiXSSHlfHLX5xKGQMnkH5Fk4TDSSSzfo=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -15,6 +21,7 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM= github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM=
github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw=
@ -28,6 +35,7 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
@ -43,6 +51,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
@ -52,6 +61,7 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
github.com/minio/minio-go/v7 v7.0.69 h1:l8AnsQFyY1xiwa/DaQskY4NXSLA2yrGsW5iD9nRPVS0= github.com/minio/minio-go/v7 v7.0.69 h1:l8AnsQFyY1xiwa/DaQskY4NXSLA2yrGsW5iD9nRPVS0=
@ -69,6 +79,8 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pierrec/lz4/v4 v4.1.19 h1:tYLzDnjDXh9qIxSTKHwXwOYmm9d887Y7Y1ZkyXYHAN4= github.com/pierrec/lz4/v4 v4.1.19 h1:tYLzDnjDXh9qIxSTKHwXwOYmm9d887Y7Y1ZkyXYHAN4=
github.com/pierrec/lz4/v4 v4.1.19/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.19/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@ -130,15 +142,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6 h1:oV+/HNX+JPoQ3/GUx08hio7d45WpY0AMGrFs7j70QlA= penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6 h1:oV+/HNX+JPoQ3/GUx08hio7d45WpY0AMGrFs7j70QlA=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6/go.mod h1:lTmpjry+8evVkXWbEC+WMOELcFkRD1lFMc7J09mOndM= penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6/go.mod h1:lTmpjry+8evVkXWbEC+WMOELcFkRD1lFMc7J09mOndM=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240612153845-6a7e3f9ea52f h1:7pzOupQPADYOi7nH5lLZBzoAntV3rP8J4tlHg/eXkJA= penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621165314-e374d50e42e6 h1:Ts1PGn2drIA3WJoSdlGvtMqsWBSQ02Pp/q4NxqIq/0c=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240612153845-6a7e3f9ea52f/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398= penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621165314-e374d50e42e6/go.mod h1:nfZkoj8MCYaoP+xiPeUn5D0lIzinUr1qDkNfX0ng9rk=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240619123238-dd521165c55a h1:u4soF4G76TAIN+/GLHdi+0Hc1qgN3W1s8g4hDvzqwyI=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240619123238-dd521165c55a/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240619180437-6d449201156e h1:ymGwJmQls96uNdY1301zLwJtC8YqSinZN0Rs+UGvYgA=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240619180437-6d449201156e/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621103513-9616b086fa4a h1:RPuYgZri2A15IF/kOshgstLdf6L0tV9m4FhFQUfzW/A=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621103513-9616b086fa4a/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621150128-4b70022ad675 h1:w9I3PSvR3XsxL48fgyi65zLhbnpJXUknKz3ZqkCltzI=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621150128-4b70022ad675/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621172746-5cbeb2b88f0a h1:all9W8RrLcr+47k6dAQgdyjVGuXbO3H29AkMGMTcJ28=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240621172746-5cbeb2b88f0a/go.mod h1:n66zm88Dh12+idyfqh0vU5nd9BZYxM6Pv0XYnmy0398=

@ -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"`
} }

@ -57,13 +57,15 @@ func ToCreatedUpdateQuestionRules(questionsTypeMap map[model.EntityType][]model.
for entity, questions := range questionsTypeMap { for entity, questions := range questionsTypeMap {
for _, question := range questions { for _, question := range questions {
// если заголоввок пустой у вопроса делаем ему заголовок чтоб в амо легли филды нормально // если заголоввок пустой у вопроса делаем ему заголовок чтоб в амо легли филды нормально
title := strings.ReplaceAll(question.Title, " ", "") title := strings.ToLower(strings.ReplaceAll(question.Title, " ", ""))
if title == "" { if title == "" {
question.Title = fmt.Sprintf("Вопрос №%d", question.Page) question.Title = fmt.Sprintf("Вопрос №%d", question.Page)
} }
title = strings.ToLower(strings.ReplaceAll(question.Title, " ", ""))
matched := false matched := false
for _, field := range currentFields { for _, field := range currentFields {
if question.Title == field.Name && entity == field.Entity { fieldName := strings.ToLower(strings.ReplaceAll(field.Name, " ", ""))
if title == fieldName && entity == field.Entity {
toUpdate[int(question.Id)] = ToUpdate{ toUpdate[int(question.Id)] = ToUpdate{
FieldID: int(field.Amoid), FieldID: int(field.Amoid),
Entity: entity, Entity: entity,

@ -316,15 +316,17 @@ func (wc *PostDeals) constructField(ctx context.Context, allAnswers []model.Resu
if err != nil && !errors.Is(err, pj_errors.ErrNotFound) { if err != nil && !errors.Is(err, pj_errors.ErrNotFound) {
return nil, nil, nil, nil, err return nil, nil, nil, nil, err
} }
if errors.Is(err, pj_errors.ErrNotFound) || len(existContactData) == 0 {
if errors.Is(err, pj_errors.ErrNotFound) { fmt.Println("NO CONTACT")
contactResp, err := wc.amoClient.CreateContact(models.CreateContactReq{ contactResp, err := wc.amoClient.CreateContact([]models.CreateContactReq{
Name: resultInfo.Name, {
ResponsibleUserID: result.PerformerID, Name: resultInfo.Name,
CreatedBy: 0, ResponsibleUserID: result.PerformerID,
UpdatedBy: 0, CreatedBy: 0,
CreatedAt: dateCreating, UpdatedBy: 0,
CustomFieldsValues: contactFields, CreatedAt: dateCreating,
CustomFieldsValues: contactFields,
},
}, result.SubDomain, result.AccessToken) }, result.SubDomain, result.AccessToken)
if err != nil { if err != nil {
return nil, nil, nil, nil, err return nil, nil, nil, nil, err
@ -409,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
} }
} }
@ -431,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 {
@ -447,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
} }
@ -477,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 {
@ -497,17 +530,20 @@ 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)
} }
resp, err := wc.amoClient.CreateContact(models.CreateContactReq{ resp, err := wc.amoClient.CreateContact([]models.CreateContactReq{
Name: name, {
ResponsibleUserID: result.PerformerID, Name: name,
CreatedBy: 0, ResponsibleUserID: result.PerformerID,
UpdatedBy: 0, CreatedBy: 0,
CreatedAt: dateCreating, UpdatedBy: 0,
CustomFieldsValues: contactFields, CreatedAt: dateCreating,
CustomFieldsValues: contactFields,
},
}, result.SubDomain, result.AccessToken) }, result.SubDomain, result.AccessToken)
if err != nil { if err != nil {
return 0, err return 0, err
@ -537,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
} }
} }
@ -560,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 {
@ -580,17 +625,20 @@ 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)
} }
resp, err := wc.amoClient.CreateContact(models.CreateContactReq{ resp, err := wc.amoClient.CreateContact([]models.CreateContactReq{
Name: name, {
ResponsibleUserID: result.PerformerID, Name: name,
CreatedBy: 0, ResponsibleUserID: result.PerformerID,
UpdatedBy: 0, CreatedBy: 0,
CreatedAt: dateCreating, UpdatedBy: 0,
CustomFieldsValues: contactFields, CreatedAt: dateCreating,
CustomFieldsValues: contactFields,
},
}, result.SubDomain, result.AccessToken) }, result.SubDomain, result.AccessToken)
if err != nil { if err != nil {
return 0, err return 0, err
@ -621,24 +669,28 @@ 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 == "" {
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)
} }
resp, err := wc.amoClient.CreateContact(models.CreateContactReq{ resp, err := wc.amoClient.CreateContact([]models.CreateContactReq{
Name: name, {
ResponsibleUserID: result.PerformerID, Name: name,
CreatedBy: 0, ResponsibleUserID: result.PerformerID,
UpdatedBy: 0, CreatedBy: 0,
CreatedAt: dateCreating, UpdatedBy: 0,
CustomFieldsValues: contactFields, CreatedAt: dateCreating,
CustomFieldsValues: contactFields,
},
}, result.SubDomain, result.AccessToken) }, result.SubDomain, result.AccessToken)
if err != nil { if err != nil {
return 0, err return 0, err

@ -679,12 +679,14 @@ func (m *Methods) CheckFieldRule(ctx context.Context, token string, msg models.K
} }
if questionID == int(question.Id) { if questionID == int(question.Id) {
// тут также делаем чтобы сверить филд с вопросом // тут также делаем чтобы сверить филд с вопросом
title := strings.ReplaceAll(question.Title, " ", "") title := strings.ToLower(strings.ReplaceAll(question.Title, " ", ""))
if title == "" { if title == "" {
question.Title = fmt.Sprintf("Вопрос №%d", question.Page) question.Title = fmt.Sprintf("Вопрос №%d", question.Page)
} }
title = strings.ToLower(strings.ReplaceAll(question.Title, " ", ""))
for _, field := range newFields { for _, field := range newFields {
if question.Title == field.Name && field.Entity == currentEntity { fieldName := strings.ToLower(strings.ReplaceAll(field.Name, " ", ""))
if title == fieldName && field.Entity == currentEntity {
ruleMap := make(map[int]int) ruleMap := make(map[int]int)
ruleMap[questionID] = int(field.Amoid) ruleMap[questionID] = int(field.Amoid)
*fieldRule = append(*fieldRule, model.FieldRule{Questionid: ruleMap}) *fieldRule = append(*fieldRule, model.FieldRule{Questionid: ruleMap})

@ -722,7 +722,7 @@ func (a *Amo) createPart(uploadData models.UploadSession, file *os.File) (*model
return nil, nil return nil, nil
} }
func (a *Amo) CreateContact(req models.CreateContactReq, domain, accessToken string) (*models.ContactResponse, error) { func (a *Amo) CreateContact(req []models.CreateContactReq, domain, accessToken string) (*models.ContactResponse, error) {
for { for {
if a.rateLimiter.Check() { if a.rateLimiter.Check() {
uri := fmt.Sprintf("https://%s/api/v4/contacts", domain) uri := fmt.Sprintf("https://%s/api/v4/contacts", domain)
@ -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))