diff --git a/src/database/migrations/1726824289989-add-discount-for-item-transaction.ts b/src/database/migrations/1726824289989-add-discount-for-item-transaction.ts new file mode 100644 index 0000000..4e005a5 --- /dev/null +++ b/src/database/migrations/1726824289989-add-discount-for-item-transaction.ts @@ -0,0 +1,43 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddDiscountForItemTransaction1726824289989 + implements MigrationInterface +{ + name = 'AddDiscountForItemTransaction1726824289989'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transaction_items" ADD "subtotal" numeric`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_items" ADD "discount_value" numeric`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_item_breakdowns" ADD "subtotal" numeric`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_item_breakdowns" ADD "discount_value" numeric`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_item_breakdowns" ADD "total_price" numeric`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transaction_item_breakdowns" DROP COLUMN "total_price"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_item_breakdowns" DROP COLUMN "discount_value"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_item_breakdowns" DROP COLUMN "subtotal"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_items" DROP COLUMN "discount_value"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_items" DROP COLUMN "subtotal"`, + ); + } +} diff --git a/src/database/migrations/1726830293878-change-column-name.ts b/src/database/migrations/1726830293878-change-column-name.ts new file mode 100644 index 0000000..0489ee9 --- /dev/null +++ b/src/database/migrations/1726830293878-change-column-name.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class ChangeColumnName1726830293878 implements MigrationInterface { + name = 'ChangeColumnName1726830293878'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transaction_items" RENAME COLUMN "subtotal" TO "total_net_price"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_item_breakdowns" RENAME COLUMN "subtotal" TO "total_net_price"`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transaction_item_breakdowns" RENAME COLUMN "total_net_price" TO "subtotal"`, + ); + await queryRunner.query( + `ALTER TABLE "transaction_items" RENAME COLUMN "total_net_price" TO "subtotal"`, + ); + } +} diff --git a/src/modules/transaction/transaction/data/models/transaction-item.model.ts b/src/modules/transaction/transaction/data/models/transaction-item.model.ts index e472982..034bb47 100644 --- a/src/modules/transaction/transaction/data/models/transaction-item.model.ts +++ b/src/modules/transaction/transaction/data/models/transaction-item.model.ts @@ -52,6 +52,12 @@ export class TransactionItemModel @Column('decimal', { name: 'item_tenant_share_margin', nullable: true }) item_tenant_share_margin: number; + @Column('decimal', { nullable: true }) + total_net_price: number; + + @Column('decimal', { nullable: true }) + discount_value: number; + // calculation data @Column('decimal', { name: 'total_price', nullable: true }) total_price: number; @@ -139,6 +145,16 @@ export class TransactionItemBreakdownModel extends BaseCoreModel 0 + ? +discount_value / +payment_sub_total + : discount_percentage / 100; + const discountValue = payment_sub_total * discountPercent; + Object.assign(data, { payment_total_net_profit: data.payment_total, + discount_value: discountValue, + discount_percentage: discountPercent * 100, customer_category_id: data.customer_category?.id ?? null, customer_category_name: data.customer_category?.name ?? null, season_period_id: data.season_period?.id ?? null, @@ -174,16 +183,26 @@ export function mappingRevertTransaction(data, type) { data.items?.map((item) => { const total_price = Number(item.item.price ?? item.item.base_price) * Number(item.qty); + const discount = discountPercent * total_price; + const net_price = total_price - discount; const share_margin = item.item.tenant?.share_margin ?? 0; const total_share_tenant = share_margin > 0 ? (Number(share_margin) / 100) * total_price : 0; - item.item.bundling_items = item.item.bundling_items?.map((bundling) => { + item.bundling_items = item.item.bundling_items?.map((bundling) => { if (bundling.item_id) return bundling; + + const basePrice = bundling.item_rates ?? bundling.base_price; + const discount = discountPercent * basePrice; + const total = basePrice - discount; + return { ...bundling, item_id: bundling.id, item_name: bundling.name, + total_net_price: basePrice, + discount_value: discount, + total_price: total, id: uuidv4(), }; }); @@ -207,6 +226,8 @@ export function mappingRevertTransaction(data, type) { item_tenant_name: item.item.tenant?.id ?? null, item_tenant_share_margin: item.item.tenant?.share_margin ?? null, + total_net_price: net_price, + discount_value: discount, total_price: total_price, total_hpp: Number(item.item.hpp) * Number(item.qty), total_share_tenant: total_share_tenant,