diff --git a/src/database/migrations/1720077765890-update-default-column-transaction.ts b/src/database/migrations/1720077765890-update-default-column-transaction.ts new file mode 100644 index 0000000..bc8fc89 --- /dev/null +++ b/src/database/migrations/1720077765890-update-default-column-transaction.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class UpdateDefaultColumnTransaction1720077765890 + implements MigrationInterface +{ + name = 'UpdateDefaultColumnTransaction1720077765890'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transactions" ALTER COLUMN "is_recap_transaction" SET DEFAULT false`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transactions" ALTER COLUMN "is_recap_transaction" SET DEFAULT true`, + ); + } +} diff --git a/src/modules/season-related/season-period/domain/usecases/managers/get-current-period.manager.ts b/src/modules/season-related/season-period/domain/usecases/managers/get-current-period.manager.ts new file mode 100644 index 0000000..cdf852b --- /dev/null +++ b/src/modules/season-related/season-period/domain/usecases/managers/get-current-period.manager.ts @@ -0,0 +1,81 @@ +import { Injectable } from '@nestjs/common'; +import { BaseIndexManager } from 'src/core/modules/domain/usecase/managers/base-index.manager'; +import { SeasonPeriodEntity } from '../../entities/season-period.entity'; +import { SelectQueryBuilder } from 'typeorm'; +import { + Param, + RelationParam, +} from 'src/core/modules/domain/entities/base-filter.entity'; + +@Injectable() +export class CurrentSeasonPeriodManager extends BaseIndexManager { + async prepareData(): Promise { + return; + } + + async beforeProcess(): Promise { + return; + } + + async afterProcess(): Promise { + Object.assign(this.result, { + data: this.result.data.sort((a, b) => a.priority - b.priority) + }) + return; + } + + get relations(): RelationParam { + return { + // relation only join (for query purpose) + joinRelations: ['season_type'], + + // relation join and select (relasi yang ingin ditampilkan), + selectRelations: [], + + // relation yang hanya ingin dihitung (akan return number) + countRelations: [], + }; + } + + get selects(): string[] { + return [ + `${ this.tableName }.id`, + `${ this.tableName }.priority`, + `${ this.tableName }.created_at`, + `${ this.tableName }.creator_name`, + `${ this.tableName }.editor_name`, + `${ this.tableName }.updated_at`, + `${ this.tableName }.status`, + `${ this.tableName }.start_date`, + `${ this.tableName }.end_date`, + `${ this.tableName }.days`, + `${ this.tableName }.holiday_name`, + + 'season_type.id', + 'season_type.name', + ]; + } + + get specificFilter(): Param[] { + return [ + { + cols: `${ this.tableName }.holiday_name`, + data: this.filterParam.holiday_names, + }, + ]; + } + + setQueryFilter( + queryBuilder: SelectQueryBuilder, + ): SelectQueryBuilder { + queryBuilder.andWhere( + `${ this.tableName }.start_date BETWEEN :from AND :to`, + { + from: new Date().toLocaleDateString(), + to: new Date().toLocaleDateString(), + }, + ); + + return queryBuilder; + } +} diff --git a/src/modules/season-related/season-period/domain/usecases/season-period-read.orchestrator.ts b/src/modules/season-related/season-period/domain/usecases/season-period-read.orchestrator.ts index 69524cb..83beed2 100644 --- a/src/modules/season-related/season-period/domain/usecases/season-period-read.orchestrator.ts +++ b/src/modules/season-related/season-period/domain/usecases/season-period-read.orchestrator.ts @@ -8,8 +8,9 @@ import { DetailSeasonPeriodManager } from './managers/detail-season-period.manag import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; import { IndexSeasonPeriodeItemManager } from './managers/index-season-period-item.manager'; import { ItemRateEntity } from 'src/modules/item-related/item-rate/domain/entities/item-rate.entity'; -import { FilterItemRateDto } from 'src/modules/item-related/item-rate/infrastructure/dto/filter-item-rate.dto'; import { ItemRateReadService } from 'src/modules/item-related/item-rate/data/services/item-rate-read.service'; +import { CurrentSeasonPeriodManager } from './managers/get-current-period.manager'; +import { FilterSeasonPeriodDto } from '../../infrastructure/dto/filter-season-period.dto'; @Injectable() export class SeasonPeriodReadOrchestrator extends BaseReadOrchestrator { @@ -17,6 +18,7 @@ export class SeasonPeriodReadOrchestrator extends BaseReadOrchestrator { + const params = new FilterSeasonPeriodDto(); + this.currentPeriodManager.setFilterParam(params); + this.currentPeriodManager.setService(this.serviceData, TABLE_NAME.SEASON_PERIOD); + await this.currentPeriodManager.execute(); + const data = this.currentPeriodManager.getResult(); + return data.data[0] + } + async indexItem(params): Promise> { this.indexItemManager.setFilterParam(params); this.indexItemManager.setService( diff --git a/src/modules/season-related/season-period/infrastructure/season-period-read.controller.ts b/src/modules/season-related/season-period/infrastructure/season-period-read.controller.ts index 3c9a3a8..5c2bde6 100644 --- a/src/modules/season-related/season-period/infrastructure/season-period-read.controller.ts +++ b/src/modules/season-related/season-period/infrastructure/season-period-read.controller.ts @@ -25,6 +25,11 @@ export class SeasonPeriodReadController { return await this.orchestrator.index(params); } + @Get('current-period') + async currentPeriod(): Promise { + return await this.orchestrator.currentPeriod(); + } + @Get(':id') async detail(@Param('id') id: string): Promise { return await this.orchestrator.detail(id); diff --git a/src/modules/season-related/season-period/season-period.module.ts b/src/modules/season-related/season-period/season-period.module.ts index 7351a78..6adce88 100644 --- a/src/modules/season-related/season-period/season-period.module.ts +++ b/src/modules/season-related/season-period/season-period.module.ts @@ -28,6 +28,7 @@ import { ItemRateModel } from 'src/modules/item-related/item-rate/data/models/it import { ItemRateReadService } from 'src/modules/item-related/item-rate/data/services/item-rate-read.service'; import { SeasonPeriodPriceUpdatedHandler } from './domain/usecases/handlers/season-period-price-updated.handler'; import { UpdateSeasonPeriodPriceManager } from './domain/usecases/managers/update-season-period-price.manager'; +import { CurrentSeasonPeriodManager } from './domain/usecases/managers/get-current-period.manager'; @Module({ imports: [ @@ -57,6 +58,7 @@ import { UpdateSeasonPeriodPriceManager } from './domain/usecases/managers/updat BatchActiveSeasonPeriodManager, BatchConfirmSeasonPeriodManager, BatchInactiveSeasonPeriodManager, + CurrentSeasonPeriodManager, SeasonPeriodDataService, SeasonPeriodReadService, diff --git a/src/modules/transaction/reconciliation/domain/usecases/managers/batch-confirm-reconciliation.manager.ts b/src/modules/transaction/reconciliation/domain/usecases/managers/batch-confirm-reconciliation.manager.ts index e074b10..36d8fd3 100644 --- a/src/modules/transaction/reconciliation/domain/usecases/managers/batch-confirm-reconciliation.manager.ts +++ b/src/modules/transaction/reconciliation/domain/usecases/managers/batch-confirm-reconciliation.manager.ts @@ -7,6 +7,7 @@ import { BatchResult } from 'src/core/response/domain/ok-response.interface'; import { Injectable } from '@nestjs/common'; import { TransactionEntity } from 'src/modules/transaction/transaction/domain/entities/transaction.entity'; import { TransactionModel } from 'src/modules/transaction/transaction/data/models/transaction.model'; +import { STATUS } from 'src/core/strings/constants/base.constants'; @Injectable() export class BatchConfirmReconciliationManager extends BaseBatchUpdateStatusManager { @@ -19,7 +20,7 @@ export class BatchConfirmReconciliationManager extends BaseBatchUpdateStatusMana reconciliation_mdr: this.data.reconciliation_mdr ?? null, reconciliation_confirm_by: this.user.name, reconciliation_confirm_date: new Date().getTime(), - status: this.oldData.status, + status: STATUS.SETTLED, reconciliation_status: this.dataStatus, payment_total_net_profit: net_profit, payment_date: this.data.payment_date, diff --git a/src/modules/transaction/reconciliation/domain/usecases/managers/confirm-reconciliation.manager.ts b/src/modules/transaction/reconciliation/domain/usecases/managers/confirm-reconciliation.manager.ts index bca70d8..a0885a0 100644 --- a/src/modules/transaction/reconciliation/domain/usecases/managers/confirm-reconciliation.manager.ts +++ b/src/modules/transaction/reconciliation/domain/usecases/managers/confirm-reconciliation.manager.ts @@ -1,5 +1,6 @@ import { Injectable } from '@nestjs/common'; import { BaseUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-update-status.manager'; +import { STATUS } from 'src/core/strings/constants/base.constants'; import { EventTopics, validateRelations, @@ -21,7 +22,7 @@ export class ConfirmReconciliationManager extends BaseUpdateStatusManager { validateData(data: TransactionEntity): Promise { if ( - [STATUS.PENDING, STATUS.REJECTED, STATUS.EXPIRED].includes(data.status) + ![STATUS.PENDING, STATUS.REJECTED, STATUS.EXPIRED].includes(data.status) ) { throw new UnprocessableEntityException({ statusCode: HttpStatus.UNPROCESSABLE_ENTITY, @@ -27,31 +27,9 @@ export class BatchConfirmDataTransactionManager extends BaseBatchUpdateStatusMan }); } - switch (data.status) { - // jika confirm status pending - // maka akan kebuat reconsiliasi - case STATUS.PENDING: - data.reconciliation_status = STATUS.PENDING; - break; - - // jika confirm status rejected - case STATUS.REJECTED: - data.reconciliation_status = STATUS.PENDING; - break; - - // jika confirm status expired - case STATUS.EXPIRED: - break; - - default: - data.reconciliation_status = STATUS.PENDING; - break; - } - - const freeTransaction = data.payment_total < 1; - Object.assign(data, { - status: freeTransaction ? STATUS.ACTIVE : STATUS.PENDING, + status: STATUS.WAITING, + reconciliation_status: STATUS.PENDING, }); return; diff --git a/src/modules/transaction/transaction/domain/usecases/managers/batch-confirm-transaction.manager.ts b/src/modules/transaction/transaction/domain/usecases/managers/batch-confirm-transaction.manager.ts index 4c0a11d..33a70d6 100644 --- a/src/modules/transaction/transaction/domain/usecases/managers/batch-confirm-transaction.manager.ts +++ b/src/modules/transaction/transaction/domain/usecases/managers/batch-confirm-transaction.manager.ts @@ -24,6 +24,11 @@ export class BatchConfirmTransactionManager extends BaseBatchUpdateStatusManager error: 'Unprocessable Entity', }); } + + const freeTransaction = data.payment_total < 1; + Object.assign(data, { + status: freeTransaction ? STATUS.ACTIVE : STATUS.PENDING, + }); return; } diff --git a/src/modules/transaction/transaction/domain/usecases/managers/confirm-data-transaction.manager.ts b/src/modules/transaction/transaction/domain/usecases/managers/confirm-data-transaction.manager.ts index 20d07da..46a720f 100644 --- a/src/modules/transaction/transaction/domain/usecases/managers/confirm-data-transaction.manager.ts +++ b/src/modules/transaction/transaction/domain/usecases/managers/confirm-data-transaction.manager.ts @@ -27,7 +27,7 @@ export class ConfirmDataTransactionManager extends BaseUpdateStatusManager `${this.tableName}.invoice_date`, `${this.tableName}.settlement_date`, `${this.tableName}.created_at`, + `${this.tableName}.creator_id`, `${this.tableName}.creator_name`, + `${this.tableName}.updated_at`, `${this.tableName}.editor_id`, `${this.tableName}.editor_name`, diff --git a/src/modules/transaction/transaction/domain/usecases/managers/update-transaction.manager.ts b/src/modules/transaction/transaction/domain/usecases/managers/update-transaction.manager.ts index db5f517..26eca64 100644 --- a/src/modules/transaction/transaction/domain/usecases/managers/update-transaction.manager.ts +++ b/src/modules/transaction/transaction/domain/usecases/managers/update-transaction.manager.ts @@ -8,6 +8,7 @@ import { columnUniques, validateRelations, } from 'src/core/strings/constants/interface.constants'; +import { TransactionType } from '../../../constants'; @Injectable() export class UpdateTransactionManager extends BaseUpdateManager { @@ -16,6 +17,29 @@ export class UpdateTransactionManager extends BaseUpdateManager { + Object.assign(this.data, { + type: TransactionType.ADMIN, + customer_category_id: this.data.customer_category?.id ?? null, + customer_category_name: this.data.customer_category?.name ?? null, + season_period_id: this.data.season_period?.id ?? null, + season_period_name: this.data.season_period?.holiday_name ?? null, + season_period_type_id: this.data.season_period?.season_type?.id ?? null, + season_period_type_name: + this.data.season_period?.season_type?.name ?? null, + }); + + this.data.items?.map((item) => { + Object.assign(item, { + item_id: item.item.id, + item_name: item.item.name, + item_type: item.item.item_type, + item_price: item.item.base_price, + item_tenant_id: item.item.tenant?.id ?? null, + item_tenant_name: item.item.tenant?.id ?? null, + item_tenant_percentage: item.item.tenant?.share_margin ?? null, + }); + }); + return; }