diff --git a/src/app.module.ts b/src/app.module.ts index a528a76..0493452 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -30,6 +30,8 @@ import { ItemModule } from './modules/item-related/item/item.module'; import { ItemModel } from './modules/item-related/item/data/models/item.model'; import { SeasonTypeModule } from './modules/season-related/season-type/season-type.module'; import { SeasonTypeModel } from './modules/season-related/season-type/data/models/season-type.model'; +import { TaxModule } from './modules/transaction/tax/tax.module'; +import { TaxModel } from './modules/transaction/tax/data/models/tax.model'; @Module({ imports: [ @@ -52,6 +54,7 @@ import { SeasonTypeModel } from './modules/season-related/season-type/data/model ItemCategoryModel, LogModel, SeasonTypeModel, + TaxModel, UserModel, VipCategoryModel, VipCodeModel, @@ -75,6 +78,7 @@ import { SeasonTypeModel } from './modules/season-related/season-type/data/model ItemModule, // transaction + TaxModule, VipCategoryModule, VipCodeModule, diff --git a/src/core/strings/constants/module.constants.ts b/src/core/strings/constants/module.constants.ts index b14c713..489d50a 100644 --- a/src/core/strings/constants/module.constants.ts +++ b/src/core/strings/constants/module.constants.ts @@ -2,6 +2,7 @@ export enum MODULE_NAME { ITEM = 'items', ITEM_CATEGORY = 'item-categories', SEASON_TYPE = 'season-types', + TAX = 'taxes', TENANT = 'tenants', USER = 'users', USER_PRIVILEGE = 'user-privileges', diff --git a/src/core/strings/constants/table.constants.ts b/src/core/strings/constants/table.constants.ts index 13117f5..40f1551 100644 --- a/src/core/strings/constants/table.constants.ts +++ b/src/core/strings/constants/table.constants.ts @@ -4,6 +4,7 @@ export enum TABLE_NAME { ITEM_CATEGORY = 'item_categories', LOG = 'logs', SEASON_TYPE = 'season_types', + TAX = 'taxes', TENANT = 'tenants', USER = 'users', USER_PRIVILEGE = 'user_privileges', diff --git a/src/database/migrations/1718161138278-tax.ts b/src/database/migrations/1718161138278-tax.ts new file mode 100644 index 0000000..5851d7d --- /dev/null +++ b/src/database/migrations/1718161138278-tax.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class Tax1718161138278 implements MigrationInterface { + name = 'Tax1718161138278'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TYPE "public"."taxes_status_enum" AS ENUM('active', 'cancel', 'confirmed', 'draft', 'expired', 'inactive', 'pending', 'refunded', 'rejected', 'settled', 'waiting')`, + ); + await queryRunner.query( + `CREATE TABLE "taxes" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "creator_id" character varying(36), "creator_name" character varying(125), "editor_id" character varying(36), "editor_name" character varying(125), "created_at" bigint NOT NULL, "updated_at" bigint NOT NULL, "status" "public"."taxes_status_enum" NOT NULL DEFAULT 'draft', "name" character varying NOT NULL, "value" integer NOT NULL DEFAULT '0', CONSTRAINT "PK_6c58c9cbb420c4f65e3f5eb8162" PRIMARY KEY ("id"))`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "taxes"`); + await queryRunner.query(`DROP TYPE "public"."taxes_status_enum"`); + } +} diff --git a/src/modules/transaction/tax/constants.ts b/src/modules/transaction/tax/constants.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/transaction/tax/data/models/tax.model.ts b/src/modules/transaction/tax/data/models/tax.model.ts new file mode 100644 index 0000000..07fa6cc --- /dev/null +++ b/src/modules/transaction/tax/data/models/tax.model.ts @@ -0,0 +1,13 @@ +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { TaxEntity } from '../../domain/entities/tax.entity'; +import { Column, Entity } from 'typeorm'; +import { BaseStatusModel } from 'src/core/modules/data/model/base-status.model'; + +@Entity(TABLE_NAME.TAX) +export class TaxModel extends BaseStatusModel implements TaxEntity { + @Column('varchar', { name: 'name' }) + name: string; + + @Column('int', { name: 'value', default: 0 }) + value: number; +} diff --git a/src/modules/transaction/tax/data/services/tax-data.service.ts b/src/modules/transaction/tax/data/services/tax-data.service.ts new file mode 100644 index 0000000..87d4967 --- /dev/null +++ b/src/modules/transaction/tax/data/services/tax-data.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDataService } from 'src/core/modules/data/service/base-data.service'; +import { TaxEntity } from '../../domain/entities/tax.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TaxModel } from '../models/tax.model'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { Repository } from 'typeorm'; + +@Injectable() +export class TaxDataService extends BaseDataService { + constructor( + @InjectRepository(TaxModel, CONNECTION_NAME.DEFAULT) + private repo: Repository, + ) { + super(repo); + } +} diff --git a/src/modules/transaction/tax/domain/entities/event/tax-change-status.event.ts b/src/modules/transaction/tax/domain/entities/event/tax-change-status.event.ts new file mode 100644 index 0000000..69373ea --- /dev/null +++ b/src/modules/transaction/tax/domain/entities/event/tax-change-status.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class TaxChangeStatusEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/tax/domain/entities/event/tax-created.event.ts b/src/modules/transaction/tax/domain/entities/event/tax-created.event.ts new file mode 100644 index 0000000..b23ff5d --- /dev/null +++ b/src/modules/transaction/tax/domain/entities/event/tax-created.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class TaxCreatedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/tax/domain/entities/event/tax-deleted.event.ts b/src/modules/transaction/tax/domain/entities/event/tax-deleted.event.ts new file mode 100644 index 0000000..ae6bd86 --- /dev/null +++ b/src/modules/transaction/tax/domain/entities/event/tax-deleted.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class TaxDeletedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/tax/domain/entities/event/tax-updated.event.ts b/src/modules/transaction/tax/domain/entities/event/tax-updated.event.ts new file mode 100644 index 0000000..3a357bf --- /dev/null +++ b/src/modules/transaction/tax/domain/entities/event/tax-updated.event.ts @@ -0,0 +1,5 @@ +import { IEvent } from 'src/core/strings/constants/interface.constants'; + +export class TaxUpdatedEvent { + constructor(public readonly data: IEvent) {} +} diff --git a/src/modules/transaction/tax/domain/entities/tax.entity.ts b/src/modules/transaction/tax/domain/entities/tax.entity.ts new file mode 100644 index 0000000..9873d88 --- /dev/null +++ b/src/modules/transaction/tax/domain/entities/tax.entity.ts @@ -0,0 +1,6 @@ +import { BaseStatusEntity } from 'src/core/modules/domain/entities/base-status.entity'; + +export interface TaxEntity extends BaseStatusEntity { + name: string; + value: number; +} diff --git a/src/modules/transaction/tax/domain/usecases/managers/active-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/active-tax.manager.ts new file mode 100644 index 0000000..bc09521 --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/active-tax.manager.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-update-status.manager'; +import { TaxEntity } from '../../entities/tax.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TaxModel } from '../../../data/models/tax.model'; +import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event'; + +@Injectable() +export class ActiveTaxManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success active data ${this.result.name}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TaxModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TaxChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/transaction/tax/domain/usecases/managers/batch-active-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/batch-active-tax.manager.ts new file mode 100644 index 0000000..1fbbcdf --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/batch-active-tax.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { TaxEntity } from '../../entities/tax.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TaxModel } from '../../../data/models/tax.model'; +import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchActiveTaxManager extends BaseBatchUpdateStatusManager { + validateData(data: TaxEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TaxModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TaxChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/transaction/tax/domain/usecases/managers/batch-confirm-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/batch-confirm-tax.manager.ts new file mode 100644 index 0000000..e746e50 --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/batch-confirm-tax.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { TaxEntity } from '../../entities/tax.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TaxModel } from '../../../data/models/tax.model'; +import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchConfirmTaxManager extends BaseBatchUpdateStatusManager { + validateData(data: TaxEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TaxModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TaxChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/transaction/tax/domain/usecases/managers/batch-delete-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/batch-delete-tax.manager.ts new file mode 100644 index 0000000..97b1e1d --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/batch-delete-tax.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchDeleteManager } from 'src/core/modules/domain/usecase/managers/base-batch-delete.manager'; +import { TaxEntity } from '../../entities/tax.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TaxModel } from '../../../data/models/tax.model'; +import { TaxDeletedEvent } from '../../entities/event/tax-deleted.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchDeleteTaxManager extends BaseBatchDeleteManager { + async beforeProcess(): Promise { + return; + } + + async validateData(data: TaxEntity): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TaxModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TaxDeletedEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/transaction/tax/domain/usecases/managers/batch-inactive-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/batch-inactive-tax.manager.ts new file mode 100644 index 0000000..f00ec20 --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/batch-inactive-tax.manager.ts @@ -0,0 +1,45 @@ +import { BaseBatchUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-batch-update-status.manager'; +import { TaxEntity } from '../../entities/tax.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TaxModel } from '../../../data/models/tax.model'; +import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BatchInactiveTaxManager extends BaseBatchUpdateStatusManager { + validateData(data: TaxEntity): Promise { + return; + } + + beforeProcess(): Promise { + return; + } + + afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TaxModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TaxChangeStatusEvent, + }, + ]; + } + + getResult(): BatchResult { + return this.result; + } +} diff --git a/src/modules/transaction/tax/domain/usecases/managers/confirm-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/confirm-tax.manager.ts new file mode 100644 index 0000000..a36fdbf --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/confirm-tax.manager.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-update-status.manager'; +import { TaxEntity } from '../../entities/tax.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TaxModel } from '../../../data/models/tax.model'; +import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event'; + +@Injectable() +export class ConfirmTaxManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success active data ${this.result.name}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TaxModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TaxChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/transaction/tax/domain/usecases/managers/create-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/create-tax.manager.ts new file mode 100644 index 0000000..5161f57 --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/create-tax.manager.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@nestjs/common'; +import { + EventTopics, + columnUniques, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TaxEntity } from '../../entities/tax.entity'; +import { TaxModel } from '../../../data/models/tax.model'; +import { BaseCreateManager } from 'src/core/modules/domain/usecase/managers/base-create.manager'; +import { TaxCreatedEvent } from '../../entities/event/tax-created.event'; + +@Injectable() +export class CreateTaxManager extends BaseCreateManager { + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get uniqueColumns(): columnUniques[] { + return [{ column: 'name' }]; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TaxCreatedEvent, + data: this.data, + }, + ]; + } + + get entityTarget(): any { + return TaxModel; + } +} diff --git a/src/modules/transaction/tax/domain/usecases/managers/delete-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/delete-tax.manager.ts new file mode 100644 index 0000000..bb0b9cc --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/delete-tax.manager.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { BaseDeleteManager } from 'src/core/modules/domain/usecase/managers/base-delete.manager'; +import { TaxEntity } from '../../entities/tax.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TaxModel } from '../../../data/models/tax.model'; +import { TaxDeletedEvent } from '../../entities/event/tax-deleted.event'; + +@Injectable() +export class DeleteTaxManager extends BaseDeleteManager { + getResult(): string { + return `Success`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TaxModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TaxDeletedEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/transaction/tax/domain/usecases/managers/inactive-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/inactive-tax.manager.ts new file mode 100644 index 0000000..f92cfff --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/inactive-tax.manager.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-update-status.manager'; +import { TaxEntity } from '../../entities/tax.entity'; +import { + EventTopics, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; +import { TaxModel } from '../../../data/models/tax.model'; +import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event'; + +@Injectable() +export class InactiveTaxManager extends BaseUpdateStatusManager { + getResult(): string { + return `Success inactive data ${this.result.name}`; + } + + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get entityTarget(): any { + return TaxModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TaxChangeStatusEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/transaction/tax/domain/usecases/managers/update-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/update-tax.manager.ts new file mode 100644 index 0000000..f72838e --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/update-tax.manager.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@nestjs/common'; +import { BaseUpdateManager } from 'src/core/modules/domain/usecase/managers/base-update.manager'; +import { TaxEntity } from '../../entities/tax.entity'; +import { TaxModel } from '../../../data/models/tax.model'; +import { TaxUpdatedEvent } from '../../entities/event/tax-updated.event'; +import { + EventTopics, + columnUniques, + validateRelations, +} from 'src/core/strings/constants/interface.constants'; + +@Injectable() +export class UpdateTaxManager extends BaseUpdateManager { + async validateProcess(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + return; + } + + get validateRelations(): validateRelations[] { + return []; + } + + get uniqueColumns(): columnUniques[] { + return [{ column: 'name' }]; + } + + get entityTarget(): any { + return TaxModel; + } + + get eventTopics(): EventTopics[] { + return [ + { + topic: TaxUpdatedEvent, + data: this.data, + }, + ]; + } +} diff --git a/src/modules/transaction/tax/domain/usecases/tax-data.orchestrator.ts b/src/modules/transaction/tax/domain/usecases/tax-data.orchestrator.ts new file mode 100644 index 0000000..ddaafc4 --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/tax-data.orchestrator.ts @@ -0,0 +1,106 @@ +import { Injectable } from '@nestjs/common'; +import { CreateTaxManager } from './managers/create-tax.manager'; +import { TaxDataService } from '../../data/services/tax-data.service'; +import { TaxEntity } from '../entities/tax.entity'; +import { DeleteTaxManager } from './managers/delete-tax.manager'; +import { UpdateTaxManager } from './managers/update-tax.manager'; +import { BaseDataTransactionOrchestrator } from 'src/core/modules/domain/usecase/orchestrators/base-data-transaction.orchestrator'; +import { ActiveTaxManager } from './managers/active-tax.manager'; +import { InactiveTaxManager } from './managers/inactive-tax.manager'; +import { ConfirmTaxManager } from './managers/confirm-tax.manager'; +import { STATUS } from 'src/core/strings/constants/base.constants'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { BatchConfirmTaxManager } from './managers/batch-confirm-tax.manager'; +import { BatchInactiveTaxManager } from './managers/batch-inactive-tax.manager'; +import { BatchActiveTaxManager } from './managers/batch-active-tax.manager'; +import { BatchDeleteTaxManager } from './managers/batch-delete-tax.manager'; +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; + +@Injectable() +export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator { + constructor( + private createManager: CreateTaxManager, + private updateManager: UpdateTaxManager, + private deleteManager: DeleteTaxManager, + private activeManager: ActiveTaxManager, + private confirmManager: ConfirmTaxManager, + private inactiveManager: InactiveTaxManager, + private batchDeleteManager: BatchDeleteTaxManager, + private batchActiveManager: BatchActiveTaxManager, + private batchConfirmManager: BatchConfirmTaxManager, + private batchInactiveManager: BatchInactiveTaxManager, + private serviceData: TaxDataService, + ) { + super(); + } + + async create(data): Promise { + this.createManager.setData(data); + this.createManager.setService(this.serviceData, TABLE_NAME.TAX); + await this.createManager.execute(); + return this.createManager.getResult(); + } + + async update(dataId, data): Promise { + this.updateManager.setData(dataId, data); + this.updateManager.setService(this.serviceData, TABLE_NAME.TAX); + await this.updateManager.execute(); + return this.updateManager.getResult(); + } + + async delete(dataId): Promise { + this.deleteManager.setData(dataId); + this.deleteManager.setService(this.serviceData, TABLE_NAME.TAX); + await this.deleteManager.execute(); + return this.deleteManager.getResult(); + } + + async batchDelete(dataIds: string[]): Promise { + this.batchDeleteManager.setData(dataIds); + this.batchDeleteManager.setService(this.serviceData, TABLE_NAME.TAX); + await this.batchDeleteManager.execute(); + return this.batchDeleteManager.getResult(); + } + + async active(dataId): Promise { + this.activeManager.setData(dataId, STATUS.ACTIVE); + this.activeManager.setService(this.serviceData, TABLE_NAME.TAX); + await this.activeManager.execute(); + return this.activeManager.getResult(); + } + + async batchActive(dataIds: string[]): Promise { + this.batchActiveManager.setData(dataIds, STATUS.ACTIVE); + this.batchActiveManager.setService(this.serviceData, TABLE_NAME.TAX); + await this.batchActiveManager.execute(); + return this.batchActiveManager.getResult(); + } + + async confirm(dataId): Promise { + this.confirmManager.setData(dataId, STATUS.ACTIVE); + this.confirmManager.setService(this.serviceData, TABLE_NAME.TAX); + await this.confirmManager.execute(); + return this.confirmManager.getResult(); + } + + async batchConfirm(dataIds: string[]): Promise { + this.batchConfirmManager.setData(dataIds, STATUS.ACTIVE); + this.batchConfirmManager.setService(this.serviceData, TABLE_NAME.TAX); + await this.batchConfirmManager.execute(); + return this.batchConfirmManager.getResult(); + } + + async inactive(dataId): Promise { + this.inactiveManager.setData(dataId, STATUS.INACTIVE); + this.inactiveManager.setService(this.serviceData, TABLE_NAME.TAX); + await this.inactiveManager.execute(); + return this.inactiveManager.getResult(); + } + + async batchInactive(dataIds: string[]): Promise { + this.batchInactiveManager.setData(dataIds, STATUS.INACTIVE); + this.batchInactiveManager.setService(this.serviceData, TABLE_NAME.TAX); + await this.batchInactiveManager.execute(); + return this.batchInactiveManager.getResult(); + } +} diff --git a/src/modules/transaction/tax/index.ts b/src/modules/transaction/tax/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/transaction/tax/infrastructure/dto/tax.dto.ts b/src/modules/transaction/tax/infrastructure/dto/tax.dto.ts new file mode 100644 index 0000000..f8a9069 --- /dev/null +++ b/src/modules/transaction/tax/infrastructure/dto/tax.dto.ts @@ -0,0 +1,22 @@ +import { BaseStatusDto } from 'src/core/modules/infrastructure/dto/base-status.dto'; +import { TaxEntity } from '../../domain/entities/tax.entity'; +import { ApiProperty } from '@nestjs/swagger'; +import { IsNumber, IsString } from 'class-validator'; + +export class TaxDto extends BaseStatusDto implements TaxEntity { + @ApiProperty({ + type: String, + required: true, + example: 'PPN', + }) + @IsString() + name: string; + + @ApiProperty({ + type: Number, + required: true, + example: 10, + }) + @IsNumber() + value: number; +} diff --git a/src/modules/transaction/tax/infrastructure/tax-data.controller.ts b/src/modules/transaction/tax/infrastructure/tax-data.controller.ts new file mode 100644 index 0000000..fc8419b --- /dev/null +++ b/src/modules/transaction/tax/infrastructure/tax-data.controller.ts @@ -0,0 +1,78 @@ +import { + Body, + Controller, + Delete, + Param, + Patch, + Post, + Put, +} from '@nestjs/common'; +import { TaxDataOrchestrator } from '../domain/usecases/tax-data.orchestrator'; +import { TaxDto } from './dto/tax.dto'; +import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; +import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; +import { TaxEntity } from '../domain/entities/tax.entity'; +import { BatchResult } from 'src/core/response/domain/ok-response.interface'; +import { BatchIdsDto } from 'src/core/modules/infrastructure/dto/base-batch.dto'; +import { Public } from 'src/core/guards'; + +@ApiTags(`${MODULE_NAME.TAX.split('-').join(' ')} - data`) +@Controller(MODULE_NAME.TAX) +@Public(false) +@ApiBearerAuth('JWT') +export class TaxDataController { + constructor(private orchestrator: TaxDataOrchestrator) {} + + @Post() + async create(@Body() data: TaxDto): Promise { + return await this.orchestrator.create(data); + } + + @Put('/batch-delete') + async batchDeleted(@Body() body: BatchIdsDto): Promise { + return await this.orchestrator.batchDelete(body.ids); + } + + @Patch(':id/active') + async active(@Param('id') dataId: string): Promise { + return await this.orchestrator.active(dataId); + } + + @Put('/batch-active') + async batchActive(@Body() body: BatchIdsDto): Promise { + return await this.orchestrator.batchActive(body.ids); + } + + @Patch(':id/confirm') + async confirm(@Param('id') dataId: string): Promise { + return await this.orchestrator.confirm(dataId); + } + + @Put('/batch-confirm') + async batchConfirm(@Body() body: BatchIdsDto): Promise { + return await this.orchestrator.batchConfirm(body.ids); + } + + @Patch(':id/inactive') + async inactive(@Param('id') dataId: string): Promise { + return await this.orchestrator.inactive(dataId); + } + + @Put('/batch-inactive') + async batchInactive(@Body() body: BatchIdsDto): Promise { + return await this.orchestrator.batchInactive(body.ids); + } + + @Put(':id') + async update( + @Param('id') dataId: string, + @Body() data: TaxDto, + ): Promise { + return await this.orchestrator.update(dataId, data); + } + + @Delete(':id') + async delete(@Param('id') dataId: string): Promise { + return await this.orchestrator.delete(dataId); + } +} diff --git a/src/modules/transaction/tax/tax.module.ts b/src/modules/transaction/tax/tax.module.ts new file mode 100644 index 0000000..ef35bc6 --- /dev/null +++ b/src/modules/transaction/tax/tax.module.ts @@ -0,0 +1,54 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { TaxDataService } from './data/services/tax-data.service'; +import { TaxReadService } from './data/services/tax-read.service'; +import { TaxReadController } from './infrastructure/tax-read.controller'; +import { TaxReadOrchestrator } from './domain/usecases/tax-read.orchestrator'; +import { TaxDataController } from './infrastructure/tax-data.controller'; +import { TaxDataOrchestrator } from './domain/usecases/tax-data.orchestrator'; +import { CreateTaxManager } from './domain/usecases/managers/create-tax.manager'; +import { CqrsModule } from '@nestjs/cqrs'; +import { IndexTaxManager } from './domain/usecases/managers/index-tax.manager'; +import { DeleteTaxManager } from './domain/usecases/managers/delete-tax.manager'; +import { UpdateTaxManager } from './domain/usecases/managers/update-tax.manager'; +import { ActiveTaxManager } from './domain/usecases/managers/active-tax.manager'; +import { ConfirmTaxManager } from './domain/usecases/managers/confirm-tax.manager'; +import { InactiveTaxManager } from './domain/usecases/managers/inactive-tax.manager'; +import { DetailTaxManager } from './domain/usecases/managers/detail-tax.manager'; +import { BatchDeleteTaxManager } from './domain/usecases/managers/batch-delete-tax.manager'; +import { BatchActiveTaxManager } from './domain/usecases/managers/batch-active-tax.manager'; +import { BatchConfirmTaxManager } from './domain/usecases/managers/batch-confirm-tax.manager'; +import { BatchInactiveTaxManager } from './domain/usecases/managers/batch-inactive-tax.manager'; +import { TaxModel } from './data/models/tax.model'; + +@Module({ + imports: [ + ConfigModule.forRoot(), + TypeOrmModule.forFeature([TaxModel], CONNECTION_NAME.DEFAULT), + CqrsModule, + ], + controllers: [TaxDataController, TaxReadController], + providers: [ + IndexTaxManager, + DetailTaxManager, + CreateTaxManager, + DeleteTaxManager, + UpdateTaxManager, + ActiveTaxManager, + ConfirmTaxManager, + InactiveTaxManager, + BatchDeleteTaxManager, + BatchActiveTaxManager, + BatchConfirmTaxManager, + BatchInactiveTaxManager, + + TaxDataService, + TaxReadService, + + TaxDataOrchestrator, + TaxReadOrchestrator, + ], +}) +export class TaxModule {}