From 9242f43760143cf58d832df1c48989b3499061f4 Mon Sep 17 00:00:00 2001 From: Aswin Ashar Abdullah Date: Thu, 11 Jul 2024 18:14:05 +0700 Subject: [PATCH] fix(SPG-595) Pemesanan - Penyesuaian flow booking --- .../data/models/transaction.model.ts | 3 ++ .../domain/entities/transaction.entity.ts | 1 + .../handlers/settled-transaction.handler.ts | 49 ++++++++++++++++--- .../managers/geneate-vip-code.manager.ts | 34 +++---------- .../helpers/generate-random.helper.ts | 24 +++++++++ 5 files changed, 78 insertions(+), 33 deletions(-) create mode 100644 src/modules/transaction/vip-code/domain/usecases/managers/helpers/generate-random.helper.ts diff --git a/src/modules/transaction/transaction/data/models/transaction.model.ts b/src/modules/transaction/transaction/data/models/transaction.model.ts index 8398663..a447efe 100644 --- a/src/modules/transaction/transaction/data/models/transaction.model.ts +++ b/src/modules/transaction/transaction/data/models/transaction.model.ts @@ -144,6 +144,9 @@ export class TransactionModel payment_change: number; // share and profit data + @Column('decimal', { name: 'payment_total_dpp', nullable: true }) + payment_total_dpp: number; + @Column('decimal', { name: 'payment_total_share', nullable: true }) payment_total_share: number; diff --git a/src/modules/transaction/transaction/domain/entities/transaction.entity.ts b/src/modules/transaction/transaction/domain/entities/transaction.entity.ts index 9d7c3ae..c340dbc 100644 --- a/src/modules/transaction/transaction/domain/entities/transaction.entity.ts +++ b/src/modules/transaction/transaction/domain/entities/transaction.entity.ts @@ -60,6 +60,7 @@ export interface TransactionEntity extends BaseStatusEntity { payment_total_share: number; // total share untuk para tenant payment_total_tax: number; // total untuk tax payment_total_profit: number; // total untuk profit perusahan + payment_total_dpp: number; profit_share_formula: string; sales_price_formula: string; diff --git a/src/modules/transaction/transaction/domain/usecases/handlers/settled-transaction.handler.ts b/src/modules/transaction/transaction/domain/usecases/handlers/settled-transaction.handler.ts index 976d2e0..87d5992 100644 --- a/src/modules/transaction/transaction/domain/usecases/handlers/settled-transaction.handler.ts +++ b/src/modules/transaction/transaction/domain/usecases/handlers/settled-transaction.handler.ts @@ -8,6 +8,10 @@ import { Equation, parse } from 'algebra.js'; import { STATUS } from 'src/core/strings/constants/base.constants'; import { TransactionDataService } from '../../../data/services/transaction-data.service'; import { TransactionModel } from '../../../data/models/transaction.model'; +import { + generateCodeDate, + generateRandom, +} from 'src/modules/transaction/vip-code/domain/usecases/managers/helpers/generate-random.helper'; @EventsHandler(TransactionChangeStatusEvent) export class SettledTransactionHandler @@ -21,14 +25,21 @@ export class SettledTransactionHandler async handle(event: TransactionChangeStatusEvent) { const old_data = event.data.old; - const data = event.data.data; + const current_data = event.data.data; if ( - old_data.status == data.status || - ![STATUS.ACTIVE, STATUS.SETTLED].includes(data.status) + old_data.status == current_data.status || + ![STATUS.ACTIVE, STATUS.SETTLED].includes(current_data.status) ) return; + const data = await this.dataService.getOneByOptions({ + where: { + id: current_data.id, + }, + relations: ['items'], + }); + const profit_formula = await this.formulaService.getOneByOptions({ where: { type: FormulaType.PROFIT_SHARE, @@ -52,17 +63,30 @@ export class SettledTransactionHandler .manager.connection.createQueryRunner(); // const profit_share_value = this.calculateFormula(profit_formula.formula_string, taxes, data.payment_total_net_profit ?? 0); - // const sale_price_value = this.calculateFormula(sales_price.formula_string, taxes, data.payment_total_net_profit ?? 0); + const { dpp_value, tax_datas } = this.calculateSalesFormula( + sales_price.formula_string, + taxes, + data.payment_total_net_profit ?? 0, + ); + + const month_year = generateCodeDate(); + const char = generateRandom(1); + const number = generateRandom(1, true); Object.assign(data, { + payment_total_dpp: dpp_value, + invoice_code: `${month_year}${char}${number}`, profit_share_formula: profit_formula.formula_string, sales_price_formula: sales_price.formula_string, + taxes: tax_datas, }); await this.dataService.create(queryRunner, TransactionModel, data); } - calculateFormula(formula, taxes, total) { + calculateSalesFormula(formula, taxes, total) { + let value = 0; + let tax_datas = []; const regex = /([a-zA-Z0-9_]+)/g; const variable = {}; @@ -73,6 +97,13 @@ export class SettledTransactionHandler for (const key of keys) { const keyData = taxes.find((tax) => tax.name == key); variable[key] = keyData.value / 100; + + tax_datas.push({ + tax_id: keyData.id, + tax_name: keyData.name, + tax_value: keyData.value, + tax_total_value: (keyData.value / 100) * Number(total), + }); } try { @@ -86,11 +117,15 @@ export class SettledTransactionHandler const result = equation.solveFor('dpp').toString(); console.log(result); - const value = math.evaluate(result); + value = math.evaluate(result); console.log(value); - return value; } catch (e) { console.log(e); } + + return { + dpp_value: value, + tax_datas: tax_datas, + }; } } diff --git a/src/modules/transaction/vip-code/domain/usecases/managers/geneate-vip-code.manager.ts b/src/modules/transaction/vip-code/domain/usecases/managers/geneate-vip-code.manager.ts index 071ae18..4d5fe3e 100644 --- a/src/modules/transaction/vip-code/domain/usecases/managers/geneate-vip-code.manager.ts +++ b/src/modules/transaction/vip-code/domain/usecases/managers/geneate-vip-code.manager.ts @@ -2,6 +2,10 @@ import { BaseCustomManager } from 'src/core/modules/domain/usecase/managers/base import { Injectable } from '@nestjs/common'; import { VipCodeEntity } from '../../entities/vip-code.entity'; import { EventTopics } from 'src/core/strings/constants/interface.constants'; +import { + generateCodeDate, + generateRandom, +} from './helpers/generate-random.helper'; @Injectable() export class GenerateVipCodeManager extends BaseCustomManager { @@ -14,19 +18,11 @@ export class GenerateVipCodeManager extends BaseCustomManager { } process(): Promise { - const date = new Date(); + const month_year = generateCodeDate(); + const char = generateRandom(1); + const number = generateRandom(2, true); - // get month dan year (dua digit) - const month = - date.getMonth() < 10 - ? `0${date.getMonth() + 1}` - : (date.getMonth() + 1).toString(); - const year = date.getFullYear().toString().slice(-2); - - const char = this.generateRandom(1); - const number = this.generateRandom(2, true); - - this.result = `${month}${year}${char}${number}`; + this.result = `${month_year}${char}${number}`; return; } @@ -45,18 +41,4 @@ export class GenerateVipCodeManager extends BaseCustomManager { get eventTopics(): EventTopics[] { return []; } - - generateRandom(length: number, is_number?: boolean): string { - let result = ''; - let base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - if (is_number) base = '123456789'; - - let counter = 0; - while (counter < length) { - result += base.charAt(Math.floor(Math.random() * base.length)); - counter += 1; - } - - return result; - } } diff --git a/src/modules/transaction/vip-code/domain/usecases/managers/helpers/generate-random.helper.ts b/src/modules/transaction/vip-code/domain/usecases/managers/helpers/generate-random.helper.ts new file mode 100644 index 0000000..4c65f72 --- /dev/null +++ b/src/modules/transaction/vip-code/domain/usecases/managers/helpers/generate-random.helper.ts @@ -0,0 +1,24 @@ +export function generateRandom(length: number, is_number?: boolean): string { + let result = ''; + let base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + if (is_number) base = '123456789'; + + let counter = 0; + while (counter < length) { + result += base.charAt(Math.floor(Math.random() * base.length)); + counter += 1; + } + + return result; +} + +export function generateCodeDate() { + const date = new Date(); + const month = + date.getMonth() < 10 + ? `0${date.getMonth() + 1}` + : (date.getMonth() + 1).toString(); + const year = date.getFullYear().toString().slice(-2); + + return `${month}${year}`; +}