diff --git a/dal/dal.go b/dal/dal.go index f68de2e..6ed2fde 100644 --- a/dal/dal.go +++ b/dal/dal.go @@ -6,20 +6,21 @@ import ( _ "embed" "errors" "fmt" - _ "github.com/ClickHouse/clickhouse-go" - _ "github.com/lib/pq" - "github.com/minio/minio-go/v7" "gitea.pena/SQuiz/common/dal/sqlcgen" "gitea.pena/SQuiz/common/repository/account" "gitea.pena/SQuiz/common/repository/amo" "gitea.pena/SQuiz/common/repository/answer" - "gitea.pena/SQuiz/common/repository/question" "gitea.pena/SQuiz/common/repository/bitrix" + "gitea.pena/SQuiz/common/repository/question" "gitea.pena/SQuiz/common/repository/quiz" "gitea.pena/SQuiz/common/repository/result" "gitea.pena/SQuiz/common/repository/statistics" "gitea.pena/SQuiz/common/repository/tg" "gitea.pena/SQuiz/common/repository/workers" + "gitea.pena/SQuiz/common/repository/yclients" + _ "github.com/ClickHouse/clickhouse-go" + _ "github.com/lib/pq" + "github.com/minio/minio-go/v7" "time" ) @@ -300,3 +301,72 @@ func NewClickHouseDAL(ctx context.Context, cred string) (*ClickHouseDAL, error) func (d *ClickHouseDAL) Close(ctx context.Context) error { return d.conn.Close() } + +type YclientsDal struct { + conn *sql.DB + queries *sqlcgen.Queries + YclientsRepo *yclients.YclientsRepository + QuizRepo *quiz.QuizRepository + QuestionRepo *question.QuestionRepository + AccountRepo *account.AccountRepository + AnswerRepo *answer.AnswerRepository +} + +func NewYclientsDal(ctx context.Context, cred string) (*YclientsDal, error) { + pool, err := sql.Open("postgres", cred) + if err != nil { + return nil, err + } + + timeoutCtx, cancel := context.WithTimeout(ctx, time.Second) + defer cancel() + + if err := pool.PingContext(timeoutCtx); err != nil { + return nil, err + } + + queries := sqlcgen.New(pool) + + yclientsRepo := yclients.NewYclientsRepository(yclients.Deps{ + Queries: queries, + Pool: pool, + }) + + quizRepo := quiz.NewQuizRepository(quiz.Deps{ + Queries: queries, + Pool: pool, + }) + + questionRepo := question.NewQuestionRepository(question.Deps{ + Queries: queries, + Pool: pool, + }) + + accountRepo := account.NewAccountRepository(account.Deps{ + Queries: queries, + Pool: pool, + }) + + answerRepo := answer.NewAnswerRepository(answer.Deps{ + Queries: queries, + Pool: pool, + }) + + return &YclientsDal{ + conn: pool, + queries: queries, + YclientsRepo: yclientsRepo, + QuizRepo: quizRepo, + QuestionRepo: questionRepo, + AccountRepo: accountRepo, + AnswerRepo: answerRepo, + }, nil +} + +func (d *YclientsDal) Close(ctx context.Context) error { + err := d.conn.Close() + if err != nil { + return err + } + return nil +} diff --git a/dal/db_query/queries.sql b/dal/db_query/queries.sql index 6379f1a..a8ad4bb 100644 --- a/dal/db_query/queries.sql +++ b/dal/db_query/queries.sql @@ -1493,4 +1493,184 @@ WHERE quiz_id = $1 AND privilege_id = $2; -- name: ResetQuizPrivilegeUsageCount :exec UPDATE quiz_privilege_usage SET used_count = 0, updated_at = CURRENT_TIMESTAMP -WHERE quiz_id = $1 AND privilege_id = $2; \ No newline at end of file +WHERE quiz_id = $1 AND privilege_id = $2; + +-- Yclients + +-- name: GetCurrentYclientsCompany :one +SELECT * FROM YclientsAccounts WHERE AccountID = $1 AND Deleted = false; + +-- name: GetUsersYclientsWithPagination :many +WITH user_data AS ( + SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1 AND YclientsAccounts.Deleted = false +) +SELECT u.*, COUNT(*) OVER() as total_count +FROM YclientsAccountUsers u + JOIN user_data a ON u.SalonID = a.SalonID +WHERE u.Deleted = false +ORDER BY u.ID OFFSET ($2 - 1) * $3 LIMIT $3; + +-- name: GetAllYclientsAccounts :many +SELECT * from YclientsAccounts where Deleted = false; + +-- -- name: GetCompanyYclientsWithPagination :many +-- WITH user_data AS ( +-- SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1 AND YclientsAccounts.Deleted = false +-- ) +-- SELECT u.*, COUNT(*) OVER() as total_count +-- FROM YclientsCompany u +-- JOIN user_data a ON u.SalonID = a.SalonID +-- WHERE u.Deleted = false +-- ORDER BY u.ID OFFSET ($2 - 1) * $3 LIMIT $3; + +-- name: GetServicesYclientsWithPagination :many +WITH user_data AS ( + SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1 AND YclientsAccounts.Deleted = false +) +SELECT u.*, COUNT(*) OVER() as total_count +FROM YclientsServices u + JOIN user_data a ON u.SalonID = a.SalonID +WHERE u.Deleted = false +ORDER BY u.ID OFFSET ($2 - 1) * $3 LIMIT $3; + +-- name: GetTimeslotsYclientsWithPagination :many +WITH user_data AS ( + SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1 AND YclientsAccounts.Deleted = false +) +SELECT u.*, COUNT(*) OVER() as total_count +FROM YclientsTimeSlots u + JOIN user_data a ON u.SalonID = a.SalonID +WHERE u.Deleted = false +ORDER BY u.ID OFFSET ($2 - 1) * $3 LIMIT $3; + +-- name: CreateYclientsAccount :one +insert into YclientsAccounts (AccountID,SalonID,Title) values ($1,$2,$3) RETURNING *; + +-- name: GetUsersByIDYclients :many +SELECT * FROM YclientsAccountUsers WHERE SalonID = $1 AND Deleted = false; + +-- name: UpdateYclientsAccountUser :exec +UPDATE YclientsAccountUsers SET Name = $3, Specialization = $4, IDPosition = $5, TitlePosition= $6, Fired = $7,Status = $8,Hidden=$9 +WHERE SalonID = $1 AND YclientsID = $2 AND deleted = false; + +-- name: AddYclientsAccountUser :exec +INSERT INTO YclientsAccountUsers (SalonID, YclientsID, Name, Specialization, IDPosition, TitlePosition,Fired,Status,Hidden,YclientsUserID) +VALUES ($1, $2, $3, $4, $5, $6,$7,$8,$9,$10); + +-- name: DeleteYclientsUsers :exec +UPDATE YclientsAccountUsers SET Deleted = true WHERE ID = ANY($1::bigint[]); + +-- name: GetServicesByIDYclients :many +SELECT * FROM YclientsServices WHERE SalonID = $1 AND Deleted = false; + +-- name: UpdateYclientsAccountServices :exec +UPDATE YclientsServices SET SalonServiceID = $3,Title = $4, CategoryID = $5, PriceMin = $6, PriceMax= $7, Discount = $8,Comment = $9,Active=$10,ApiID=$11,Staff=$12 +WHERE SalonID = $1 AND ServiceID = $2 AND deleted = false; + +-- name: AddYclientsAccountService :exec +INSERT INTO YclientsServices (SalonID, ServiceID, SalonServiceID, Title, CategoryID, PriceMin,PriceMax,Discount,Comment,Active,ApiID,Staff) +VALUES ($1, $2, $3, $4, $5, $6,$7,$8,$9,$10,$11,$12); + +-- name: DeleteYclientsServices :exec +UPDATE YclientsServices SET Deleted = true WHERE ID = ANY($1::bigint[]); + +-- name: UpdateYclientsAccountTimeslots :exec +UPDATE YclientsTimeSlots SET IsEnabled = $2,WeekdaysSettings = $3, DatesSettings = $4 +WHERE SalonID = $1 AND deleted = false; + +-- name: AddYclientsAccountTimeslots :one +INSERT INTO YclientsTimeSlots (SalonID, IsEnabled, WeekdaysSettings, DatesSettings) +VALUES ($1, $2, $3, $4) RETURNING *; + +-- name: DeleteYclientsTimeslots :exec +UPDATE YclientsTimeSlots SET Deleted = true WHERE NOT (ID = ANY($1::bigint[])); + +-- name: GetTimeslotsByIDYclients :one +SELECT * FROM YclientsTimeSlots WHERE SalonID = $1 AND Deleted = false; + +-- name: SoftDeleteYclientsAccount :exec +WITH account_data AS ( +UPDATE YclientsAccounts SET Deleted = true WHERE YclientsAccounts.AccountID = $1 +), +account_users AS ( + UPDATE YclientsAccountUsers SET Deleted = true WHERE SalonID IN (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1) +), +account_services AS ( + UPDATE YclientsServices SET Deleted = true WHERE SalonID IN (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1) +), +account_timeslots AS ( + UPDATE YclientsTimeSlots SET Deleted = true WHERE SalonID IN (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1) +), +account_rules AS ( + UPDATE YclientsRules SET Deleted = true WHERE SalonID IN (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1) +), +account_fields AS ( + UPDATE YclientsFields SET Deleted = true WHERE SalonID IN (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1) +) +SELECT 1; + +-- name: GetYclientsQuizRule :one +SELECT * FROM YclientsRules WHERE QuizID = $1 AND Deleted = false; + +-- name: SetYclientsQuizSettings :one +INSERT INTO YclientsRules (SalonID, QuizID, Services,FieldsRule, CustomColor,StaffID) +SELECT ya.SalonID, $1 AS QuizID, $2 AS Services, $3 AS FieldsRule, $4 AS CustomColor,$6 AS StaffID +FROM YclientsAccounts ya WHERE ya.AccountID = $5 AND ya.Deleted = false +RETURNING id; + +-- name: ChangeYclientsQuizSettings :one +UPDATE YclientsRules SET Services = $1, CustomColor = $2,FieldsRule = $3,StaffID=$6 +WHERE SalonID = (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $4 AND YclientsAccounts.Deleted = false) +AND QuizID = $5 AND Deleted = false RETURNING id; + +-- name: GetYclientsFieldsWithPagination :many +WITH user_data AS ( + SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1 AND YclientsAccounts.Deleted = false +) +SELECT f.*, COUNT(*) OVER() as total_count +FROM YclientsFields f JOIN user_data u ON f.SalonID = u.SalonID +WHERE f.Deleted = false +ORDER BY f.ID OFFSET ($2 - 1) * $3 LIMIT $3; + +-- name: UpdateYclientsAccountFields :exec +UPDATE YclientsFields +SET FieldType = $3,Code = $4,Title = $5,ShowInUI = $6, UserCanEdit = $7 +WHERE SalonID = $1 AND YclientsID = $2 AND Deleted = false; + +-- name: GetUserYclientsFieldsByID :many +SELECT * FROM YclientsFields WHERE SalonID = $1 AND Deleted = false; + +-- name: DeleteYclientsFields :exec +UPDATE YclientsFields SET Deleted = true WHERE ID = ANY($1::bigint[]); + +-- name: AddYclientsAccountField :exec +INSERT INTO YclientsFields (YclientsID, SalonID, FieldType, Code, Title, ShowInUI, UserCanEdit) +VALUES ($1, $2, $3, $4, $5, $6, $7); + +-- name: UpdateYclientsFieldRules :exec +UPDATE YclientsRules SET FieldsRule = $1 +WHERE SalonID = $2 AND QuizID = $3 AND Deleted = false; + +-- name: GettingYclientsUsersTrueResults :many +SELECT + a.quiz_id, a.id AS answer_id, a.result, + a.question_id, a.content, a.session, + COALESCE((SELECT a2.utm FROM answer a2 WHERE a2.start = true AND a2.session = a.session LIMIT 1), '{}'::jsonb) AS utm, + r.salonid, r.fieldsrule, r.staffid, r.services, + r.customcolor, u.accountid AS quiz_accountid, + a.created_at as datetime -- добавляем время result ответа +FROM answer a + INNER JOIN quiz q ON a.quiz_id = q.id + LEFT JOIN yclientscrmstatuses s ON a.id = s.AnswerID + INNER JOIN yclientsrules r ON q.id = r.QuizID + INNER JOIN yclientsaccounts u ON q.accountid = u.accountid AND r.salonid = u.salonid +WHERE a.result = true AND s.id IS NULL AND a.deleted = false + AND r.deleted = false AND q.deleted = false + AND u.deleted = false; + +-- name: GetQuestionListByQuizID :many +SELECT * from question where quiz_id=$1 and deleted = false; + +-- name: SaveDealYclientsStatus :exec +INSERT INTO YclientsCRMStatuses (SalonID, RecordID, AnswerID, Status) +values ($4, $1, $2, $3); diff --git a/dal/schema/000029_init.down.sql b/dal/schema/000029_init.down.sql new file mode 100644 index 0000000..758fa33 --- /dev/null +++ b/dal/schema/000029_init.down.sql @@ -0,0 +1,12 @@ +DROP TABLE If EXISTS YclientsTokens; +DROP TABLE If EXISTS YclientsAccounts; +DROP TABLE If EXISTS YclientsAccountUsers; +-- DROP TABLE If EXISTS YclientsCompany; +DROP TABLE If EXISTS YclientsServices; +DROP TABLE If EXISTS YclientsTimeSlots; +DROP TABLE If EXISTS YclientsRules; +DROP TABLE If EXISTS YclientsFields; +DROP TABLE If EXISTS YclientsCRMStatuses; + +DROP INDEX if EXISTS idx_unique_tokens_yclients; +DROP INDEX if EXISTS idx_unique_yclients_rules; \ No newline at end of file diff --git a/dal/schema/000029_init.up.sql b/dal/schema/000029_init.up.sql new file mode 100644 index 0000000..47273ae --- /dev/null +++ b/dal/schema/000029_init.up.sql @@ -0,0 +1,157 @@ + +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'CustomFieldsTypeYclients') THEN +CREATE TYPE CustomFieldsTypeYclients AS ENUM ( + 'text', + 'number', + 'select', + 'date', + 'datetime' + ); +END IF; +END $$; + +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_enum + WHERE enumlabel = 'yclients_staff_id' AND enumtypid = 'question_type'::regtype + ) THEN +ALTER TYPE question_type ADD VALUE 'yclients_staff_id'; +END IF; +END $$; + +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_enum + WHERE enumlabel = 'yclients_services' AND enumtypid = 'question_type'::regtype + ) THEN +ALTER TYPE question_type ADD VALUE 'yclients_services'; +END IF; +END $$; + +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_enum + WHERE enumlabel = 'yclients_comment' AND enumtypid = 'question_type'::regtype + ) THEN +ALTER TYPE question_type ADD VALUE 'yclients_comment'; +END IF; +END $$; + +CREATE TABLE IF NOT EXISTS YclientsTokens ( + AccountID VARCHAR(30) PRIMARY KEY, + SalonID int not null, -- ID компании + AccessToken TEXT NOT NULL DEFAULT '', + Active BOOLEAN NOT NULL DEFAULT FALSE, + Expiration BOOLEAN NOT NULL DEFAULT FALSE, -- флаг истек ли токен + CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +create UNIQUE INDEX idx_unique_tokens_yclients ON YclientsTokens (SalonID, AccountID) WHERE Active = true and Expiration = false; + +CREATE TABLE IF NOT EXISTS YclientsAccounts ( + ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY, + AccountID VARCHAR(30) NOT NULL DEFAULT '', -- ID аккаунта у нас + SalonID INT NOT NULL, -- ID компании + Title text NOT NULL DEFAULT '', + ShortDecription text NOT NULL DEFAULT '', + Country VARCHAR(50) NOT NULL DEFAULT '', + Deleted BOOLEAN NOT NULL DEFAULT FALSE, + CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS YclientsAccountUsers ( + ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY, + SalonID INT NOT NULL, -- ID компании + YclientsID INT NOT NULL, -- ID пользователя в Yclients + Name VARCHAR(512) NOT NULL DEFAULT '', + Specialization text NOT NULL DEFAULT '', + IDPosition int not null default 0, + TitlePosition text not null default 0, + Fired BOOLEAN not null default false, -- Уволен ли сотрудник + Status BOOLEAN not null default false, -- Удален ли сотрудник + Hidden BOOLEAN not null default false, -- Скрыт ли сотрудник для онлайн-записи + YclientsUserID INT NOT NULL, -- ID пользователя в Yclients2 + Deleted BOOLEAN NOT NULL DEFAULT FALSE, + CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- CREATE TABLE IF NOT EXISTS YclientsCompany ( +-- ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY, +-- SalonID INT NOT NULL, -- ID компании +-- Title text NOT NULL, +-- ShortDecription text NOT NULL, +-- Active INT NOT NULL, +-- Country text NOT NULL, +-- GroupPriority INT NOT NULL, +-- Deleted BOOLEAN NOT NULL DEFAULT FALSE, +-- CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +-- ); + +CREATE TABLE IF NOT EXISTS YclientsServices ( + ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY, + SalonID INT NOT NULL, -- ID компании + ServiceID INT NOT NULL, + SalonServiceID INT NOT NULL, + Title text NOT NULL, + CategoryID INT NOT NULL, + PriceMin text NOT NULL, + PriceMax text NOT NULL, + Discount text NOT NULL, + Comment text NOT NULL, + Active BOOLEAN not null default false, + ApiID text NOT NULL, + Staff JSONB NOT NULL DEFAULT '{}', + Deleted BOOLEAN NOT NULL DEFAULT FALSE, + CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS YclientsTimeSlots ( + ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY, + SalonID INT NOT NULL, -- ID компании + IsEnabled BOOLEAN NOT NULL DEFAULT false, + WeekdaysSettings JSONB NOT NULL DEFAULT '[]', + DatesSettings JSONB NOT NULL DEFAULT '{}', + Deleted BOOLEAN NOT NULL DEFAULT FALSE, + CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS YclientsRules ( + ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY, + SalonID INT NOT NULL, -- ID компании + QuizID INT NOT NULL, -- ID квиза на которое вешается правило + StaffID INT NOT NULL, + Services JSONB NOT NULL DEFAULT '{}', + FieldsRule JSONB NOT NULL DEFAULT '{}', + CustomColor text NOT NULL Default '', + Deleted BOOLEAN NOT NULL DEFAULT FALSE, + CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS YclientsFields ( + ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY, + YclientsID INT NOT NULL, -- Айдишник field в Yclients + SalonID INT NOT NULL, -- ID компании + FieldType CustomFieldsTypeYclients NOT NULL, -- тип поля + Code text NOT NULL, + Title text NOT NULL, + ShowInUI BOOLEAN NOT NULL DEFAULT FALSE, + UserCanEdit BOOLEAN NOT NULL DEFAULT FALSE, + Deleted BOOLEAN NOT NULL DEFAULT FALSE, + CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + +CREATE TABLE IF NOT EXISTS YclientsCRMStatuses ( + ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY, + AnswerID BIGINT NOT NULL, + SalonID INT NOT NULL, + RecordID INT NOT NULL DEFAULT 0, -- ID созданной записи в YClients + Status TEXT NOT NULL DEFAULT '', -- запись о ошибке, либо успехе + CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX idx_unique_yclients_rules ON YclientsRules (SalonID, QuizID) WHERE Deleted = false; \ No newline at end of file diff --git a/dal/sqlcgen/models.go b/dal/sqlcgen/models.go index 19c4038..cba6a0b 100644 --- a/dal/sqlcgen/models.go +++ b/dal/sqlcgen/models.go @@ -400,3 +400,90 @@ type Usersamo struct { Deleted bool `db:"deleted" json:"deleted"` Createdat time.Time `db:"createdat" json:"createdat"` } + +type Yclientsaccount struct { + ID int64 `db:"id" json:"id"` + Accountid string `db:"accountid" json:"accountid"` + Salonid int32 `db:"salonid" json:"salonid"` + Title string `db:"title" json:"title"` + Deleted bool `db:"deleted" json:"deleted"` + Createdat time.Time `db:"createdat" json:"createdat"` +} + +type Yclientsaccountuser struct { + ID int64 `db:"id" json:"id"` + Salonid int32 `db:"salonid" json:"salonid"` + Yclientsid int32 `db:"yclientsid" json:"yclientsid"` + Name string `db:"name" json:"name"` + Specialization string `db:"specialization" json:"specialization"` + Idposition int32 `db:"idposition" json:"idposition"` + Titleposition string `db:"titleposition" json:"titleposition"` + Fired bool `db:"fired" json:"fired"` + Status bool `db:"status" json:"status"` + Hidden bool `db:"hidden" json:"hidden"` + Yclientsuserid int32 `db:"yclientsuserid" json:"yclientsuserid"` + Deleted bool `db:"deleted" json:"deleted"` + Createdat time.Time `db:"createdat" json:"createdat"` +} + +type Yclientscrmstatus struct { + ID int64 `db:"id" json:"id"` + Answerid int64 `db:"answerid" json:"answerid"` + Salonid int32 `db:"salonid" json:"salonid"` + Recordid int32 `db:"recordid" json:"recordid"` + Status string `db:"status" json:"status"` + Createdat time.Time `db:"createdat" json:"createdat"` +} + +type Yclientsfield struct { + ID int64 `db:"id" json:"id"` + Yclientsid int32 `db:"yclientsid" json:"yclientsid"` + Salonid int32 `db:"salonid" json:"salonid"` + Fieldtype interface{} `db:"fieldtype" json:"fieldtype"` + Code string `db:"code" json:"code"` + Title string `db:"title" json:"title"` + Showinui bool `db:"showinui" json:"showinui"` + Usercanedit bool `db:"usercanedit" json:"usercanedit"` + Deleted bool `db:"deleted" json:"deleted"` + Createdat time.Time `db:"createdat" json:"createdat"` +} + +type Yclientsrule struct { + ID int64 `db:"id" json:"id"` + Salonid int32 `db:"salonid" json:"salonid"` + Quizid int32 `db:"quizid" json:"quizid"` + Staffid int32 `db:"staffid" json:"staffid"` + Services json.RawMessage `db:"services" json:"services"` + Fieldsrule json.RawMessage `db:"fieldsrule" json:"fieldsrule"` + Customcolor string `db:"customcolor" json:"customcolor"` + Deleted bool `db:"deleted" json:"deleted"` + Createdat time.Time `db:"createdat" json:"createdat"` +} + +type Yclientsservice struct { + ID int64 `db:"id" json:"id"` + Salonid int32 `db:"salonid" json:"salonid"` + Serviceid int32 `db:"serviceid" json:"serviceid"` + Salonserviceid int32 `db:"salonserviceid" json:"salonserviceid"` + Title string `db:"title" json:"title"` + Categoryid int32 `db:"categoryid" json:"categoryid"` + Pricemin float64 `db:"pricemin" json:"pricemin"` + Pricemax float64 `db:"pricemax" json:"pricemax"` + Discount int32 `db:"discount" json:"discount"` + Comment string `db:"comment" json:"comment"` + Active bool `db:"active" json:"active"` + Apiid string `db:"apiid" json:"apiid"` + Staff json.RawMessage `db:"staff" json:"staff"` + Deleted bool `db:"deleted" json:"deleted"` + Createdat time.Time `db:"createdat" json:"createdat"` +} + +type Yclientstimeslot struct { + ID int64 `db:"id" json:"id"` + Salonid int32 `db:"salonid" json:"salonid"` + Isenabled bool `db:"isenabled" json:"isenabled"` + Weekdayssettings json.RawMessage `db:"weekdayssettings" json:"weekdayssettings"` + Datessettings json.RawMessage `db:"datessettings" json:"datessettings"` + Deleted bool `db:"deleted" json:"deleted"` + Createdat time.Time `db:"createdat" json:"createdat"` +} diff --git a/dal/sqlcgen/queries.sql.go b/dal/sqlcgen/queries.sql.go index 4912c28..fc783cc 100644 --- a/dal/sqlcgen/queries.sql.go +++ b/dal/sqlcgen/queries.sql.go @@ -111,6 +111,138 @@ func (q *Queries) AddBitrixAccountUser(ctx context.Context, arg AddBitrixAccount return err } +const addYclientsAccountField = `-- name: AddYclientsAccountField :exec +INSERT INTO YclientsFields (YclientsID, SalonID, FieldType, Code, Title, ShowInUI, UserCanEdit) +VALUES ($1, $2, $3, $4, $5, $6, $7) +` + +type AddYclientsAccountFieldParams struct { + Yclientsid int32 `db:"yclientsid" json:"yclientsid"` + Salonid int32 `db:"salonid" json:"salonid"` + Fieldtype interface{} `db:"fieldtype" json:"fieldtype"` + Code string `db:"code" json:"code"` + Title string `db:"title" json:"title"` + Showinui bool `db:"showinui" json:"showinui"` + Usercanedit bool `db:"usercanedit" json:"usercanedit"` +} + +func (q *Queries) AddYclientsAccountField(ctx context.Context, arg AddYclientsAccountFieldParams) error { + _, err := q.db.ExecContext(ctx, addYclientsAccountField, + arg.Yclientsid, + arg.Salonid, + arg.Fieldtype, + arg.Code, + arg.Title, + arg.Showinui, + arg.Usercanedit, + ) + return err +} + +const addYclientsAccountService = `-- name: AddYclientsAccountService :exec +INSERT INTO YclientsServices (SalonID, ServiceID, SalonServiceID, Title, CategoryID, PriceMin,PriceMax,Discount,Comment,Active,ApiID,Staff) +VALUES ($1, $2, $3, $4, $5, $6,$7,$8,$9,$10,$11,$12) +` + +type AddYclientsAccountServiceParams struct { + Salonid int32 `db:"salonid" json:"salonid"` + Serviceid int32 `db:"serviceid" json:"serviceid"` + Salonserviceid int32 `db:"salonserviceid" json:"salonserviceid"` + Title string `db:"title" json:"title"` + Categoryid int32 `db:"categoryid" json:"categoryid"` + Pricemin float64 `db:"pricemin" json:"pricemin"` + Pricemax float64 `db:"pricemax" json:"pricemax"` + Discount int32 `db:"discount" json:"discount"` + Comment string `db:"comment" json:"comment"` + Active bool `db:"active" json:"active"` + Apiid string `db:"apiid" json:"apiid"` + Staff json.RawMessage `db:"staff" json:"staff"` +} + +func (q *Queries) AddYclientsAccountService(ctx context.Context, arg AddYclientsAccountServiceParams) error { + _, err := q.db.ExecContext(ctx, addYclientsAccountService, + arg.Salonid, + arg.Serviceid, + arg.Salonserviceid, + arg.Title, + arg.Categoryid, + arg.Pricemin, + arg.Pricemax, + arg.Discount, + arg.Comment, + arg.Active, + arg.Apiid, + arg.Staff, + ) + return err +} + +const addYclientsAccountTimeslots = `-- name: AddYclientsAccountTimeslots :one +INSERT INTO YclientsTimeSlots (SalonID, IsEnabled, WeekdaysSettings, DatesSettings) +VALUES ($1, $2, $3, $4) RETURNING id, salonid, isenabled, weekdayssettings, datessettings, deleted, createdat +` + +type AddYclientsAccountTimeslotsParams struct { + Salonid int32 `db:"salonid" json:"salonid"` + Isenabled bool `db:"isenabled" json:"isenabled"` + Weekdayssettings json.RawMessage `db:"weekdayssettings" json:"weekdayssettings"` + Datessettings json.RawMessage `db:"datessettings" json:"datessettings"` +} + +func (q *Queries) AddYclientsAccountTimeslots(ctx context.Context, arg AddYclientsAccountTimeslotsParams) (Yclientstimeslot, error) { + row := q.db.QueryRowContext(ctx, addYclientsAccountTimeslots, + arg.Salonid, + arg.Isenabled, + arg.Weekdayssettings, + arg.Datessettings, + ) + var i Yclientstimeslot + err := row.Scan( + &i.ID, + &i.Salonid, + &i.Isenabled, + &i.Weekdayssettings, + &i.Datessettings, + &i.Deleted, + &i.Createdat, + ) + return i, err +} + +const addYclientsAccountUser = `-- name: AddYclientsAccountUser :exec +INSERT INTO YclientsAccountUsers (SalonID, YclientsID, Name, Specialization, IDPosition, TitlePosition,Fired,Status,Hidden,YclientsUserID) +VALUES ($1, $2, $3, $4, $5, $6,$7,$8,$9,$10) +` + +type AddYclientsAccountUserParams struct { + Salonid int32 `db:"salonid" json:"salonid"` + Yclientsid int32 `db:"yclientsid" json:"yclientsid"` + Name string `db:"name" json:"name"` + Specialization string `db:"specialization" json:"specialization"` + Idposition int32 `db:"idposition" json:"idposition"` + Titleposition string `db:"titleposition" json:"titleposition"` + Fired bool `db:"fired" json:"fired"` + Status bool `db:"status" json:"status"` + Hidden bool `db:"hidden" json:"hidden"` + Yclientsuserid int32 `db:"yclientsuserid" json:"yclientsuserid"` +} + +func (q *Queries) AddYclientsAccountUser(ctx context.Context, arg AddYclientsAccountUserParams) error { + _, err := q.db.ExecContext(ctx, addYclientsAccountUser, + arg.Salonid, + arg.Yclientsid, + arg.Name, + arg.Specialization, + arg.Idposition, + arg.Titleposition, + arg.Fired, + arg.Status, + arg.Hidden, + arg.Yclientsuserid, + ) + return err +} + const allServiceStatistics = `-- name: AllServiceStatistics :one WITH Registrations AS ( SELECT COUNT(*) AS registration_count @@ -237,6 +369,35 @@ func (q *Queries) ChangeQuizSettings(ctx context.Context, arg ChangeQuizSettings return id, err } +const changeYclientsQuizSettings = `-- name: ChangeYclientsQuizSettings :one +UPDATE YclientsRules SET Services = $1, CustomColor = $2,FieldsRule = $3,StaffID=$6 +WHERE SalonID = (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $4 AND YclientsAccounts.Deleted = false) +AND QuizID = $5 AND Deleted = false RETURNING id +` + +type ChangeYclientsQuizSettingsParams struct { + Services json.RawMessage `db:"services" json:"services"` + Customcolor string `db:"customcolor" json:"customcolor"` + Fieldsrule json.RawMessage `db:"fieldsrule" json:"fieldsrule"` + Accountid string `db:"accountid" json:"accountid"` + Quizid int32 `db:"quizid" json:"quizid"` + Staffid int32 `db:"staffid" json:"staffid"` +} + +func (q *Queries) ChangeYclientsQuizSettings(ctx context.Context, arg ChangeYclientsQuizSettingsParams) (int64, error) { + row := q.db.QueryRowContext(ctx, changeYclientsQuizSettings, + arg.Services, + arg.Customcolor, + arg.Fieldsrule, + arg.Accountid, + arg.Quizid, + arg.Staffid, + ) + var id int64 + err := row.Scan(&id) + return id, err +} + const checkAndAddDefault = `-- name: CheckAndAddDefault :exec UPDATE privileges SET amount = $1, created_at = NOW() @@ -1273,6 +1434,30 @@ func (q *Queries) CreateWebHook(ctx context.Context, arg CreateWebHookParams) er return err } +const createYclientsAccount = `-- name: CreateYclientsAccount :one +insert into YclientsAccounts (AccountID,SalonID,Title) values ($1,$2,$3) RETURNING id, accountid, salonid, title, deleted, createdat +` + +type CreateYclientsAccountParams struct { + Accountid string `db:"accountid" json:"accountid"` + Salonid int32 `db:"salonid" json:"salonid"` + Title string `db:"title" json:"title"` +} + +func (q *Queries) CreateYclientsAccount(ctx context.Context, arg CreateYclientsAccountParams) (Yclientsaccount, error) { + row := q.db.QueryRowContext(ctx, createYclientsAccount, arg.Accountid, arg.Salonid, arg.Title) + var i Yclientsaccount + err := row.Scan( + &i.ID, + &i.Accountid, + &i.Salonid, + &i.Title, + &i.Deleted, + &i.Createdat, + ) + return i, err +} + const decrementManual = `-- name: DecrementManual :one UPDATE privileges p SET amount = amount - 1 FROM account a WHERE p.account_id = a.id AND a.user_id = $1 AND p.privilegeID = $2 AND p.amount > 0 @@ -1503,6 +1688,42 @@ func (q *Queries) DeleteUsers(ctx context.Context, dollar_1 []int64) error { return err } +const deleteYclientsFields = `-- name: DeleteYclientsFields :exec +UPDATE YclientsFields SET Deleted = true WHERE ID = ANY($1::bigint[]) +` + +func (q *Queries) DeleteYclientsFields(ctx context.Context, dollar_1 []int64) error { + _, err := q.db.ExecContext(ctx, deleteYclientsFields, pq.Array(dollar_1)) + return err +} + +const deleteYclientsServices = `-- name: DeleteYclientsServices :exec +UPDATE YclientsServices SET Deleted = true WHERE ID = ANY($1::bigint[]) +` + +func (q *Queries) DeleteYclientsServices(ctx context.Context, dollar_1 []int64) error { + _, err := q.db.ExecContext(ctx, deleteYclientsServices, pq.Array(dollar_1)) + return err +} + +const deleteYclientsTimeslots = `-- name: DeleteYclientsTimeslots :exec +UPDATE YclientsTimeSlots SET Deleted = true WHERE NOT (ID = ANY($1::bigint[])) +` + +func (q *Queries) DeleteYclientsTimeslots(ctx context.Context, dollar_1 []int64) error { + _, err := q.db.ExecContext(ctx, deleteYclientsTimeslots, pq.Array(dollar_1)) + return err +} + +const deleteYclientsUsers = `-- name: DeleteYclientsUsers :exec +UPDATE YclientsAccountUsers SET Deleted = true WHERE ID = ANY($1::bigint[]) +` + +func (q *Queries) DeleteYclientsUsers(ctx context.Context, dollar_1 []int64) error { + _, err := q.db.ExecContext(ctx, deleteYclientsUsers, pq.Array(dollar_1)) + return err +} + const deviceStatistics = `-- name: DeviceStatistics :many WITH DeviceStats AS ( SELECT @@ -2141,6 +2362,40 @@ func (q *Queries) GetAllTokens(ctx context.Context) ([]Token, error) { return items, nil } +const getAllYclientsAccounts = `-- name: GetAllYclientsAccounts :many +SELECT id, accountid, salonid, title, deleted, createdat from YclientsAccounts where Deleted = false +` + +func (q *Queries) GetAllYclientsAccounts(ctx context.Context) ([]Yclientsaccount, error) { + rows, err := q.db.QueryContext(ctx, getAllYclientsAccounts) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Yclientsaccount + for rows.Next() { + var i Yclientsaccount + if err := rows.Scan( + &i.ID, + &i.Accountid, + &i.Salonid, + &i.Title, + &i.Deleted, + &i.Createdat, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const getBitrixFieldByID = `-- name: GetBitrixFieldByID :one SELECT id, bitrixid, accountid, entityid, fieldname, editfromlabel, fieldtype, deleted, createdat FROM BitrixFields WHERE BitrixID = $1 AND Deleted = false ` @@ -2433,6 +2688,26 @@ func (q *Queries) GetCurrentCompany(ctx context.Context, accountid string) (Acco return i, err } +const getCurrentYclientsCompany = `-- name: GetCurrentYclientsCompany :one + +SELECT id, accountid, salonid, title, deleted, createdat FROM YclientsAccounts WHERE AccountID = $1 AND Deleted = false +` + +// Yclients +func (q *Queries) GetCurrentYclientsCompany(ctx context.Context, accountid string) (Yclientsaccount, error) { + row := q.db.QueryRowContext(ctx, getCurrentYclientsCompany, accountid) + var i Yclientsaccount + err := row.Scan( + &i.ID, + &i.Accountid, + &i.Salonid, + &i.Title, + &i.Deleted, + &i.Createdat, + ) + return i, err +} + const getExistingContactAmo = `-- name: GetExistingContactAmo :many WITH getAmoID AS ( SELECT AmoID FROM amoContact WHERE amoContact.AccountID = $1 AND amoContact.Field = ANY($2::text[]) @@ -3091,6 +3366,49 @@ func (q *Queries) GetQuestionListByIDs(ctx context.Context, dollar_1 []int32) ([ return items, nil } +const getQuestionListByQuizID = `-- name: GetQuestionListByQuizID :many +SELECT id, quiz_id, title, description, questiontype, required, deleted, page, content, version, parent_ids, created_at, updated_at, session, auditory from question where quiz_id=$1 and deleted = false +` + +func (q *Queries) GetQuestionListByQuizID(ctx context.Context, quizID int64) ([]Question, error) { + rows, err := q.db.QueryContext(ctx, getQuestionListByQuizID, quizID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Question + for rows.Next() { + var i Question + if err := rows.Scan( + &i.ID, + &i.QuizID, + &i.Title, + &i.Description, + &i.Questiontype, + &i.Required, + &i.Deleted, + &i.Page, + &i.Content, + &i.Version, + pq.Array(&i.ParentIds), + &i.CreatedAt, + &i.UpdatedAt, + &i.Session, + &i.Auditory, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const getQuestionTitle = `-- name: GetQuestionTitle :one SELECT title, questiontype,page FROM question WHERE id = $1 ` @@ -3577,6 +3895,135 @@ func (q *Queries) GetResultAnswers(ctx context.Context, id int64) ([]GetResultAn return items, nil } +const getServicesByIDYclients = `-- name: GetServicesByIDYclients :many +SELECT id, salonid, serviceid, salonserviceid, title, categoryid, pricemin, pricemax, discount, comment, active, apiid, staff, deleted, createdat FROM YclientsServices WHERE SalonID = $1 AND Deleted = false +` + +func (q *Queries) GetServicesByIDYclients(ctx context.Context, salonid int32) ([]Yclientsservice, error) { + rows, err := q.db.QueryContext(ctx, getServicesByIDYclients, salonid) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Yclientsservice + for rows.Next() { + var i Yclientsservice + if err := rows.Scan( + &i.ID, + &i.Salonid, + &i.Serviceid, + &i.Salonserviceid, + &i.Title, + &i.Categoryid, + &i.Pricemin, + &i.Pricemax, + &i.Discount, + &i.Comment, + &i.Active, + &i.Apiid, + &i.Staff, + &i.Deleted, + &i.Createdat, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getServicesYclientsWithPagination = `-- name: GetServicesYclientsWithPagination :many + +WITH user_data AS ( + SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1 AND YclientsAccounts.Deleted = false +) +SELECT u.id, u.salonid, u.serviceid, u.salonserviceid, u.title, u.categoryid, u.pricemin, u.pricemax, u.discount, u.comment, u.active, u.apiid, u.staff, u.deleted, u.createdat, COUNT(*) OVER() as total_count +FROM YclientsServices u + JOIN user_data a ON u.SalonID = a.SalonID +WHERE u.Deleted = false +ORDER BY u.ID OFFSET ($2 - 1) * $3 LIMIT $3 +` + +type GetServicesYclientsWithPaginationParams struct { + Accountid string `db:"accountid" json:"accountid"` + Column2 interface{} `db:"column_2" json:"column_2"` + Limit int32 `db:"limit" json:"limit"` +} + +type GetServicesYclientsWithPaginationRow struct { + ID int64 `db:"id" json:"id"` + Salonid int32 `db:"salonid" json:"salonid"` + Serviceid int32 `db:"serviceid" json:"serviceid"` + Salonserviceid int32 `db:"salonserviceid" json:"salonserviceid"` + Title string `db:"title" json:"title"` + Categoryid int32 `db:"categoryid" json:"categoryid"` + Pricemin float64 `db:"pricemin" json:"pricemin"` + Pricemax float64 `db:"pricemax" json:"pricemax"` + Discount int32 `db:"discount" json:"discount"` + Comment string `db:"comment" json:"comment"` + Active bool `db:"active" json:"active"` + Apiid string `db:"apiid" json:"apiid"` + Staff json.RawMessage `db:"staff" json:"staff"` + Deleted bool `db:"deleted" json:"deleted"` + Createdat time.Time `db:"createdat" json:"createdat"` + TotalCount int64 `db:"total_count" json:"total_count"` +} + +// -- name: GetCompanyYclientsWithPagination :many +// WITH user_data AS ( +// SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1 AND YclientsAccounts.Deleted = false +// ) +// SELECT u.*, COUNT(*) OVER() as total_count +// FROM YclientsCompany u +// JOIN user_data a ON u.SalonID = a.SalonID +// WHERE u.Deleted = false +// ORDER BY u.ID OFFSET ($2 - 1) * $3 LIMIT $3; +func (q *Queries) GetServicesYclientsWithPagination(ctx context.Context, arg GetServicesYclientsWithPaginationParams) ([]GetServicesYclientsWithPaginationRow, error) { + rows, err := q.db.QueryContext(ctx, getServicesYclientsWithPagination, arg.Accountid, arg.Column2, arg.Limit) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetServicesYclientsWithPaginationRow + for rows.Next() { + var i GetServicesYclientsWithPaginationRow + if err := rows.Scan( + &i.ID, + &i.Salonid, + &i.Serviceid, + &i.Salonserviceid, + &i.Title, + &i.Categoryid, + &i.Pricemin, + &i.Pricemax, + &i.Discount, + &i.Comment, + &i.Active, + &i.Apiid, + &i.Staff, + &i.Deleted, + &i.Createdat, + &i.TotalCount, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const getStepsCount = `-- name: GetStepsCount :one WITH user_data AS ( SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $1 AND accountsAmo.Deleted = false @@ -3712,6 +4159,85 @@ func (q *Queries) GetTagsWithPagination(ctx context.Context, arg GetTagsWithPagi return items, nil } +const getTimeslotsByIDYclients = `-- name: GetTimeslotsByIDYclients :one +SELECT id, salonid, isenabled, weekdayssettings, datessettings, deleted, createdat FROM YclientsTimeSlots WHERE SalonID = $1 AND Deleted = false +` + +func (q *Queries) GetTimeslotsByIDYclients(ctx context.Context, salonid int32) (Yclientstimeslot, error) { + row := q.db.QueryRowContext(ctx, getTimeslotsByIDYclients, salonid) + var i Yclientstimeslot + err := row.Scan( + &i.ID, + &i.Salonid, + &i.Isenabled, + &i.Weekdayssettings, + &i.Datessettings, + &i.Deleted, + &i.Createdat, + ) + return i, err +} + +const getTimeslotsYclientsWithPagination = `-- name: GetTimeslotsYclientsWithPagination :many +WITH user_data AS ( + SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1 AND YclientsAccounts.Deleted = false +) +SELECT u.id, u.salonid, u.isenabled, u.weekdayssettings, u.datessettings, u.deleted, u.createdat, COUNT(*) OVER() as total_count +FROM YclientsTimeSlots u + JOIN user_data a ON u.SalonID = a.SalonID +WHERE u.Deleted = false +ORDER BY u.ID OFFSET ($2 - 1) * $3 LIMIT $3 +` + +type GetTimeslotsYclientsWithPaginationParams struct { + Accountid string `db:"accountid" json:"accountid"` + Column2 interface{} `db:"column_2" json:"column_2"` + Limit int32 `db:"limit" json:"limit"` +} + +type GetTimeslotsYclientsWithPaginationRow struct { + ID int64 `db:"id" json:"id"` + Salonid int32 `db:"salonid" json:"salonid"` + Isenabled bool `db:"isenabled" json:"isenabled"` + Weekdayssettings json.RawMessage `db:"weekdayssettings" json:"weekdayssettings"` + Datessettings json.RawMessage `db:"datessettings" json:"datessettings"` + Deleted bool `db:"deleted" json:"deleted"` + Createdat time.Time `db:"createdat" json:"createdat"` + TotalCount int64 `db:"total_count" json:"total_count"` +} + +func (q *Queries) GetTimeslotsYclientsWithPagination(ctx context.Context, arg GetTimeslotsYclientsWithPaginationParams) ([]GetTimeslotsYclientsWithPaginationRow, error) { + rows, err := q.db.QueryContext(ctx, getTimeslotsYclientsWithPagination, arg.Accountid, arg.Column2, arg.Limit) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetTimeslotsYclientsWithPaginationRow + for rows.Next() { + var i GetTimeslotsYclientsWithPaginationRow + if err := rows.Scan( + &i.ID, + &i.Salonid, + &i.Isenabled, + &i.Weekdayssettings, + &i.Datessettings, + &i.Deleted, + &i.Createdat, + &i.TotalCount, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const getTokenById = `-- name: GetTokenById :one SELECT accountid, refreshtoken, accesstoken, authcode, expiration, createdat FROM tokens WHERE accountID = $1 ` @@ -4098,6 +4624,44 @@ func (q *Queries) GetUserUsersByIDBitrix(ctx context.Context, accountid string) return items, nil } +const getUserYclientsFieldsByID = `-- name: GetUserYclientsFieldsByID :many +SELECT id, yclientsid, salonid, fieldtype, code, title, showinui, usercanedit, deleted, createdat FROM YclientsFields WHERE SalonID = $1 AND Deleted = false +` + +func (q *Queries) GetUserYclientsFieldsByID(ctx context.Context, salonid int32) ([]Yclientsfield, error) { + rows, err := q.db.QueryContext(ctx, getUserYclientsFieldsByID, salonid) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Yclientsfield + for rows.Next() { + var i Yclientsfield + if err := rows.Scan( + &i.ID, + &i.Yclientsid, + &i.Salonid, + &i.Fieldtype, + &i.Code, + &i.Title, + &i.Showinui, + &i.Usercanedit, + &i.Deleted, + &i.Createdat, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const getUsersBitrixWithPagination = `-- name: GetUsersBitrixWithPagination :many WITH user_data AS ( @@ -4170,6 +4734,47 @@ func (q *Queries) GetUsersBitrixWithPagination(ctx context.Context, arg GetUsers return items, nil } +const getUsersByIDYclients = `-- name: GetUsersByIDYclients :many +SELECT id, salonid, yclientsid, name, specialization, idposition, titleposition, fired, status, hidden, yclientsuserid, deleted, createdat FROM YclientsAccountUsers WHERE SalonID = $1 AND Deleted = false +` + +func (q *Queries) GetUsersByIDYclients(ctx context.Context, salonid int32) ([]Yclientsaccountuser, error) { + rows, err := q.db.QueryContext(ctx, getUsersByIDYclients, salonid) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Yclientsaccountuser + for rows.Next() { + var i Yclientsaccountuser + if err := rows.Scan( + &i.ID, + &i.Salonid, + &i.Yclientsid, + &i.Name, + &i.Specialization, + &i.Idposition, + &i.Titleposition, + &i.Fired, + &i.Status, + &i.Hidden, + &i.Yclientsuserid, + &i.Deleted, + &i.Createdat, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const getUsersCount = `-- name: GetUsersCount :one WITH user_data AS ( SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $1 AND accountsAmo.Deleted = false @@ -4234,6 +4839,164 @@ func (q *Queries) GetUsersWithPagination(ctx context.Context, arg GetUsersWithPa return items, nil } +const getUsersYclientsWithPagination = `-- name: GetUsersYclientsWithPagination :many +WITH user_data AS ( + SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1 AND YclientsAccounts.Deleted = false +) +SELECT u.id, u.salonid, u.yclientsid, u.name, u.specialization, u.idposition, u.titleposition, u.fired, u.status, u.hidden, u.yclientsuserid, u.deleted, u.createdat, COUNT(*) OVER() as total_count +FROM YclientsAccountUsers u + JOIN user_data a ON u.SalonID = a.SalonID +WHERE u.Deleted = false +ORDER BY u.ID OFFSET ($2 - 1) * $3 LIMIT $3 +` + +type GetUsersYclientsWithPaginationParams struct { + Accountid string `db:"accountid" json:"accountid"` + Column2 interface{} `db:"column_2" json:"column_2"` + Limit int32 `db:"limit" json:"limit"` +} + +type GetUsersYclientsWithPaginationRow struct { + ID int64 `db:"id" json:"id"` + Salonid int32 `db:"salonid" json:"salonid"` + Yclientsid int32 `db:"yclientsid" json:"yclientsid"` + Name string `db:"name" json:"name"` + Specialization string `db:"specialization" json:"specialization"` + Idposition int32 `db:"idposition" json:"idposition"` + Titleposition string `db:"titleposition" json:"titleposition"` + Fired bool `db:"fired" json:"fired"` + Status bool `db:"status" json:"status"` + Hidden bool `db:"hidden" json:"hidden"` + Yclientsuserid int32 `db:"yclientsuserid" json:"yclientsuserid"` + Deleted bool `db:"deleted" json:"deleted"` + Createdat time.Time `db:"createdat" json:"createdat"` + TotalCount int64 `db:"total_count" json:"total_count"` +} + +func (q *Queries) GetUsersYclientsWithPagination(ctx context.Context, arg GetUsersYclientsWithPaginationParams) ([]GetUsersYclientsWithPaginationRow, error) { + rows, err := q.db.QueryContext(ctx, getUsersYclientsWithPagination, arg.Accountid, arg.Column2, arg.Limit) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetUsersYclientsWithPaginationRow + for rows.Next() { + var i GetUsersYclientsWithPaginationRow + if err := rows.Scan( + &i.ID, + &i.Salonid, + &i.Yclientsid, + &i.Name, + &i.Specialization, + &i.Idposition, + &i.Titleposition, + &i.Fired, + &i.Status, + &i.Hidden, + &i.Yclientsuserid, + &i.Deleted, + &i.Createdat, + &i.TotalCount, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getYclientsFieldsWithPagination = `-- name: GetYclientsFieldsWithPagination :many +WITH user_data AS ( + SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1 AND YclientsAccounts.Deleted = false +) +SELECT f.id, f.yclientsid, f.salonid, f.fieldtype, f.code, f.title, f.showinui, f.usercanedit, f.deleted, f.createdat, COUNT(*) OVER() as total_count +FROM YclientsFields f JOIN user_data u ON f.SalonID = u.SalonID +WHERE f.Deleted = false +ORDER BY f.ID OFFSET ($2 - 1) * $3 LIMIT $3 +` + +type GetYclientsFieldsWithPaginationParams struct { + Accountid string `db:"accountid" json:"accountid"` + Column2 interface{} `db:"column_2" json:"column_2"` + Limit int32 `db:"limit" json:"limit"` +} + +type GetYclientsFieldsWithPaginationRow struct { + ID int64 `db:"id" json:"id"` + Yclientsid int32 `db:"yclientsid" json:"yclientsid"` + Salonid int32 `db:"salonid" json:"salonid"` + Fieldtype interface{} `db:"fieldtype" json:"fieldtype"` + Code string `db:"code" json:"code"` + Title string `db:"title" json:"title"` + Showinui bool `db:"showinui" json:"showinui"` + Usercanedit bool `db:"usercanedit" json:"usercanedit"` + Deleted bool `db:"deleted" json:"deleted"` + Createdat time.Time `db:"createdat" json:"createdat"` + TotalCount int64 `db:"total_count" json:"total_count"` +} + +func (q *Queries) GetYclientsFieldsWithPagination(ctx context.Context, arg GetYclientsFieldsWithPaginationParams) ([]GetYclientsFieldsWithPaginationRow, error) { + rows, err := q.db.QueryContext(ctx, getYclientsFieldsWithPagination, arg.Accountid, arg.Column2, arg.Limit) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetYclientsFieldsWithPaginationRow + for rows.Next() { + var i GetYclientsFieldsWithPaginationRow + if err := rows.Scan( + &i.ID, + &i.Yclientsid, + &i.Salonid, + &i.Fieldtype, + &i.Code, + &i.Title, + &i.Showinui, + &i.Usercanedit, + &i.Deleted, + &i.Createdat, + &i.TotalCount, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getYclientsQuizRule = `-- name: GetYclientsQuizRule :one +SELECT id, salonid, quizid, staffid, services, fieldsrule, customcolor, deleted, createdat FROM YclientsRules WHERE QuizID = $1 AND Deleted = false +` + +func (q *Queries) GetYclientsQuizRule(ctx context.Context, quizid int32) (Yclientsrule, error) { + row := q.db.QueryRowContext(ctx, getYclientsQuizRule, quizid) + var i Yclientsrule + err := row.Scan( + &i.ID, + &i.Salonid, + &i.Quizid, + &i.Staffid, + &i.Services, + &i.Fieldsrule, + &i.Customcolor, + &i.Deleted, + &i.Createdat, + ) + return i, err +} + const gettingAmoUsersTrueResults = `-- name: GettingAmoUsersTrueResults :many SELECT a.quiz_id,a.id,a.result,a.question_id,a.content,a.session, COALESCE((SELECT a2.utm @@ -4408,6 +5171,79 @@ func (q *Queries) GettingBitrixUsersTrueResults(ctx context.Context) ([]GettingB return items, nil } +const gettingYclientsUsersTrueResults = `-- name: GettingYclientsUsersTrueResults :many +SELECT + a.quiz_id, a.id AS answer_id, a.result, + a.question_id, a.content, a.session, + COALESCE((SELECT a2.utm FROM answer a2 WHERE a2.start = true AND a2.session = a.session LIMIT 1), '{}'::jsonb) AS utm, + r.salonid, r.fieldsrule, r.staffid, r.services, + r.customcolor, u.accountid AS quiz_accountid, + a.created_at as datetime -- добавляем время result ответа +FROM answer a + INNER JOIN quiz q ON a.quiz_id = q.id + LEFT JOIN yclientscrmstatuses s ON a.id = s.AnswerID + INNER JOIN yclientsrules r ON q.id = r.QuizID + INNER JOIN yclientsaccounts u ON q.accountid = u.accountid AND r.salonid = u.salonid +WHERE a.result = true AND s.id IS NULL AND a.deleted = false + AND r.deleted = false AND q.deleted = false + AND u.deleted = false +` + +type GettingYclientsUsersTrueResultsRow struct { + QuizID int64 `db:"quiz_id" json:"quiz_id"` + AnswerID int64 `db:"answer_id" json:"answer_id"` + Result sql.NullBool `db:"result" json:"result"` + QuestionID int64 `db:"question_id" json:"question_id"` + Content sql.NullString `db:"content" json:"content"` + Session sql.NullString `db:"session" json:"session"` + Utm interface{} `db:"utm" json:"utm"` + Salonid int32 `db:"salonid" json:"salonid"` + Fieldsrule json.RawMessage `db:"fieldsrule" json:"fieldsrule"` + Staffid int32 `db:"staffid" json:"staffid"` + Services json.RawMessage `db:"services" json:"services"` + Customcolor string `db:"customcolor" json:"customcolor"` + QuizAccountid string `db:"quiz_accountid" json:"quiz_accountid"` + Datetime sql.NullTime `db:"datetime" json:"datetime"` +} + +func (q *Queries) GettingYclientsUsersTrueResults(ctx context.Context) ([]GettingYclientsUsersTrueResultsRow, error) { + rows, err := q.db.QueryContext(ctx, gettingYclientsUsersTrueResults) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GettingYclientsUsersTrueResultsRow + for rows.Next() { + var i GettingYclientsUsersTrueResultsRow + if err := rows.Scan( + &i.QuizID, + &i.AnswerID, + &i.Result, + &i.QuestionID, + &i.Content, + &i.Session, + &i.Utm, + &i.Salonid, + &i.Fieldsrule, + &i.Staffid, + &i.Services, + &i.Customcolor, + &i.QuizAccountid, + &i.Datetime, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const incrementQuizPrivilegeUsage = `-- name: IncrementQuizPrivilegeUsage :exec UPDATE quiz_privilege_usage SET used_count = used_count + 1, updated_at = CURRENT_TIMESTAMP WHERE quiz_id = $1 AND privilege_id = $2 @@ -4988,6 +5824,28 @@ func (q *Queries) ResetQuizPrivilegeUsageCount(ctx context.Context, arg ResetQui return err } +const saveDealYclientsStatus = `-- name: SaveDealYclientsStatus :exec +INSERT INTO YclientsCRMStatuses (SalonID, RecordID, AnswerID, Status) +values ($4, $1, $2, $3) +` + +type SaveDealYclientsStatusParams struct { + Recordid int32 `db:"recordid" json:"recordid"` + Answerid int64 `db:"answerid" json:"answerid"` + Status string `db:"status" json:"status"` + Salonid int32 `db:"salonid" json:"salonid"` +} + +func (q *Queries) SaveDealYclientsStatus(ctx context.Context, arg SaveDealYclientsStatusParams) error { + _, err := q.db.ExecContext(ctx, saveDealYclientsStatus, + arg.Recordid, + arg.Answerid, + arg.Status, + arg.Salonid, + ) + return err +} + const searchIDByAppIDanAppHash = `-- name: SearchIDByAppIDanAppHash :one SELECT id, apiid, apihash, phonenumber, password, status, deleted, createdat FROM tgAccounts WHERE ApiID = $1 and ApiHash=$2 and Deleted = false ` @@ -5085,6 +5943,36 @@ func (q *Queries) SetQuizSettings(ctx context.Context, arg SetQuizSettingsParams return id, err } +const setYclientsQuizSettings = `-- name: SetYclientsQuizSettings :one +INSERT INTO YclientsRules (SalonID, QuizID, Services,FieldsRule, CustomColor,StaffID) +SELECT ya.SalonID, $1 AS QuizID, $2 AS Services, $3 AS FieldsRule, $4 AS CustomColor,$6 AS StaffID +FROM YclientsAccounts ya WHERE ya.AccountID = $5 AND ya.Deleted = false +RETURNING id +` + +type SetYclientsQuizSettingsParams struct { + Quizid int32 `db:"quizid" json:"quizid"` + Services json.RawMessage `db:"services" json:"services"` + Fieldsrule json.RawMessage `db:"fieldsrule" json:"fieldsrule"` + Customcolor string `db:"customcolor" json:"customcolor"` + Accountid string `db:"accountid" json:"accountid"` + Staffid int32 `db:"staffid" json:"staffid"` +} + +func (q *Queries) SetYclientsQuizSettings(ctx context.Context, arg SetYclientsQuizSettingsParams) (int64, error) { + row := q.db.QueryRowContext(ctx, setYclientsQuizSettings, + arg.Quizid, + arg.Services, + arg.Fieldsrule, + arg.Customcolor, + arg.Accountid, + arg.Staffid, + ) + var id int64 + err := row.Scan(&id) + return id, err +} + const settingDealAmoStatus = `-- name: SettingDealAmoStatus :exec INSERT INTO amoCRMStatuses (AccountID, DealID, AnswerID, Status) SELECT u.AmoID, $1, $2, $3 @@ -5194,6 +6082,33 @@ func (q *Queries) SoftDeleteTgAccount(ctx context.Context, id int64) error { return err } +const softDeleteYclientsAccount = `-- name: SoftDeleteYclientsAccount :exec +WITH account_data AS ( +UPDATE YclientsAccounts SET Deleted = true WHERE YclientsAccounts.AccountID = $1 +), +account_users AS ( + UPDATE YclientsAccountUsers SET Deleted = true WHERE SalonID IN (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1) +), +account_services AS ( + UPDATE YclientsServices SET Deleted = true WHERE SalonID IN (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1) +), +account_timeslots AS ( + UPDATE YclientsTimeSlots SET Deleted = true WHERE SalonID IN (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1) +), +account_rules AS ( + UPDATE YclientsRules SET Deleted = true WHERE SalonID IN (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1) +), +account_fields AS ( + UPDATE YclientsFields SET Deleted = true WHERE SalonID IN (SELECT SalonID FROM YclientsAccounts WHERE YclientsAccounts.AccountID = $1) +) +SELECT 1 +` + +func (q *Queries) SoftDeleteYclientsAccount(ctx context.Context, accountid string) error { + _, err := q.db.ExecContext(ctx, softDeleteYclientsAccount, accountid) + return err +} + const templateCopy = `-- name: TemplateCopy :one WITH copied_quiz AS ( INSERT INTO quiz (accountid, name,fingerprinting,repeatable,note_prevented,mail_notifications,unique_answers,super,group_id, description, config, status,limit_answers,due_to,time_of_passing,pausable,version,version_comment, parent_ids) @@ -5576,6 +6491,143 @@ func (q *Queries) UpdateTags(ctx context.Context, dollar_1 json.RawMessage) erro return err } +const updateYclientsAccountFields = `-- name: UpdateYclientsAccountFields :exec +UPDATE YclientsFields +SET FieldType = $3,Code = $4,Title = $5,ShowInUI = $6, UserCanEdit = $7 +WHERE SalonID = $1 AND YclientsID = $2 AND Deleted = false +` + +type UpdateYclientsAccountFieldsParams struct { + Salonid int32 `db:"salonid" json:"salonid"` + Yclientsid int32 `db:"yclientsid" json:"yclientsid"` + Fieldtype interface{} `db:"fieldtype" json:"fieldtype"` + Code string `db:"code" json:"code"` + Title string `db:"title" json:"title"` + Showinui bool `db:"showinui" json:"showinui"` + Usercanedit bool `db:"usercanedit" json:"usercanedit"` +} + +func (q *Queries) UpdateYclientsAccountFields(ctx context.Context, arg UpdateYclientsAccountFieldsParams) error { + _, err := q.db.ExecContext(ctx, updateYclientsAccountFields, + arg.Salonid, + arg.Yclientsid, + arg.Fieldtype, + arg.Code, + arg.Title, + arg.Showinui, + arg.Usercanedit, + ) + return err +} + +const updateYclientsAccountServices = `-- name: UpdateYclientsAccountServices :exec +UPDATE YclientsServices SET SalonServiceID = $3,Title = $4, CategoryID = $5, PriceMin = $6, PriceMax= $7, Discount = $8,Comment = $9,Active=$10,ApiID=$11,Staff=$12 +WHERE SalonID = $1 AND ServiceID = $2 AND deleted = false +` + +type UpdateYclientsAccountServicesParams struct { + Salonid int32 `db:"salonid" json:"salonid"` + Serviceid int32 `db:"serviceid" json:"serviceid"` + Salonserviceid int32 `db:"salonserviceid" json:"salonserviceid"` + Title string `db:"title" json:"title"` + Categoryid int32 `db:"categoryid" json:"categoryid"` + Pricemin float64 `db:"pricemin" json:"pricemin"` + Pricemax float64 `db:"pricemax" json:"pricemax"` + Discount int32 `db:"discount" json:"discount"` + Comment string `db:"comment" json:"comment"` + Active bool `db:"active" json:"active"` + Apiid string `db:"apiid" json:"apiid"` + Staff json.RawMessage `db:"staff" json:"staff"` +} + +func (q *Queries) UpdateYclientsAccountServices(ctx context.Context, arg UpdateYclientsAccountServicesParams) error { + _, err := q.db.ExecContext(ctx, updateYclientsAccountServices, + arg.Salonid, + arg.Serviceid, + arg.Salonserviceid, + arg.Title, + arg.Categoryid, + arg.Pricemin, + arg.Pricemax, + arg.Discount, + arg.Comment, + arg.Active, + arg.Apiid, + arg.Staff, + ) + return err +} + +const updateYclientsAccountTimeslots = `-- name: UpdateYclientsAccountTimeslots :exec +UPDATE YclientsTimeSlots SET IsEnabled = $2,WeekdaysSettings = $3, DatesSettings = $4 +WHERE SalonID = $1 AND deleted = false +` + +type UpdateYclientsAccountTimeslotsParams struct { + Salonid int32 `db:"salonid" json:"salonid"` + Isenabled bool `db:"isenabled" json:"isenabled"` + Weekdayssettings json.RawMessage `db:"weekdayssettings" json:"weekdayssettings"` + Datessettings json.RawMessage `db:"datessettings" json:"datessettings"` +} + +func (q *Queries) UpdateYclientsAccountTimeslots(ctx context.Context, arg UpdateYclientsAccountTimeslotsParams) error { + _, err := q.db.ExecContext(ctx, updateYclientsAccountTimeslots, + arg.Salonid, + arg.Isenabled, + arg.Weekdayssettings, + arg.Datessettings, + ) + return err +} + +const updateYclientsAccountUser = `-- name: UpdateYclientsAccountUser :exec +UPDATE YclientsAccountUsers SET Name = $3, Specialization = $4, IDPosition = $5, TitlePosition= $6, Fired = $7,Status = $8,Hidden=$9 +WHERE SalonID = $1 AND YclientsID = $2 AND deleted = false +` + +type UpdateYclientsAccountUserParams struct { + Salonid int32 `db:"salonid" json:"salonid"` + Yclientsid int32 `db:"yclientsid" json:"yclientsid"` + Name string `db:"name" json:"name"` + Specialization string `db:"specialization" json:"specialization"` + Idposition int32 `db:"idposition" json:"idposition"` + Titleposition string `db:"titleposition" json:"titleposition"` + Fired bool `db:"fired" json:"fired"` + Status bool `db:"status" json:"status"` + Hidden bool `db:"hidden" json:"hidden"` +} + +func (q *Queries) UpdateYclientsAccountUser(ctx context.Context, arg UpdateYclientsAccountUserParams) error { + _, err := q.db.ExecContext(ctx, updateYclientsAccountUser, + arg.Salonid, + arg.Yclientsid, + arg.Name, + arg.Specialization, + arg.Idposition, + arg.Titleposition, + arg.Fired, + arg.Status, + arg.Hidden, + ) + return err +} + +const updateYclientsFieldRules = `-- name: UpdateYclientsFieldRules :exec +UPDATE YclientsRules SET FieldsRule = $1 +WHERE SalonID = $2 AND QuizID = $3 AND Deleted = false +` + +type UpdateYclientsFieldRulesParams struct { + Fieldsrule json.RawMessage `db:"fieldsrule" json:"fieldsrule"` + Salonid int32 `db:"salonid" json:"salonid"` + Quizid int32 `db:"quizid" json:"quizid"` +} + +func (q *Queries) UpdateYclientsFieldRules(ctx context.Context, arg UpdateYclientsFieldRulesParams) error { + _, err := q.db.ExecContext(ctx, updateYclientsFieldRules, arg.Fieldsrule, arg.Salonid, arg.Quizid) + return err +} + const updatingDealAmoStatus = `-- name: UpdatingDealAmoStatus :exec UPDATE amoCRMStatuses SET Status = $1 WHERE DealID = $2 AND AccountID = (SELECT u.AmoID FROM tokens AS t JOIN accountsAmo AS u ON t.AccountID = u.AccountID WHERE t.AccessToken = $3 AND u.Deleted = false) diff --git a/model/model.go b/model/model.go index 5f46f14..24c9b07 100644 --- a/model/model.go +++ b/model/model.go @@ -16,18 +16,21 @@ const ( StatusOffLimit = "offlimit" StatusAI = "ai" - TypeVariant = "variant" - TypeImages = "images" - TypeVarImages = "varimg" - TypeFile = "file" - TypeText = "text" - TypeEmoji = "emoji" - TypeSelect = "select" - TypeDate = "date" - TypeNumber = "number" - TypePage = "page" - TypeRating = "rating" - TypeResult = "result" + TypeVariant = "variant" + TypeImages = "images" + TypeVarImages = "varimg" + TypeFile = "file" + TypeText = "text" + TypeEmoji = "emoji" + TypeSelect = "select" + TypeDate = "date" + TypeNumber = "number" + TypePage = "page" + TypeRating = "rating" + TypeResult = "result" + TypeYclientsStaffID = "yclients_staff_id" + TypeYclientsServices = "yclients_services" + TypeYclientsComment = "yclients_comment" ) const QuizGigaChatPrivilegeLimitUsage = 30 diff --git a/model/yclients.go b/model/yclients.go new file mode 100644 index 0000000..b2320f3 --- /dev/null +++ b/model/yclients.go @@ -0,0 +1,183 @@ +package model + +import "time" + +type YclientsAccount struct { + ID int64 `json:"id"` + AccountID string `json:"accountID"` // ID аккаунта нас + SalonID int32 `json:"salon_id"` // ID "аккаунта который ГЛАВНЫЙ" + Title string `json:"title"` + Deleted bool `json:"deleted"` + CreatedAt time.Time `json:"createdAt"` +} + +type YclientsAccountUser struct { + ID int64 `json:"id"` + SalonID int32 `json:"salon_id"` // ID "аккаунта который ГЛАВНЫЙ" + YclientsID int32 `json:"yclientsID"` // ID пользователя в Yclients + Name string `json:"name"` + Specialization string `json:"specialization"` + IDPosition int32 `json:"idPosition"` + TitlePosition string `json:"titlePosition"` + Fired bool `json:"fired"` // Уволен ли сотрудник + Status bool `json:"status"` //Удален ли сотрудник + Hidden bool `json:"hidden"` // Скрыт ли сотрудник для онлайн-записи + YclientsUserID int32 `json:"yclientsUserID"` // ID пользователя в Yclients2 + Deleted bool `json:"deleted"` + CreatedAt time.Time `json:"createdAt"` +} + +type UserListYclientsResp struct { + Count int64 `json:"count"` + Items []YclientsAccountUser `json:"items"` +} + +//type YclientsCompany struct { +// ID int64 `json:"id"` +// SalonID int32 `json:"salon_id"` // ID "аккаунта который ГЛАВНЫЙ" +// Title string `json:"title"` +// ShortDecription string `json:"shortDecription"` +// Active int32 `json:"active"` +// Country string `json:"country"` +// GroupPriority int32 `json:"groupPriority"` +// Deleted bool `json:"deleted"` +// CreatedAt time.Time `json:"createdAt"` +//} + +//type CompanyListYclientsResp struct { +// Count int64 `json:"count"` +// Items []YclientsCompany `json:"items"` +//} + +type YclientsServices struct { + ID int64 `json:"id"` + SalonID int32 `json:"salon_id"` // ID "аккаунта который ГЛАВНЫЙ" + ServiceID int32 `json:"serviceID"` + SalonServiceID int32 `json:"salon_service_id"` + Title string `json:"title"` + CategoryID int32 `json:"categoryID"` + PriceMin float64 `json:"priceMin"` + PriceMax float64 `json:"priceMax"` + Discount int32 `json:"discount"` + Comment string `json:"comment"` + Active bool `json:"active"` + ApiID string `json:"apiID"` + Staff []YclientsServiceStaff `json:"staff"` + Deleted bool `json:"deleted"` + CreatedAt time.Time `json:"createdAt"` +} + +type YclientsServiceStaff struct { + ID int `json:"id"` + SeanceLength int `json:"seance_length"` +} +type ServicesListYclientsResp struct { + Count int64 `json:"count"` + Items []YclientsServices `json:"items"` +} + +type Timeslots struct { + ID int64 `json:"id"` + SalonID int32 `json:"salon_id"` // ID "аккаунта который ГЛАВНЫЙ" + // ниже то что используется в запросе + IsEnabled bool `json:"is_enabled"` + WeekdaysSettings []WeekdaySetting `json:"weekdays_settings"` + DatesSettings []DateSetting `json:"dates_settings"` + // выше то что используется в запросе + Deleted bool `json:"deleted"` + CreatedAt time.Time `json:"createdAt"` +} + +type WeekdaySetting struct { + Weekday int `json:"weekday"` + Timeslots []int `json:"timeslots"` + Setting GridSetting `json:"setting"` +} + +type DateSetting struct { + Date string `json:"date"` + Timeslots []int `json:"timeslots"` + Setting GridSetting `json:"setting"` +} + +type GridSetting struct { + GridFirstTimeslot int `json:"grid_first_timeslot"` + GridLastTimeslot int `json:"grid_last_timeslot"` + GridDisplayStep int `json:"grid_display_step"` + GridNearestTimeslotDelay int `json:"grid_nearest_timeslot_delay"` + GridBaseType string `json:"grid_base_type"` + IsGridFlexible bool `json:"is_grid_flexible"` +} + +type TimeslotsListYclientsResp struct { + Count int64 `json:"count"` + Items []Timeslots `json:"items"` +} + +type YclientsRule struct { + ID int64 `json:"id"` + SalonID int32 `json:"salon_id"` // ID "аккаунта который ГЛАВНЫЙ" + QuizID int32 `json:"quizID"` // ID квиза на которое вешается правило + StaffID int32 `json:"staffID"` + Services []ServiceYclientsRule `json:"services"` + FieldsRule YclientsFieldRule `json:"fields_rule"` + CustomColor string `json:"custom_color"` + Deleted bool `json:"deleted"` + CreatedAt time.Time `json:"createdAt"` +} + +type YclientsFieldRule struct { + QuestionID map[uint64]int32 `json:"question_id"` +} + +type ServiceYclientsRule struct { + ID int `json:"id"` + FirstCost int `json:"first_cost"` + Discount int `json:"discount"` + Cost float64 `json:"cost"` +} + +type YclientsCustomFieldsType string + +const ( + TypeYclientsText YclientsCustomFieldsType = "text" // строка длиной до 255 символов + TypeYclientsNumber YclientsCustomFieldsType = "number" // число + TypeYclientsSelect YclientsCustomFieldsType = "select" // список + TypeYclientsDate YclientsCustomFieldsType = "date" // Дата (Y-m-d) + TypeYclientsDateTime YclientsCustomFieldsType = "datetime" // Дата и время (Y-m-d H:i:s) +) + +type YclientsField struct { + ID int64 `json:"id"` + YclientsID int32 `json:"yclientsID"` + SalonID int32 `json:"salonID"` + FieldType YclientsCustomFieldsType `json:"field_type"` + Code string `json:"code"` + Title string `json:"title"` + ShowINUI bool `json:"show_in_ui"` + UserCanEdit bool `json:"user_can_edit"` + Deleted bool `json:"deleted"` + CreatedAt time.Time `json:"createdAt"` +} + +type UserListYclientsFieldsResp struct { + Count int64 `json:"count"` + Items []YclientsField `json:"items"` +} + +type YclientsUsersTrueResults struct { + QuizID int64 + AnswerID int64 + Result bool + QuestionID int64 + Content string + Session string + SalonID int32 + UTMs UTMSavingMap + FieldsRule YclientsFieldRule + StaffID int32 + Services []ServiceYclientsRule + CustomColor string + QuizAccountID string + Datetime time.Time // время result ответа +} diff --git a/repository/question/question.go b/repository/question/question.go index 1e7c66e..d22f935 100644 --- a/repository/question/question.go +++ b/repository/question/question.go @@ -5,13 +5,14 @@ import ( "database/sql" "errors" "fmt" - "gitea.pena/SQuiz/common/dal/sqlcgen" - "gitea.pena/SQuiz/common/model" - "github.com/lib/pq" "sort" "strings" "sync" "time" + + "gitea.pena/SQuiz/common/dal/sqlcgen" + "gitea.pena/SQuiz/common/model" + "github.com/lib/pq" ) type Deps struct { @@ -559,3 +560,31 @@ func (r *QuestionRepository) CheckQuestionOwner(ctx context.Context, accountID s } return accountID == id, nil } + +func (r *QuestionRepository) GetQuestionListByQuizID(ctx context.Context, quizID int64) ([]model.Question, error) { + rows, err := r.queries.GetQuestionListByQuizID(ctx, quizID) + if err != nil { + return nil, err + } + var questions []model.Question + for _, row := range rows { + questions = append(questions, model.Question{ + Id: uint64(row.ID), + QuizId: uint64(row.QuizID), + Title: row.Title, + Description: row.Description.String, + Type: string(row.Questiontype.([]byte)), + Required: row.Required.Bool, + Deleted: row.Deleted.Bool, + Page: int(row.Page.Int16), + Content: row.Content.String, + Version: int(row.Version.Int16), + ParentIds: row.ParentIds, + CreatedAt: row.CreatedAt.Time, + UpdatedAt: row.UpdatedAt.Time, + Auditory: row.Auditory, + Session: row.Session, + }) + } + return questions, nil +} diff --git a/repository/yclients/yclients.go b/repository/yclients/yclients.go new file mode 100644 index 0000000..c9a9ddd --- /dev/null +++ b/repository/yclients/yclients.go @@ -0,0 +1,800 @@ +package yclients + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + + "gitea.pena/SQuiz/common/dal/sqlcgen" + "gitea.pena/SQuiz/common/model" +) + +type YclientsRepository struct { + queries *sqlcgen.Queries + pool *sql.DB +} + +type Deps struct { + Queries *sqlcgen.Queries + Pool *sql.DB +} + +func NewYclientsRepository(deps Deps) *YclientsRepository { + return &YclientsRepository{ + queries: deps.Queries, + pool: deps.Pool, + } +} + +// users +func (r *YclientsRepository) GetCurrentAccount(ctx context.Context, accountID string) (*model.YclientsAccount, error) { + row, err := r.queries.GetCurrentYclientsCompany(ctx, accountID) + if err != nil { + return nil, err + } + + user := model.YclientsAccount{ + ID: row.ID, + AccountID: row.Accountid, + SalonID: row.Salonid, + Title: row.Title, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + } + + return &user, nil +} + +func (r *YclientsRepository) GetAllYclientsAccounts(ctx context.Context) ([]model.YclientsAccount, error) { + rows, err := r.queries.GetAllYclientsAccounts(ctx) + if err != nil { + return nil, err + } + var result []model.YclientsAccount + for _, row := range rows { + result = append(result, model.YclientsAccount{ + ID: row.ID, + AccountID: row.Accountid, + SalonID: row.Salonid, + Title: row.Title, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + }) + } + return result, nil +} + +func (r *YclientsRepository) GettingUserWithPagination(ctx context.Context, req *model.PaginationReq, accountID string) (*model.UserListYclientsResp, error) { + rows, err := r.queries.GetUsersYclientsWithPagination(ctx, sqlcgen.GetUsersYclientsWithPaginationParams{ + Accountid: accountID, + Column2: req.Page, + Limit: req.Size, + }) + if err != nil { + return nil, err + } + var users []model.YclientsAccountUser + var count int64 + for _, row := range rows { + users = append(users, model.YclientsAccountUser{ + ID: row.ID, + SalonID: row.Salonid, + YclientsID: row.Yclientsid, + Name: row.Name, + IDPosition: row.Idposition, + TitlePosition: row.Titleposition, + Fired: row.Fired, + Status: row.Status, + Hidden: row.Hidden, + YclientsUserID: row.Yclientsuserid, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + }) + count = row.TotalCount + } + + resp := model.UserListYclientsResp{ + Count: count, + Items: users, + } + + return &resp, nil +} + +func (r *YclientsRepository) CreateAccount(ctx context.Context, account model.YclientsAccount) (*model.YclientsAccount, error) { + row, err := r.queries.CreateYclientsAccount(ctx, sqlcgen.CreateYclientsAccountParams{ + Accountid: account.AccountID, + Salonid: account.SalonID, + Title: account.Title, + }) + if err != nil { + return nil, err + } + + return &model.YclientsAccount{ + ID: row.ID, + AccountID: row.Accountid, + SalonID: row.Salonid, + Title: row.Title, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + }, nil + +} + +func (r *YclientsRepository) GetUserUsersByID(ctx context.Context, salonID int32) ([]model.YclientsAccountUser, error) { + rows, err := r.queries.GetUsersByIDYclients(ctx, salonID) + if err != nil { + return nil, err + } + var users []model.YclientsAccountUser + for _, row := range rows { + users = append(users, model.YclientsAccountUser{ + ID: row.ID, + SalonID: row.Salonid, + YclientsID: row.Yclientsid, + Name: row.Name, + IDPosition: row.Idposition, + TitlePosition: row.Titleposition, + Fired: row.Fired, + Status: row.Status, + Hidden: row.Hidden, + YclientsUserID: row.Yclientsuserid, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + }) + } + return users, nil +} + +func (r *YclientsRepository) UpdateAccountUser(ctx context.Context, user model.YclientsAccountUser) error { + err := r.queries.UpdateYclientsAccountUser(ctx, sqlcgen.UpdateYclientsAccountUserParams{ + Salonid: user.SalonID, + Yclientsid: user.YclientsID, + Name: user.Name, + Specialization: user.Specialization, + Idposition: user.IDPosition, + Titleposition: user.TitlePosition, + Fired: user.Fired, + Status: user.Status, + Hidden: user.Hidden, + }) + if err != nil { + return err + } + return nil +} + +func (r *YclientsRepository) AddAccountUser(ctx context.Context, user model.YclientsAccountUser) error { + err := r.queries.AddYclientsAccountUser(ctx, sqlcgen.AddYclientsAccountUserParams{ + Salonid: user.SalonID, + Yclientsid: user.YclientsID, + Name: user.Name, + Specialization: user.Specialization, + Idposition: user.IDPosition, + Titleposition: user.TitlePosition, + Fired: user.Fired, + Status: user.Status, + Hidden: user.Hidden, + Yclientsuserid: user.YclientsUserID, + }) + if err != nil { + return err + } + return nil +} + +func (r *YclientsRepository) DeleteUsers(ctx context.Context, ids []int64) error { + err := r.queries.DeleteYclientsUsers(ctx, ids) + if err != nil { + return err + } + return nil +} + +func (r *YclientsRepository) SoftDeleteAccount(ctx context.Context, accountID string) error { + err := r.queries.SoftDeleteYclientsAccount(ctx, accountID) + if err != nil { + return err + } + return nil +} + +// company +//func (r *YclientsRepository) GettingCompanyWithPagination(ctx context.Context, req *model.PaginationReq, accountID string) (*model.CompanyListYclientsResp, error) { +// rows, err := r.queries.GetCompanyYclientsWithPagination(ctx, sqlcgen.GetCompanyYclientsWithPaginationParams{ +// Accountid: accountID, +// Column2: req.Page, +// Limit: req.Size, +// }) +// if err != nil { +// return nil, err +// } +// var users []model.YclientsCompany +// var count int64 +// for _, row := range rows { +// users = append(users, model.YclientsCompany{ +// ID: row.ID, +// SalonID: row.Salonid, +// Title: row.Title, +// ShortDecription: row.Shortdecription, +// Active: row.Active, +// Country: row.Country, +// GroupPriority: row.Grouppriority, +// Deleted: row.Deleted, +// CreatedAt: row.Createdat, +// }) +// count = row.TotalCount +// } +// +// resp := model.CompanyListYclientsResp{ +// Count: count, +// Items: users, +// } +// +// return &resp, nil +//} +// +//func (r *YclientsRepository) UpdateCompany() { +// +//} + +// services + +func (r *YclientsRepository) GettingServicesWithPagination(ctx context.Context, req *model.PaginationReq, accountID string) (*model.ServicesListYclientsResp, error) { + rows, err := r.queries.GetServicesYclientsWithPagination(ctx, sqlcgen.GetServicesYclientsWithPaginationParams{ + Accountid: accountID, + Column2: req.Page, + Limit: req.Size, + }) + if err != nil { + return nil, err + } + var services []model.YclientsServices + var count int64 + for _, row := range rows { + var staff []model.YclientsServiceStaff + err = json.Unmarshal(row.Staff, &staff) + if err != nil { + return nil, err + } + + services = append(services, model.YclientsServices{ + ID: row.ID, + SalonID: row.Salonid, + ServiceID: row.Serviceid, + SalonServiceID: row.Salonserviceid, + Title: row.Title, + CategoryID: row.Categoryid, + PriceMin: row.Pricemin, + PriceMax: row.Pricemax, + Discount: row.Discount, + Comment: row.Comment, + Active: row.Active, + ApiID: row.Apiid, + Staff: staff, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + }) + count = row.TotalCount + } + + resp := model.ServicesListYclientsResp{ + Count: count, + Items: services, + } + + return &resp, nil +} + +func (r *YclientsRepository) GetAccountServicesByID(ctx context.Context, salonID int32) ([]model.YclientsServices, error) { + rows, err := r.queries.GetServicesByIDYclients(ctx, salonID) + if err != nil { + return nil, err + } + var services []model.YclientsServices + for _, row := range rows { + var staff []model.YclientsServiceStaff + err = json.Unmarshal(row.Staff, &staff) + if err != nil { + return nil, err + } + + services = append(services, model.YclientsServices{ + ID: row.ID, + SalonID: row.Salonid, + ServiceID: row.Serviceid, + SalonServiceID: row.Salonserviceid, + Title: row.Title, + CategoryID: row.Categoryid, + PriceMin: row.Pricemin, + PriceMax: row.Pricemax, + Discount: row.Discount, + Comment: row.Comment, + Active: row.Active, + ApiID: row.Apiid, + Staff: staff, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + }) + } + return services, nil +} + +func (r *YclientsRepository) UpdateAccountServices(ctx context.Context, service model.YclientsServices) error { + staff, err := json.Marshal(service.Staff) + if err != nil { + return err + } + err = r.queries.UpdateYclientsAccountServices(ctx, sqlcgen.UpdateYclientsAccountServicesParams{ + Salonid: service.SalonID, + Serviceid: service.ServiceID, + Salonserviceid: service.SalonServiceID, + Title: service.Title, + Categoryid: service.CategoryID, + Pricemin: service.PriceMin, + Pricemax: service.PriceMax, + Discount: service.Discount, + Comment: service.Comment, + Active: service.Active, + Apiid: service.ApiID, + Staff: staff, + }) + if err != nil { + return err + } + return nil +} + +func (r *YclientsRepository) AddAccountService(ctx context.Context, service model.YclientsServices) error { + staff, err := json.Marshal(service.Staff) + if err != nil { + return err + } + + err = r.queries.AddYclientsAccountService(ctx, sqlcgen.AddYclientsAccountServiceParams{ + Salonid: service.SalonID, + Serviceid: service.ServiceID, + Salonserviceid: service.SalonServiceID, + Title: service.Title, + Categoryid: service.CategoryID, + Pricemin: service.PriceMin, + Pricemax: service.PriceMax, + Discount: service.Discount, + Comment: service.Comment, + Active: service.Active, + Apiid: service.ApiID, + Staff: staff, + }) + if err != nil { + return err + } + return nil +} + +func (r *YclientsRepository) DeleteServices(ctx context.Context, ids []int64) error { + err := r.queries.DeleteYclientsServices(ctx, ids) + if err != nil { + return err + } + return nil +} + +// timeslots + +func (r *YclientsRepository) GettingTimeslotsWithPagination(ctx context.Context, req *model.PaginationReq, accountID string) (*model.TimeslotsListYclientsResp, error) { + rows, err := r.queries.GetTimeslotsYclientsWithPagination(ctx, sqlcgen.GetTimeslotsYclientsWithPaginationParams{ + Accountid: accountID, + Column2: req.Page, + Limit: req.Size, + }) + if err != nil { + return nil, err + } + var timeslots []model.Timeslots + var count int64 + for _, row := range rows { + var weekdaysSettings []model.WeekdaySetting + err = json.Unmarshal(row.Weekdayssettings, &weekdaysSettings) + if err != nil { + return nil, err + } + + var datesSettings []model.DateSetting + err = json.Unmarshal(row.Datessettings, &datesSettings) + if err != nil { + return nil, err + } + + timeslots = append(timeslots, model.Timeslots{ + ID: row.ID, + SalonID: row.Salonid, + IsEnabled: row.Isenabled, + WeekdaysSettings: weekdaysSettings, + DatesSettings: datesSettings, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + }) + count = row.TotalCount + } + + resp := model.TimeslotsListYclientsResp{ + Count: count, + Items: timeslots, + } + + return &resp, nil +} + +func (r *YclientsRepository) UpdateAccountTimeslots(ctx context.Context, salonID int32, timeslots model.Timeslots) error { + weekdaysSettings, err := json.Marshal(timeslots.WeekdaysSettings) + if err != nil { + return err + } + + datesSettings, err := json.Marshal(timeslots.DatesSettings) + if err != nil { + return err + } + + err = r.queries.UpdateYclientsAccountTimeslots(ctx, sqlcgen.UpdateYclientsAccountTimeslotsParams{ + Salonid: salonID, + Isenabled: timeslots.IsEnabled, + Weekdayssettings: weekdaysSettings, + Datessettings: datesSettings, + }) + if err != nil { + return err + } + return nil +} + +func (r *YclientsRepository) AddAccountTimeslots(ctx context.Context, salonID int32, timeslots model.Timeslots) (int64, error) { + weekdaysSettings, err := json.Marshal(timeslots.WeekdaysSettings) + if err != nil { + return 0, err + } + + datesSettings, err := json.Marshal(timeslots.DatesSettings) + if err != nil { + return 0, err + } + + row, err := r.queries.AddYclientsAccountTimeslots(ctx, sqlcgen.AddYclientsAccountTimeslotsParams{ + Salonid: salonID, + Isenabled: timeslots.IsEnabled, + Weekdayssettings: weekdaysSettings, + Datessettings: datesSettings, + }) + if err != nil { + return 0, err + } + return row.ID, nil +} + +func (r *YclientsRepository) DeleteTimeslots(ctx context.Context, ids []int64) error { + err := r.queries.DeleteYclientsTimeslots(ctx, ids) + if err != nil { + return err + } + return nil +} + +func (r *YclientsRepository) GetAccountTimeslotsByID(ctx context.Context, salonID int32) (*model.Timeslots, error) { + row, err := r.queries.GetTimeslotsByIDYclients(ctx, salonID) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return nil, err + } + + var weekdaysSettings []model.WeekdaySetting + err = json.Unmarshal(row.Weekdayssettings, &weekdaysSettings) + if err != nil { + return nil, err + + } + + var datesSettings []model.DateSetting + err = json.Unmarshal(row.Datessettings, &datesSettings) + if err != nil { + return nil, err + } + + return &model.Timeslots{ + ID: row.ID, + SalonID: row.Salonid, + IsEnabled: row.Isenabled, + WeekdaysSettings: weekdaysSettings, + DatesSettings: datesSettings, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + }, nil +} + +// rule + +func (r *YclientsRepository) GettingQuizRules(ctx context.Context, quizID int32) (*model.YclientsRule, error) { + row, err := r.queries.GetYclientsQuizRule(ctx, quizID) + if err != nil { + return nil, err + } + + var services []model.ServiceYclientsRule + err = json.Unmarshal(row.Services, &services) + if err != nil { + return nil, err + } + + var fieldsRule model.YclientsFieldRule + err = json.Unmarshal(row.Fieldsrule, &fieldsRule) + if err != nil { + return nil, err + } + + return &model.YclientsRule{ + ID: row.ID, + SalonID: row.Salonid, + QuizID: row.Quizid, + Services: services, + FieldsRule: fieldsRule, + CustomColor: row.Customcolor, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + StaffID: row.Staffid, + }, nil +} + +func (r *YclientsRepository) SetQuizSettings(ctx context.Context, rule model.YclientsRule, accountID string) error { + jsonServices, err := json.Marshal(rule.Services) + if err != nil { + return err + } + jsonFieldsRule, err := json.Marshal(rule.FieldsRule) + if err != nil { + return err + } + _, err = r.queries.SetYclientsQuizSettings(ctx, sqlcgen.SetYclientsQuizSettingsParams{ + Quizid: rule.QuizID, + Staffid: rule.StaffID, + Services: jsonServices, + Fieldsrule: jsonFieldsRule, + Customcolor: rule.CustomColor, + Accountid: accountID, + }) + + if err != nil { + return err + } + + return nil +} + +func (r *YclientsRepository) ChangeQuizSettings(ctx context.Context, rule model.YclientsRule, accountID string) error { + jsonServices, err := json.Marshal(rule.Services) + if err != nil { + return err + } + jsonFieldsRule, err := json.Marshal(rule.FieldsRule) + if err != nil { + return err + } + _, err = r.queries.ChangeYclientsQuizSettings(ctx, sqlcgen.ChangeYclientsQuizSettingsParams{ + Quizid: rule.QuizID, + Staffid: rule.StaffID, + Services: jsonServices, + Fieldsrule: jsonFieldsRule, + Customcolor: rule.CustomColor, + Accountid: accountID, + }) + + if err != nil { + return err + } + + return nil +} + +func (r *YclientsRepository) UpdateFieldRules(ctx context.Context, fieldRules model.YclientsFieldRule, salonID int32, quizID int32) error { + jsonFieldsRule, err := json.Marshal(fieldRules) + if err != nil { + return err + } + err = r.queries.UpdateYclientsFieldRules(ctx, sqlcgen.UpdateYclientsFieldRulesParams{ + Fieldsrule: jsonFieldsRule, + Salonid: salonID, + Quizid: quizID, + }) + + if err != nil { + return err + } + + return nil +} + +// fields +func (r *YclientsRepository) GetFieldsWithPagination(ctx context.Context, req *model.PaginationReq, accountID string) (*model.UserListYclientsFieldsResp, error) { + rows, err := r.queries.GetYclientsFieldsWithPagination(ctx, sqlcgen.GetYclientsFieldsWithPaginationParams{ + Accountid: accountID, + Column2: req.Page, + Limit: req.Size, + }) + if err != nil { + return nil, err + } + + var count int64 + var fields []model.YclientsField + + for _, row := range rows { + count = row.TotalCount + + var fieldType model.YclientsCustomFieldsType + f := string(row.Fieldtype.([]byte)) + fieldType = model.YclientsCustomFieldsType(f) + + fields = append(fields, model.YclientsField{ + ID: row.ID, + YclientsID: row.Yclientsid, + SalonID: row.Salonid, + FieldType: fieldType, + Code: row.Code, + Title: row.Title, + ShowINUI: row.Showinui, + UserCanEdit: row.Usercanedit, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + }) + } + + resp := model.UserListYclientsFieldsResp{ + Count: count, + Items: fields, + } + + return &resp, nil +} + +func (r *YclientsRepository) AddAccountField(ctx context.Context, field model.YclientsField) error { + err := r.queries.AddYclientsAccountField(ctx, sqlcgen.AddYclientsAccountFieldParams{ + Yclientsid: field.YclientsID, + Salonid: field.SalonID, + Fieldtype: field.FieldType, + Code: field.Code, + Title: field.Title, + Showinui: field.ShowINUI, + Usercanedit: field.UserCanEdit, + }) + if err != nil { + return err + } + return nil +} + +func (r *YclientsRepository) UpdateAccountFields(ctx context.Context, salonID int32, field model.YclientsField) error { + err := r.queries.UpdateYclientsAccountFields(ctx, sqlcgen.UpdateYclientsAccountFieldsParams{ + Salonid: salonID, + Yclientsid: field.YclientsID, + Fieldtype: field.FieldType, + Code: field.Code, + Title: field.Title, + Showinui: field.ShowINUI, + Usercanedit: field.UserCanEdit, + }) + if err != nil { + return err + } + return nil +} + +func (r *YclientsRepository) GetUserFieldsByID(ctx context.Context, salonID int32) ([]model.YclientsField, error) { + rows, err := r.queries.GetUserYclientsFieldsByID(ctx, salonID) + if err != nil { + return nil, err + } + var fields []model.YclientsField + for _, row := range rows { + var fieldType model.YclientsCustomFieldsType + f := string(row.Fieldtype.([]byte)) + fieldType = model.YclientsCustomFieldsType(f) + + fields = append(fields, model.YclientsField{ + ID: row.ID, + YclientsID: row.Yclientsid, + SalonID: row.Salonid, + FieldType: fieldType, + Code: row.Code, + Title: row.Title, + ShowINUI: row.Showinui, + UserCanEdit: row.Usercanedit, + Deleted: row.Deleted, + CreatedAt: row.Createdat, + }) + } + return fields, nil +} + +func (r *YclientsRepository) DeleteFields(ctx context.Context, ids []int64) error { + err := r.queries.DeleteYclientsFields(ctx, ids) + if err != nil { + return err + } + return nil +} + +// true results fetch +// todo нужно хорошенько проверить +func (r *YclientsRepository) GettingYclientsUsersTrueResults(ctx context.Context) ([]model.YclientsUsersTrueResults, error) { + rows, err := r.queries.GettingYclientsUsersTrueResults(ctx) + if err != nil { + return nil, err + } + + var results []model.YclientsUsersTrueResults + + for _, row := range rows { + var fieldsRule model.YclientsFieldRule + err = json.Unmarshal(row.Fieldsrule, &fieldsRule) + if err != nil { + return nil, err + } + + var utms model.UTMSavingMap + err = json.Unmarshal(row.Utm.([]byte), &utms) + if err != nil { + return nil, err + } + + var services []model.ServiceYclientsRule + err = json.Unmarshal(row.Services, &services) + if err != nil { + return nil, err + } + + result := model.YclientsUsersTrueResults{ + QuizID: row.QuizID, + AnswerID: row.AnswerID, + Result: row.Result.Bool, + QuestionID: row.QuestionID, + Content: row.Content.String, + Session: row.Session.String, + SalonID: row.Salonid, + UTMs: utms, + FieldsRule: fieldsRule, + StaffID: row.Staffid, + Services: services, + CustomColor: row.Customcolor, + QuizAccountID: row.QuizAccountid, + Datetime: row.Datetime.Time, + } + + results = append(results, result) + } + + return results, nil +} + +type SaveDealYclientsDeps struct { + RecordID int32 + AnswerID int64 + Status string + SalonID int32 +} + +func (r *YclientsRepository) SaveDealYclientsStatus(ctx context.Context, deps SaveDealYclientsDeps) error { + err := r.queries.SaveDealYclientsStatus(ctx, sqlcgen.SaveDealYclientsStatusParams{ + Recordid: deps.RecordID, + Answerid: deps.AnswerID, + Status: deps.Status, + Salonid: deps.SalonID, + }) + + if err != nil { + return err + } + + return nil +} diff --git a/sqlc.yaml b/sqlc.yaml index e99b38e..3637b8b 100644 --- a/sqlc.yaml +++ b/sqlc.yaml @@ -58,6 +58,8 @@ packages: - "./dal/schema/000027_init.down.sql" - "./dal/schema/000028_init.up.sql" - "./dal/schema/000028_init.down.sql" + - "./dal/schema/000029_init.up.sql" + - "./dal/schema/000029_init.down.sql" engine: "postgresql" emit_json_tags: true emit_db_tags: true