add campaign
deploy to danak / build_and_deploy (push) Has been cancelled

This commit is contained in:
2026-07-04 09:40:28 +03:30
parent 9eebfbfb10
commit 95240a311e
5 changed files with 958 additions and 15 deletions
+907 -15
View File
@@ -961,6 +961,18 @@
"default": "0", "default": "0",
"mappedType": "decimal" "mappedType": "decimal"
}, },
"credit": {
"name": "credit",
"type": "numeric(10,0)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"precision": 10,
"scale": 0,
"default": "0",
"mappedType": "decimal"
},
"domain": { "domain": {
"name": "domain", "name": "domain",
"type": "varchar(255)", "type": "varchar(255)",
@@ -2905,6 +2917,394 @@
}, },
"nativeEnums": {} "nativeEnums": {}
}, },
{
"columns": {
"id": {
"name": "id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
},
"created_at": {
"name": "created_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"updated_at": {
"name": "updated_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"deleted_at": {
"name": "deleted_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 6,
"mappedType": "datetime"
},
"restaurant_id": {
"name": "restaurant_id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
},
"title": {
"name": "title",
"type": "varchar(255)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 255,
"mappedType": "string"
},
"groups": {
"name": "groups",
"type": "jsonb",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "'[]'",
"mappedType": "json"
},
"sent_type": {
"name": "sent_type",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"enumItems": [
"push",
"sms"
],
"mappedType": "enum"
},
"discount_code": {
"name": "discount_code",
"type": "varchar(255)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 255,
"mappedType": "string"
},
"total_count": {
"name": "total_count",
"type": "int",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "0",
"mappedType": "integer"
},
"total_cost": {
"name": "total_cost",
"type": "int",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "0",
"mappedType": "integer"
},
"refunded": {
"name": "refunded",
"type": "int",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "0",
"mappedType": "integer"
},
"sent_count": {
"name": "sent_count",
"type": "int",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "0",
"mappedType": "integer"
},
"failed_count": {
"name": "failed_count",
"type": "int",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "0",
"mappedType": "integer"
},
"status": {
"name": "status",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "'sending'",
"enumItems": [
"sending",
"completed"
],
"mappedType": "enum"
}
},
"name": "campaigns",
"schema": "public",
"indexes": [
{
"keyName": "campaigns_created_at_index",
"columnNames": [
"created_at"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "campaigns_deleted_at_index",
"columnNames": [
"deleted_at"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "campaigns_restaurant_id_index",
"columnNames": [
"restaurant_id"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "campaigns_pkey",
"columnNames": [
"id"
],
"composite": false,
"constraint": true,
"primary": true,
"unique": true
}
],
"checks": [],
"foreignKeys": {
"campaigns_restaurant_id_foreign": {
"constraintName": "campaigns_restaurant_id_foreign",
"columnNames": [
"restaurant_id"
],
"localTableName": "public.campaigns",
"referencedColumnNames": [
"id"
],
"referencedTableName": "public.restaurants",
"updateRule": "cascade"
}
},
"nativeEnums": {}
},
{
"columns": {
"id": {
"name": "id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
},
"created_at": {
"name": "created_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"updated_at": {
"name": "updated_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"deleted_at": {
"name": "deleted_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 6,
"mappedType": "datetime"
},
"restaurant_id": {
"name": "restaurant_id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
},
"amount": {
"name": "amount",
"type": "numeric(10,0)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"precision": 10,
"scale": 0,
"mappedType": "decimal"
},
"balance": {
"name": "balance",
"type": "numeric(10,0)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"precision": 10,
"scale": 0,
"mappedType": "decimal"
},
"type": {
"name": "type",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"enumItems": [
"credit",
"debit"
],
"mappedType": "enum"
},
"reason": {
"name": "reason",
"type": "text",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"enumItems": [
"sms_send",
"deposit",
"adjustment"
],
"mappedType": "enum"
}
},
"name": "restaurant_credit_transactions",
"schema": "public",
"indexes": [
{
"keyName": "restaurant_credit_transactions_created_at_index",
"columnNames": [
"created_at"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "restaurant_credit_transactions_deleted_at_index",
"columnNames": [
"deleted_at"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "restaurant_credit_transactions_restaurant_id_index",
"columnNames": [
"restaurant_id"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "restaurant_credit_transactions_pkey",
"columnNames": [
"id"
],
"composite": false,
"constraint": true,
"primary": true,
"unique": true
}
],
"checks": [],
"foreignKeys": {
"restaurant_credit_transactions_restaurant_id_foreign": {
"constraintName": "restaurant_credit_transactions_restaurant_id_foreign",
"columnNames": [
"restaurant_id"
],
"localTableName": "public.restaurant_credit_transactions",
"referencedColumnNames": [
"id"
],
"referencedTableName": "public.restaurants",
"updateRule": "cascade"
}
},
"nativeEnums": {}
},
{ {
"columns": { "columns": {
"id": { "id": {
@@ -3433,6 +3833,183 @@
"foreignKeys": {}, "foreignKeys": {},
"nativeEnums": {} "nativeEnums": {}
}, },
{
"columns": {
"id": {
"name": "id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
},
"created_at": {
"name": "created_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"updated_at": {
"name": "updated_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"deleted_at": {
"name": "deleted_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 6,
"mappedType": "datetime"
},
"restaurant_id": {
"name": "restaurant_id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
},
"image_url": {
"name": "image_url",
"type": "varchar(255)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 255,
"mappedType": "string"
},
"title": {
"name": "title",
"type": "varchar(255)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 255,
"mappedType": "string"
},
"link": {
"name": "link",
"type": "varchar(255)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 255,
"mappedType": "string"
},
"order": {
"name": "order",
"type": "int",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "0",
"mappedType": "integer"
},
"is_active": {
"name": "is_active",
"type": "boolean",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "true",
"mappedType": "boolean"
}
},
"name": "sliders",
"schema": "public",
"indexes": [
{
"keyName": "sliders_created_at_index",
"columnNames": [
"created_at"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "sliders_deleted_at_index",
"columnNames": [
"deleted_at"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "sliders_restaurant_id_index",
"columnNames": [
"restaurant_id"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "sliders_restaurant_id_is_active_index",
"columnNames": [
"restaurant_id",
"is_active"
],
"composite": true,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "sliders_pkey",
"columnNames": [
"id"
],
"composite": false,
"constraint": true,
"primary": true,
"unique": true
}
],
"checks": [],
"foreignKeys": {
"sliders_restaurant_id_foreign": {
"constraintName": "sliders_restaurant_id_foreign",
"columnNames": [
"restaurant_id"
],
"localTableName": "public.sliders",
"referencedColumnNames": [
"id"
],
"referencedTableName": "public.restaurants",
"updateRule": "cascade"
}
},
"nativeEnums": {}
},
{ {
"columns": { "columns": {
"id": { "id": {
@@ -3454,30 +4031,30 @@
"length": 26, "length": 26,
"mappedType": "character" "mappedType": "character"
}, },
"phone": { "count": {
"name": "phone", "name": "count",
"type": "varchar(255)", "type": "int",
"unsigned": false, "unsigned": false,
"autoincrement": false, "autoincrement": false,
"primary": false, "primary": false,
"nullable": false, "nullable": false,
"length": 255, "default": "0",
"mappedType": "string" "mappedType": "integer"
},
"created_at": {
"name": "created_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"mappedType": "datetime"
} }
}, },
"name": "sms_logs", "name": "sms_logs",
"schema": "public", "schema": "public",
"indexes": [ "indexes": [
{
"columnNames": [
"restaurant_id"
],
"composite": false,
"keyName": "sms_logs_restaurant_id_unique",
"constraint": true,
"primary": false,
"unique": true
},
{ {
"keyName": "sms_logs_pkey", "keyName": "sms_logs_pkey",
"columnNames": [ "columnNames": [
@@ -4296,6 +4873,15 @@
"default": "0", "default": "0",
"mappedType": "decimal" "mappedType": "decimal"
}, },
"prepare_time": {
"name": "prepare_time",
"type": "int",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"mappedType": "integer"
},
"total": { "total": {
"name": "total", "name": "total",
"type": "numeric(10,0)", "type": "numeric(10,0)",
@@ -5699,6 +6285,312 @@
}, },
"nativeEnums": {} "nativeEnums": {}
}, },
{
"columns": {
"id": {
"name": "id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
},
"created_at": {
"name": "created_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"updated_at": {
"name": "updated_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"deleted_at": {
"name": "deleted_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 6,
"mappedType": "datetime"
},
"restaurant_id": {
"name": "restaurant_id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
},
"name": {
"name": "name",
"type": "varchar(255)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 255,
"mappedType": "string"
},
"count": {
"name": "count",
"type": "int",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"default": "0",
"mappedType": "integer"
}
},
"name": "user_groups",
"schema": "public",
"indexes": [
{
"keyName": "user_groups_created_at_index",
"columnNames": [
"created_at"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "user_groups_deleted_at_index",
"columnNames": [
"deleted_at"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "user_groups_restaurant_id_index",
"columnNames": [
"restaurant_id"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "user_groups_restaurant_id_name_unique",
"columnNames": [
"restaurant_id",
"name"
],
"composite": true,
"constraint": true,
"primary": false,
"unique": true
},
{
"keyName": "user_groups_pkey",
"columnNames": [
"id"
],
"composite": false,
"constraint": true,
"primary": true,
"unique": true
}
],
"checks": [],
"foreignKeys": {
"user_groups_restaurant_id_foreign": {
"constraintName": "user_groups_restaurant_id_foreign",
"columnNames": [
"restaurant_id"
],
"localTableName": "public.user_groups",
"referencedColumnNames": [
"id"
],
"referencedTableName": "public.restaurants",
"updateRule": "cascade"
}
},
"nativeEnums": {}
},
{
"columns": {
"id": {
"name": "id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
},
"created_at": {
"name": "created_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"updated_at": {
"name": "updated_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 6,
"default": "now()",
"mappedType": "datetime"
},
"deleted_at": {
"name": "deleted_at",
"type": "timestamptz",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": true,
"length": 6,
"mappedType": "datetime"
},
"user_id": {
"name": "user_id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
},
"user_group_id": {
"name": "user_group_id",
"type": "char(26)",
"unsigned": false,
"autoincrement": false,
"primary": false,
"nullable": false,
"length": 26,
"mappedType": "character"
}
},
"name": "user_group_users",
"schema": "public",
"indexes": [
{
"keyName": "user_group_users_created_at_index",
"columnNames": [
"created_at"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "user_group_users_deleted_at_index",
"columnNames": [
"deleted_at"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "user_group_users_user_id_index",
"columnNames": [
"user_id"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "user_group_users_user_group_id_index",
"columnNames": [
"user_group_id"
],
"composite": false,
"constraint": false,
"primary": false,
"unique": false
},
{
"keyName": "user_group_users_user_id_user_group_id_unique",
"columnNames": [
"user_id",
"user_group_id"
],
"composite": true,
"constraint": true,
"primary": false,
"unique": true
},
{
"keyName": "user_group_users_pkey",
"columnNames": [
"id"
],
"composite": false,
"constraint": true,
"primary": true,
"unique": true
}
],
"checks": [],
"foreignKeys": {
"user_group_users_user_id_foreign": {
"constraintName": "user_group_users_user_id_foreign",
"columnNames": [
"user_id"
],
"localTableName": "public.user_group_users",
"referencedColumnNames": [
"id"
],
"referencedTableName": "public.users",
"updateRule": "cascade"
},
"user_group_users_user_group_id_foreign": {
"constraintName": "user_group_users_user_group_id_foreign",
"columnNames": [
"user_group_id"
],
"localTableName": "public.user_group_users",
"referencedColumnNames": [
"id"
],
"referencedTableName": "public.user_groups",
"updateRule": "cascade"
}
},
"nativeEnums": {}
},
{ {
"columns": { "columns": {
"id": { "id": {
@@ -0,0 +1,41 @@
import { Migration } from '@mikro-orm/migrations';
export class Migration20260704100000_addCampaignsTable extends Migration {
override async up(): Promise<void> {
this.addSql(`
create table "campaigns" (
"id" char(26) not null,
"created_at" timestamptz not null default now(),
"updated_at" timestamptz not null default now(),
"deleted_at" timestamptz null,
"restaurant_id" char(26) not null,
"title" varchar(255) not null,
"groups" jsonb not null default '[]',
"sent_type" text check ("sent_type" in ('push', 'sms')) not null,
"discount_code" varchar(255) not null,
"total_count" int not null default 0,
"total_cost" int not null default 0,
"refunded" int not null default 0,
"sent_count" int not null default 0,
"failed_count" int not null default 0,
"status" text check ("status" in ('sending', 'completed')) not null default 'sending',
constraint "campaigns_pkey" primary key ("id")
);
`);
this.addSql(`create index "campaigns_created_at_index" on "campaigns" ("created_at");`);
this.addSql(`create index "campaigns_deleted_at_index" on "campaigns" ("deleted_at");`);
this.addSql(`create index "campaigns_restaurant_id_index" on "campaigns" ("restaurant_id");`);
this.addSql(`
alter table "campaigns"
add constraint "campaigns_restaurant_id_foreign"
foreign key ("restaurant_id") references "restaurants" ("id") on update cascade;
`);
}
override async down(): Promise<void> {
this.addSql(`alter table "campaigns" drop constraint if exists "campaigns_restaurant_id_foreign";`);
this.addSql(`drop table if exists "campaigns" cascade;`);
}
}
@@ -24,6 +24,12 @@ export class Campaign extends BaseEntity {
@Property({ default: 0 }) @Property({ default: 0 })
totalCount: number = 0; totalCount: number = 0;
@Property({ default: 0 })
totalCost: number = 0;
@Property({ default: 0 })
refunded: number = 0;
@Property({ default: 0 }) @Property({ default: 0 })
sentCount: number = 0; sentCount: number = 0;
@@ -61,6 +61,7 @@ export class CampaignDispatchListener {
reason: RestaurantCreditTransactionReason.ADJUSTMENT, reason: RestaurantCreditTransactionReason.ADJUSTMENT,
em, em,
}); });
campaign.refunded = refundAmount;
} }
} }
@@ -54,6 +54,8 @@ export class CampaignService {
discountCode: dto.discountCode, discountCode: dto.discountCode,
status: dto.sentType === CampaignSentType.SMS ? CampaignStatus.SENDING : CampaignStatus.COMPLETED, status: dto.sentType === CampaignSentType.SMS ? CampaignStatus.SENDING : CampaignStatus.COMPLETED,
totalCount: 0, totalCount: 0,
totalCost: 0,
refunded: 0,
sentCount: 0, sentCount: 0,
failedCount: 0, failedCount: 0,
}; };
@@ -71,6 +73,7 @@ export class CampaignService {
); );
campaign.totalCount = smsDispatchPlan.totalCount; campaign.totalCount = smsDispatchPlan.totalCount;
campaign.totalCost = smsDispatchPlan.totalCost;
if (smsDispatchPlan.totalCount === 0) { if (smsDispatchPlan.totalCount === 0) {
campaign.status = CampaignStatus.COMPLETED; campaign.status = CampaignStatus.COMPLETED;
} else { } else {