diff --git a/src/modules/configuration/google-calendar/google-calendar.module.ts b/src/modules/configuration/google-calendar/google-calendar.module.ts index 24fde4b..75a10a2 100644 --- a/src/modules/configuration/google-calendar/google-calendar.module.ts +++ b/src/modules/configuration/google-calendar/google-calendar.module.ts @@ -10,7 +10,7 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; import { TransactionItemModel } from 'src/modules/transaction/transaction/data/models/transaction-item.model'; import { TransactionTaxModel } from 'src/modules/transaction/transaction/data/models/transaction-tax.model'; - +import { CouchModule } from 'src/modules/configuration/couch/couch.module'; @Module({ imports: [ ConfigModule.forRoot(), @@ -19,6 +19,7 @@ import { TransactionTaxModel } from 'src/modules/transaction/transaction/data/mo CONNECTION_NAME.DEFAULT, ), CqrsModule, + CouchModule, ], controllers: [GoogleCalendarController], providers: [ diff --git a/src/modules/configuration/mail/mail.module.ts b/src/modules/configuration/mail/mail.module.ts index 412b0c3..ab13a2e 100644 --- a/src/modules/configuration/mail/mail.module.ts +++ b/src/modules/configuration/mail/mail.module.ts @@ -10,7 +10,7 @@ import { TransactionDataService } from 'src/modules/transaction/transaction/data import { PaymentTransactionHandler } from './domain/handlers/payment-transaction.handler'; import { MailTemplateController } from './infrastructure/mail.controller'; import { PdfMakeManager } from '../export/domain/managers/pdf-make.manager'; - +import { CouchModule } from '../couch/couch.module'; @Module({ imports: [ ConfigModule.forRoot(), @@ -19,6 +19,7 @@ import { PdfMakeManager } from '../export/domain/managers/pdf-make.manager'; CONNECTION_NAME.DEFAULT, ), CqrsModule, + CouchModule, ], controllers: [MailTemplateController], providers: [ diff --git a/src/modules/queue/queue.module.ts b/src/modules/queue/queue.module.ts index b974dd3..172a800 100644 --- a/src/modules/queue/queue.module.ts +++ b/src/modules/queue/queue.module.ts @@ -39,7 +39,7 @@ import { ItemQueueModel } from '../item-related/item-queue/data/models/item-queu import { QueueTimeFormula } from './domain/usecases/formula/queue-time.formula'; import { QueueJobController } from './infrastructure/controllers/queue-job.controller'; import { GenerateQueueManager } from './domain/usecases/generate-queue.manager'; - +import { CouchModule } from 'src/modules/configuration/couch/couch.module'; @Module({ imports: [ ConfigModule.forRoot(), @@ -57,6 +57,7 @@ import { GenerateQueueManager } from './domain/usecases/generate-queue.manager'; CONNECTION_NAME.DEFAULT, ), CqrsModule, + CouchModule, ], controllers: [QueueController, QueueAdminController, QueueJobController], providers: [ diff --git a/src/modules/transaction/reconciliation/reconciliation.module.ts b/src/modules/transaction/reconciliation/reconciliation.module.ts index e47d163..17d27ef 100644 --- a/src/modules/transaction/reconciliation/reconciliation.module.ts +++ b/src/modules/transaction/reconciliation/reconciliation.module.ts @@ -19,13 +19,13 @@ import { BatchCancelReconciliationManager } from './domain/usecases/managers/bat import { BatchConfirmReconciliationManager } from './domain/usecases/managers/batch-confirm-reconciliation.manager'; import { RecapReconciliationManager } from './domain/usecases/managers/recap-reconciliation.manager'; import { RecapPosTransactionHandler } from './domain/usecases/handlers/recap-pos-transaction.handler'; -import { SalesPriceFormulaDataService } from '../sales-price-formula/data/services/sales-price-formula-data.service'; - +import { CouchModule } from 'src/modules/configuration/couch/couch.module'; @Module({ imports: [ ConfigModule.forRoot(), TypeOrmModule.forFeature([TransactionModel], CONNECTION_NAME.DEFAULT), CqrsModule, + CouchModule, ], controllers: [ReconciliationDataController, ReconciliationReadController], providers: [ diff --git a/src/modules/transaction/refund/refund.module.ts b/src/modules/transaction/refund/refund.module.ts index c45fc5a..922dd14 100644 --- a/src/modules/transaction/refund/refund.module.ts +++ b/src/modules/transaction/refund/refund.module.ts @@ -23,7 +23,7 @@ import { CancelRefundManager } from './domain/usecases/managers/cancel-refund.ma import { RefundItemModel } from './data/models/refund-item.model'; import { TransactionDataService } from '../transaction/data/services/transaction-data.service'; import { TransactionModel } from '../transaction/data/models/transaction.model'; - +import { CouchModule } from 'src/modules/configuration/couch/couch.module'; @Module({ imports: [ ConfigModule.forRoot(), @@ -32,6 +32,7 @@ import { TransactionModel } from '../transaction/data/models/transaction.model'; CONNECTION_NAME.DEFAULT, ), CqrsModule, + CouchModule, ], controllers: [RefundDataController, RefundReadController], providers: [ diff --git a/src/modules/transaction/transaction/data/services/transaction-data.service.ts b/src/modules/transaction/transaction/data/services/transaction-data.service.ts index 827be1c..70c8dc4 100644 --- a/src/modules/transaction/transaction/data/services/transaction-data.service.ts +++ b/src/modules/transaction/transaction/data/services/transaction-data.service.ts @@ -4,12 +4,14 @@ import { InjectRepository } from '@nestjs/typeorm'; import { TransactionModel } from '../models/transaction.model'; import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; import { Repository } from 'typeorm'; +import { CouchService } from 'src/modules/configuration/couch/data/services/couch.service'; @Injectable() export class TransactionDataService extends BaseDataService { constructor( @InjectRepository(TransactionModel, CONNECTION_NAME.DEFAULT) private repo: Repository, + private couchService: CouchService, ) { super(repo); } @@ -20,4 +22,14 @@ export class TransactionDataService extends BaseDataService { where: { id: booking_id }, }); } + + async saveTransactionToCouch(transaction) { + const id = transaction.id ?? transaction._id; + const couchData = await this.couchService.getDoc(id, 'transaction'); + if (!couchData) { + await this.couchService.createDoc(transaction, 'transaction'); + } else { + await this.couchService.updateDoc(transaction, 'transaction'); + } + } } diff --git a/src/modules/transaction/transaction/data/services/transaction-read.service.ts b/src/modules/transaction/transaction/data/services/transaction-read.service.ts index 7efd6bf..47aec59 100644 --- a/src/modules/transaction/transaction/data/services/transaction-read.service.ts +++ b/src/modules/transaction/transaction/data/services/transaction-read.service.ts @@ -30,4 +30,52 @@ export class TransactionReadService extends BaseReadService { return transactions; } + + async getSummary(posId: string, startDate: string) { + const query = `select payment_type_counter, payment_type_method_name, sum(payment_total) payment_total, sum(payment_total_pay) payment_total_pay + from transactions t + where 1=1 + and t.creator_counter_no IN (${posId}) + and invoice_date = '${startDate}' + and status = 'settled' + group by payment_type_counter, payment_type_method_name;`; + const transactions = await this.repo.query(query); + + const qtyQuery = `select ti.item_name, sum(ti.qty) total_qty, count(ti.item_name), sum(ti.qty), string_agg(distinct ti.item_price::text, '') price, + sum(payment_total) payment_total, sum(payment_total_pay) payment_total_pay + from transactions t + inner join transaction_items ti on t.id = ti.transaction_id + where t.creator_counter_no IN (${posId}) + and invoice_date = '${startDate}' + and t.status = 'settled' + group by ti.item_name`; + const qtyTransactions = await this.repo.query(qtyQuery); + + return { payment: transactions, qty: qtyTransactions }; + } + + async getLastTransactionByPos( + posId: string, + ): Promise { + const transaction = await this.repo.findOne({ + select: [ + 'id', + 'created_at', + 'updated_at', + 'status', + 'invoice_code', + 'creator_counter_no', + 'invoice_date', + 'payment_total', + ], + where: { + creator_counter_no: parseInt(posId), + }, + order: { + created_at: 'DESC', + }, + }); + + return transaction; + } } diff --git a/src/modules/transaction/transaction/domain/usecases/transaction-data.orchestrator.ts b/src/modules/transaction/transaction/domain/usecases/transaction-data.orchestrator.ts index c717131..0a6e113 100644 --- a/src/modules/transaction/transaction/domain/usecases/transaction-data.orchestrator.ts +++ b/src/modules/transaction/transaction/domain/usecases/transaction-data.orchestrator.ts @@ -141,4 +141,10 @@ export class TransactionDataOrchestrator { await this.batchConfirmDataManager.execute(); return this.batchConfirmDataManager.getResult(); } + + async saveTransactionToCouch(transaction: any[]) { + for (const t of transaction) { + await this.serviceData.saveTransactionToCouch(t); + } + } } diff --git a/src/modules/transaction/transaction/domain/usecases/transaction-read.orchestrator.ts b/src/modules/transaction/transaction/domain/usecases/transaction-read.orchestrator.ts index cbc1912..b212bbd 100644 --- a/src/modules/transaction/transaction/domain/usecases/transaction-read.orchestrator.ts +++ b/src/modules/transaction/transaction/domain/usecases/transaction-read.orchestrator.ts @@ -7,6 +7,8 @@ import { BaseReadOrchestrator } from 'src/core/modules/domain/usecase/orchestrat import { DetailTransactionManager } from './managers/detail-transaction.manager'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; import { PriceCalculator } from './calculator/price.calculator'; +import { In } from 'typeorm'; +import * as moment from 'moment'; @Injectable() export class TransactionReadOrchestrator extends BaseReadOrchestrator { @@ -26,6 +28,16 @@ export class TransactionReadOrchestrator extends BaseReadOrchestrator { this.detailManager.setData(dataId); this.detailManager.setService(this.serviceData, TABLE_NAME.TRANSACTION); @@ -50,17 +62,24 @@ export class TransactionReadOrchestrator extends BaseReadOrchestrator { const transactions = await this.serviceData.getManyByOptions({ where: { - is_recap_transaction: false, + // is_recap_transaction: false, + id: In(this.ids), }, relations: ['items', 'items.bundling_items'], }); + console.log(transactions.length); + // return; + for (const transaction of transactions) { try { const price = await this.calculator.calculate(transaction); diff --git a/src/modules/transaction/transaction/infrastructure/transaction-data.controller.ts b/src/modules/transaction/transaction/infrastructure/transaction-data.controller.ts index d9c7269..e51690d 100644 --- a/src/modules/transaction/transaction/infrastructure/transaction-data.controller.ts +++ b/src/modules/transaction/transaction/infrastructure/transaction-data.controller.ts @@ -1,4 +1,5 @@ import { + BadRequestException, Body, Controller, Delete, @@ -7,17 +8,19 @@ import { Post, Put, Res, + UseGuards, } from '@nestjs/common'; import { Response } from 'express'; import { TransactionDataOrchestrator } from '../domain/usecases/transaction-data.orchestrator'; import { TransactionDto } from './dto/transaction.dto'; import { MODULE_NAME } from 'src/core/strings/constants/module.constants'; -import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; +import { ApiBearerAuth, ApiBody, ApiTags } from '@nestjs/swagger'; import { TransactionEntity } from '../domain/entities/transaction.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'; import { DownloadPdfDto } from './dto/donwload-pdf.dto'; +import { OtpAuthGuard } from 'src/modules/configuration/otp-verification/infrastructure/guards/otp-auth-guard'; @ApiTags(`${MODULE_NAME.TRANSACTION.split('-').join(' ')} - data`) @Controller(`v1/${MODULE_NAME.TRANSACTION}`) @@ -91,4 +94,29 @@ export class TransactionDataController { async delete(@Param('id') dataId: string): Promise { return await this.orchestrator.delete(dataId); } + + @Post('save-to-couch') + @ApiBody({ + schema: { + type: 'array', + items: { + type: 'object', + }, + }, + }) + @Public(true) + @UseGuards(OtpAuthGuard) + async saveToCouch(@Body() body: any[]) { + try { + await this.orchestrator.saveTransactionToCouch(body); + return { + message: 'Success', + }; + } catch (error) { + throw new BadRequestException({ + message: error.message, + error: error.stack, + }); + } + } } diff --git a/src/modules/transaction/transaction/infrastructure/transaction-read.controller.ts b/src/modules/transaction/transaction/infrastructure/transaction-read.controller.ts index 8446857..2a4b499 100644 --- a/src/modules/transaction/transaction/infrastructure/transaction-read.controller.ts +++ b/src/modules/transaction/transaction/infrastructure/transaction-read.controller.ts @@ -28,6 +28,12 @@ export class TransactionReadController { return await this.orchestrator.detail(id); } + @Public(true) + @Get('summary/:posId') + async summary(@Param('posId') posId: string) { + return await this.orchestrator.summary(posId); + } + @Public(true) @Get('dummy/:id') async calculate(@Param('id') id: string): Promise { diff --git a/src/modules/transaction/transaction/transaction.module.ts b/src/modules/transaction/transaction/transaction.module.ts index af14bef..66f58d9 100644 --- a/src/modules/transaction/transaction/transaction.module.ts +++ b/src/modules/transaction/transaction/transaction.module.ts @@ -47,6 +47,9 @@ import { TransactionDemographyModel } from './data/models/transaction-demography import { PriceCalculator } from './domain/usecases/calculator/price.calculator'; import { ItemModel } from 'src/modules/item-related/item/data/models/item.model'; import { CouchModule } from 'src/modules/configuration/couch/couch.module'; +import { JWT_EXPIRED } from 'src/core/sessions/constants'; +import { JWT_SECRET } from 'src/core/sessions/constants'; +import { JwtModule } from '@nestjs/jwt'; @Module({ exports: [ @@ -56,6 +59,10 @@ import { CouchModule } from 'src/modules/configuration/couch/couch.module'; ], imports: [ ConfigModule.forRoot(), + JwtModule.register({ + secret: JWT_SECRET, + signOptions: { expiresIn: JWT_EXPIRED }, + }), TypeOrmModule.forFeature( [ TransactionModel,