From 6227555671c8a330072994ba83b6dc826a1e8bca Mon Sep 17 00:00:00 2001 From: shancheas Date: Thu, 15 Aug 2024 17:12:35 +0700 Subject: [PATCH] wip: demography data --- src/core/strings/constants/table.constants.ts | 1 + .../1723706764655-add-other-type-item.ts | 85 +++++++++++++++++++ ...723713873756-add-demography-transaction.ts | 23 +++++ ...723716561482-fix-demography-nationality.ts | 55 ++++++++++++ .../transaction/transaction/constants.ts | 5 ++ .../models/transaction-demography.model.ts | 41 +++++++++ .../data/models/transaction.model.ts | 10 ++- .../entities/transaction-graphy.entity.ts | 10 +++ 8 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 src/database/migrations/1723706764655-add-other-type-item.ts create mode 100644 src/database/migrations/1723713873756-add-demography-transaction.ts create mode 100644 src/database/migrations/1723716561482-fix-demography-nationality.ts create mode 100644 src/modules/transaction/transaction/data/models/transaction-demography.model.ts create mode 100644 src/modules/transaction/transaction/domain/entities/transaction-graphy.entity.ts diff --git a/src/core/strings/constants/table.constants.ts b/src/core/strings/constants/table.constants.ts index 7950937..2417a09 100644 --- a/src/core/strings/constants/table.constants.ts +++ b/src/core/strings/constants/table.constants.ts @@ -21,6 +21,7 @@ export enum TABLE_NAME { TRANSACTION = 'transactions', TRANSACTION_ITEM = 'transaction_items', TRANSACTION_TAX = 'transaction_taxes', + TRANSACTION_DEMOGRAPHY = 'transaction_demographies', USER = 'users', USER_PRIVILEGE = 'user_privileges', USER_PRIVILEGE_CONFIGURATION = 'user_privilege_configurations', diff --git a/src/database/migrations/1723706764655-add-other-type-item.ts b/src/database/migrations/1723706764655-add-other-type-item.ts new file mode 100644 index 0000000..b735f75 --- /dev/null +++ b/src/database/migrations/1723706764655-add-other-type-item.ts @@ -0,0 +1,85 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddItemProfit1723706764654 implements MigrationInterface { + name = 'AddOtherType1723706764655'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "items" ADD "breakdown_bundling" boolean NOT NULL DEFAULT false`, + ); + await queryRunner.query( + `ALTER TYPE "public"."item_categories_item_type_enum" RENAME TO "item_categories_item_type_enum_old"`, + ); + await queryRunner.query( + `CREATE TYPE "public"."item_categories_item_type_enum" AS ENUM('tiket masuk', 'wahana', 'bundling', 'free gift', 'other')`, + ); + await queryRunner.query( + `ALTER TABLE "item_categories" ALTER COLUMN "item_type" DROP DEFAULT`, + ); + await queryRunner.query( + `ALTER TABLE "item_categories" ALTER COLUMN "item_type" TYPE "public"."item_categories_item_type_enum" USING "item_type"::"text"::"public"."item_categories_item_type_enum"`, + ); + await queryRunner.query( + `ALTER TABLE "item_categories" ALTER COLUMN "item_type" SET DEFAULT 'tiket masuk'`, + ); + await queryRunner.query( + `DROP TYPE "public"."item_categories_item_type_enum_old"`, + ); + await queryRunner.query( + `ALTER TYPE "public"."items_item_type_enum" RENAME TO "items_item_type_enum_old"`, + ); + await queryRunner.query( + `CREATE TYPE "public"."items_item_type_enum" AS ENUM('tiket masuk', 'wahana', 'bundling', 'free gift', 'other')`, + ); + await queryRunner.query( + `ALTER TABLE "items" ALTER COLUMN "item_type" DROP DEFAULT`, + ); + await queryRunner.query( + `ALTER TABLE "items" ALTER COLUMN "item_type" TYPE "public"."items_item_type_enum" USING "item_type"::"text"::"public"."items_item_type_enum"`, + ); + await queryRunner.query( + `ALTER TABLE "items" ALTER COLUMN "item_type" SET DEFAULT 'tiket masuk'`, + ); + await queryRunner.query(`DROP TYPE "public"."items_item_type_enum_old"`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TYPE "public"."items_item_type_enum_old" AS ENUM('bundling', 'free gift', 'tiket masuk', 'wahana')`, + ); + await queryRunner.query( + `ALTER TABLE "items" ALTER COLUMN "item_type" DROP DEFAULT`, + ); + await queryRunner.query( + `ALTER TABLE "items" ALTER COLUMN "item_type" TYPE "public"."items_item_type_enum_old" USING "item_type"::"text"::"public"."items_item_type_enum_old"`, + ); + await queryRunner.query( + `ALTER TABLE "items" ALTER COLUMN "item_type" SET DEFAULT 'tiket masuk'`, + ); + await queryRunner.query(`DROP TYPE "public"."items_item_type_enum"`); + await queryRunner.query( + `ALTER TYPE "public"."items_item_type_enum_old" RENAME TO "items_item_type_enum"`, + ); + await queryRunner.query( + `CREATE TYPE "public"."item_categories_item_type_enum_old" AS ENUM('bundling', 'free gift', 'tiket masuk', 'wahana')`, + ); + await queryRunner.query( + `ALTER TABLE "item_categories" ALTER COLUMN "item_type" DROP DEFAULT`, + ); + await queryRunner.query( + `ALTER TABLE "item_categories" ALTER COLUMN "item_type" TYPE "public"."item_categories_item_type_enum_old" USING "item_type"::"text"::"public"."item_categories_item_type_enum_old"`, + ); + await queryRunner.query( + `ALTER TABLE "item_categories" ALTER COLUMN "item_type" SET DEFAULT 'tiket masuk'`, + ); + await queryRunner.query( + `DROP TYPE "public"."item_categories_item_type_enum"`, + ); + await queryRunner.query( + `ALTER TYPE "public"."item_categories_item_type_enum_old" RENAME TO "item_categories_item_type_enum"`, + ); + await queryRunner.query( + `ALTER TABLE "items" DROP COLUMN "breakdown_bundling"`, + ); + } +} diff --git a/src/database/migrations/1723713873756-add-demography-transaction.ts b/src/database/migrations/1723713873756-add-demography-transaction.ts new file mode 100644 index 0000000..92c0a88 --- /dev/null +++ b/src/database/migrations/1723713873756-add-demography-transaction.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddDemographyTransaction1723713873756 + implements MigrationInterface +{ + name = 'AddDemographyTransaction1723713873756'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "transaction_demographies" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "man" integer NOT NULL DEFAULT '0', "woman" integer NOT NULL DEFAULT '0', "teen" integer NOT NULL DEFAULT '0', "child" integer NOT NULL DEFAULT '0', "local" integer NOT NULL DEFAULT '0', "foreign" integer NOT NULL DEFAULT '0', "transaction_id" uuid, CONSTRAINT "PK_84083b782ebc2c6cb2a2dab8e2d" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" ADD CONSTRAINT "FK_a2b705884bca06c148e3b35ab04" FOREIGN KEY ("transaction_id") REFERENCES "transactions"("id") ON DELETE CASCADE ON UPDATE CASCADE`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transaction_demographies" DROP CONSTRAINT "FK_a2b705884bca06c148e3b35ab04"`, + ); + await queryRunner.query(`DROP TABLE "transaction_demographies"`); + } +} diff --git a/src/database/migrations/1723716561482-fix-demography-nationality.ts b/src/database/migrations/1723716561482-fix-demography-nationality.ts new file mode 100644 index 0000000..d893bad --- /dev/null +++ b/src/database/migrations/1723716561482-fix-demography-nationality.ts @@ -0,0 +1,55 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class FixDemographyNationality1723716561482 + implements MigrationInterface +{ + name = 'FixDemographyNationality1723716561482'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transaction_demographies" DROP COLUMN "local"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" DROP COLUMN "foreign"`, + ); + await queryRunner.query( + `CREATE TYPE "public"."transaction_demographies_nationality_enum" AS ENUM('local', 'foreign')`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" ADD "nationality" "public"."transaction_demographies_nationality_enum" NOT NULL DEFAULT 'local'`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" DROP CONSTRAINT "FK_a2b705884bca06c148e3b35ab04"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" ADD CONSTRAINT "UQ_a2b705884bca06c148e3b35ab04" UNIQUE ("transaction_id")`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" ADD CONSTRAINT "FK_a2b705884bca06c148e3b35ab04" FOREIGN KEY ("transaction_id") REFERENCES "transactions"("id") ON DELETE CASCADE ON UPDATE CASCADE`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transaction_demographies" DROP CONSTRAINT "FK_a2b705884bca06c148e3b35ab04"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" DROP CONSTRAINT "UQ_a2b705884bca06c148e3b35ab04"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" ADD CONSTRAINT "FK_a2b705884bca06c148e3b35ab04" FOREIGN KEY ("transaction_id") REFERENCES "transactions"("id") ON DELETE CASCADE ON UPDATE CASCADE`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" DROP COLUMN "nationality"`, + ); + await queryRunner.query( + `DROP TYPE "public"."transaction_demographies_nationality_enum"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" ADD "foreign" integer NOT NULL DEFAULT '0'`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_demographies" ADD "local" integer NOT NULL DEFAULT '0'`, + ); + } +} diff --git a/src/modules/transaction/transaction/constants.ts b/src/modules/transaction/transaction/constants.ts index c03e7de..41052f7 100644 --- a/src/modules/transaction/transaction/constants.ts +++ b/src/modules/transaction/transaction/constants.ts @@ -29,3 +29,8 @@ export const TransactionModels = [ TransactionItemModel, TransactionTaxModel, ]; + +export enum DemographyNationality { + LOCAL = 'local', + FOREIGN = 'foreign', +} diff --git a/src/modules/transaction/transaction/data/models/transaction-demography.model.ts b/src/modules/transaction/transaction/data/models/transaction-demography.model.ts new file mode 100644 index 0000000..3e0b00d --- /dev/null +++ b/src/modules/transaction/transaction/data/models/transaction-demography.model.ts @@ -0,0 +1,41 @@ +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { Column, Entity, JoinColumn, OneToOne } from 'typeorm'; +import { BaseCoreModel } from 'src/core/modules/data/model/base-core.model'; +import { TransactionModel } from './transaction.model'; +import { TransactionDemographyEntity } from '../../domain/entities/transaction-graphy.entity'; +import { DemographyNationality } from '../../constants'; + +@Entity(TABLE_NAME.TRANSACTION_DEMOGRAPHY) +export class TransactionDemographyModel + extends BaseCoreModel + implements TransactionDemographyEntity +{ + @Column('int', { default: 0 }) + man: number; + + @Column('int', { default: 0 }) + woman: number; + + @Column('int', { default: 0 }) + teen: number; + + @Column('int', { default: 0 }) + child: number; + + @Column('enum', { + name: 'nationality', + enum: DemographyNationality, + default: DemographyNationality.LOCAL, + }) + nationality: DemographyNationality; + + @Column('varchar', { name: 'transaction_id', nullable: true }) + transaction_id: string; + + @OneToOne(() => TransactionModel, (model) => model.demographies, { + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + }) + @JoinColumn({ name: 'transaction_id' }) + transaction: TransactionModel; +} diff --git a/src/modules/transaction/transaction/data/models/transaction.model.ts b/src/modules/transaction/transaction/data/models/transaction.model.ts index 58bdba7..44d994e 100644 --- a/src/modules/transaction/transaction/data/models/transaction.model.ts +++ b/src/modules/transaction/transaction/data/models/transaction.model.ts @@ -1,6 +1,6 @@ import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; import { TransactionEntity } from '../../domain/entities/transaction.entity'; -import { Column, Entity, OneToMany } from 'typeorm'; +import { Column, Entity, OneToMany, OneToOne } from 'typeorm'; import { BaseStatusModel } from 'src/core/modules/data/model/base-status.model'; import { TransactionType, @@ -12,6 +12,7 @@ import { TransactionItemModel } from './transaction-item.model'; import { TransactionTaxModel } from './transaction-tax.model'; import { STATUS } from 'src/core/strings/constants/base.constants'; import { RefundModel } from 'src/modules/transaction/refund/data/models/refund.model'; +import { TransactionDemographyModel } from './transaction-demography.model'; @Entity(TABLE_NAME.TRANSACTION) export class TransactionModel @@ -242,6 +243,13 @@ export class TransactionModel }) taxes: TransactionTaxModel[]; + @OneToOne(() => TransactionDemographyModel, (model) => model.transaction, { + cascade: true, + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + }) + demographies: TransactionDemographyModel; + // relations to refund @OneToMany(() => RefundModel, (model) => model.transaction, { cascade: true, diff --git a/src/modules/transaction/transaction/domain/entities/transaction-graphy.entity.ts b/src/modules/transaction/transaction/domain/entities/transaction-graphy.entity.ts new file mode 100644 index 0000000..f006311 --- /dev/null +++ b/src/modules/transaction/transaction/domain/entities/transaction-graphy.entity.ts @@ -0,0 +1,10 @@ +import { BaseCoreEntity } from 'src/core/modules/domain/entities/base-core.entity'; +import { DemographyNationality } from '../../constants'; + +export interface TransactionDemographyEntity extends BaseCoreEntity { + man: number; + woman: number; + teen: number; + child: number; + nationality: DemographyNationality; +}