From e7a7ffb2bc1999814d7670dad0da36ae8bb4dae5 Mon Sep 17 00:00:00 2001 From: shancheas Date: Thu, 29 Aug 2024 17:19:24 +0700 Subject: [PATCH] feat: add variable config to formula --- ...724926316235-add-value-variable-formula.ts | 19 ++++++++ .../update-profit-share-formula.manager.ts | 30 +++++++++++++ .../data/models/sales-price-formula.model.ts | 3 ++ .../entities/sales-price-formula.entity.ts | 8 ++++ .../dto/sales-price-formula.dto.ts | 43 ++++++++++++++++++- 5 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 src/database/migrations/1724926316235-add-value-variable-formula.ts diff --git a/src/database/migrations/1724926316235-add-value-variable-formula.ts b/src/database/migrations/1724926316235-add-value-variable-formula.ts new file mode 100644 index 0000000..b10b372 --- /dev/null +++ b/src/database/migrations/1724926316235-add-value-variable-formula.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddValueVariableFormula1724926316235 + implements MigrationInterface +{ + name = 'AddValueVariableFormula1724926316235'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "price_formulas" ADD "value_for" character varying NOT NULL DEFAULT 'dpp'`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "price_formulas" DROP COLUMN "value_for"`, + ); + } +} diff --git a/src/modules/transaction/profit-share-formula/domain/usecases/managers/update-profit-share-formula.manager.ts b/src/modules/transaction/profit-share-formula/domain/usecases/managers/update-profit-share-formula.manager.ts index 053114a..7a22c6c 100644 --- a/src/modules/transaction/profit-share-formula/domain/usecases/managers/update-profit-share-formula.manager.ts +++ b/src/modules/transaction/profit-share-formula/domain/usecases/managers/update-profit-share-formula.manager.ts @@ -11,6 +11,7 @@ import { SalesPriceFormulaEntity } from 'src/modules/transaction/sales-price-for import { In } from 'typeorm'; import { STATUS } from 'src/core/strings/constants/base.constants'; import { calculateProfitFormula } from 'src/modules/transaction/sales-price-formula/domain/usecases/managers/helpers/calculation-formula.helper'; +import { FormulaType } from 'src/modules/transaction/sales-price-formula/constants'; @Injectable() export class UpdateProfitShareFormulaManager extends BaseUpdateManager { @@ -30,6 +31,35 @@ export class UpdateProfitShareFormulaManager extends BaseUpdateManager { + const additionalFormula = this.data.additional; + for (const additional of additionalFormula) { + /** + * Find formula for variable + * If the formula doesn't exist, then create data for save + */ + const formula = (await this.dataService.getOneByOptions({ + where: { + value_for: additional.value_for, + }, + })) ?? { + editor_id: this.user.id, + editor_name: this.user.name, + updated_at: new Date().getTime(), + created_at: new Date().getTime(), + type: FormulaType.PROFIT_SHARE, + }; + + // Update formula value to exist formula or new formula + formula.formula_render = additional.formula_render; + formula.formula_string = additional.formula_string; + formula.value_for = additional.value_for; + + /** + * This function is create, but inside function is save + * So, if the id is provide, the data will be update instead create new data + */ + this.dataService.create(null, null, formula); + } return; } diff --git a/src/modules/transaction/sales-price-formula/data/models/sales-price-formula.model.ts b/src/modules/transaction/sales-price-formula/data/models/sales-price-formula.model.ts index 4793e8b..9787733 100644 --- a/src/modules/transaction/sales-price-formula/data/models/sales-price-formula.model.ts +++ b/src/modules/transaction/sales-price-formula/data/models/sales-price-formula.model.ts @@ -22,6 +22,9 @@ export class SalesPriceFormulaModel @Column('varchar', { name: 'formula_string', nullable: true }) formula_string: string; + @Column('varchar', { default: 'dpp' }) + value_for: string; + @Column('varchar', { name: 'example_formula', nullable: true }) example_formula: string; diff --git a/src/modules/transaction/sales-price-formula/domain/entities/sales-price-formula.entity.ts b/src/modules/transaction/sales-price-formula/domain/entities/sales-price-formula.entity.ts index c0adb62..aa57e47 100644 --- a/src/modules/transaction/sales-price-formula/domain/entities/sales-price-formula.entity.ts +++ b/src/modules/transaction/sales-price-formula/domain/entities/sales-price-formula.entity.ts @@ -6,5 +6,13 @@ export interface SalesPriceFormulaEntity extends BaseEntity { formula_string: string; // digunakan untuk menyimpan string dari formula example_formula: string; example_result: number; + value_for: string; type: FormulaType; + additional?: AdditionalFormula[]; +} + +export interface AdditionalFormula { + formula_render: any; + formula_string: string; + value_for: string; } diff --git a/src/modules/transaction/sales-price-formula/infrastructure/dto/sales-price-formula.dto.ts b/src/modules/transaction/sales-price-formula/infrastructure/dto/sales-price-formula.dto.ts index 4cc7542..6fab1d8 100644 --- a/src/modules/transaction/sales-price-formula/infrastructure/dto/sales-price-formula.dto.ts +++ b/src/modules/transaction/sales-price-formula/infrastructure/dto/sales-price-formula.dto.ts @@ -1,11 +1,37 @@ import { BaseDto } from 'src/core/modules/infrastructure/dto/base.dto'; -import { SalesPriceFormulaEntity } from '../../domain/entities/sales-price-formula.entity'; +import { + AdditionalFormula, + SalesPriceFormulaEntity, +} from '../../domain/entities/sales-price-formula.entity'; import { ApiProperty } from '@nestjs/swagger'; -import { ValidateIf } from 'class-validator'; +import { ValidateIf, ValidateNested } from 'class-validator'; import { Exclude } from 'class-transformer'; import { Any } from 'typeorm'; import { FormulaType } from '../../constants'; +export class AdditionalFormulaDto implements AdditionalFormula { + @ApiProperty({ + type: Any, + required: false, + }) + @ValidateIf((body) => body.formula_render) + formula_render: any; + + @ApiProperty({ + type: String, + required: false, + }) + @ValidateIf((body) => body.formula_string) + formula_string: string; + + @ApiProperty({ + type: String, + required: false, + }) + @ValidateIf((body) => body.value_for) + value_for: string; +} + export class SalesPriceFormulaDto extends BaseDto implements SalesPriceFormulaEntity @@ -30,6 +56,19 @@ export class SalesPriceFormulaDto @Exclude() example_result: number; + @Exclude() + value_for: string; + @Exclude() type: FormulaType; + + @ApiProperty({ + type: [AdditionalFormulaDto], + default: AdditionalFormulaDto, + }) + @ValidateIf(({ additional }) => { + return additional != null; + }) + @ValidateNested({ each: true }) + additional: AdditionalFormulaDto[]; }