From 78a2cadb5e5aa42c440d6c6e1067217a99c45250 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Thu, 9 Dec 2021 03:57:34 +0700 Subject: [PATCH] distribute saldo --- src/transaction/coa.service.ts | 18 +++++ src/transaction/transaction.controller.ts | 7 +- src/transaction/transaction.service.ts | 84 +++++++++++++---------- 3 files changed, 71 insertions(+), 38 deletions(-) diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index 10222a9..d828f5f 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -51,6 +51,24 @@ export class CoaService { } } + async findByUserWithRelated(id: string, relatedId: string, typeOfCoa: coaType) { + try { + return await this.coaRepository.findOneOrFail({ user: id, type: typeOfCoa, relatedUser:relatedId }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Coa Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } + async findByName(name: string) { try { return await this.coaRepository.findOneOrFail({ name: name }); diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 87aa3d7..801fcc7 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -23,8 +23,11 @@ export class TransactionController { constructor(private readonly transactionService: TransactionService) {} @Post('distribute') - create(@Body() createTransactionDto: DistributeTransactionDto) { - return this.transactionService.distributeDeposit(createTransactionDto); + create( + @Body() createTransactionDto: DistributeTransactionDto, + @Request() req + ) { + return this.transactionService.distributeDeposit(createTransactionDto,req.user); } @Post('distribute-admin') diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index b5590db..0313d0f 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -85,7 +85,6 @@ export class TransactionService { credit: transactionData.amount }] }); - }); return true; @@ -135,49 +134,62 @@ export class TransactionService { return true; } - async distributeDeposit(distributeTransactionDto: DistributeTransactionDto) { + async distributeDeposit(distributeTransactionDto: DistributeTransactionDto,currentUser:any) { + //GET USER + const userData = await this.userService.findByUsername(currentUser.username); + // GET COA - const coaSender = await this.coaService.findByUser( - 'id_user', + const coaSenderWallet = await this.coaService.findByUser( + userData.id, coaType.WALLET, ); - const coaReciever = await this.coaService.findByUser( - 'id_user', + + const coaAP = await this.coaService.findByUserWithRelated( + distributeTransactionDto.destination, + userData.id, + coaType.ACCOUNT_PAYABLE, + ); + + const coaReceiverWallet = await this.coaService.findByUser( + distributeTransactionDto.destination, coaType.WALLET, ); + const coaAR = await this.coaService.findByUserWithRelated( + distributeTransactionDto.destination, + userData.id, + coaType.ACCOUNT_RECEIVABLE, + ); + await this.connection.transaction(async (manager) => { - //INSERT TRANSACTION - const transactionSaved = await manager.insert(Transactions, { - amount: distributeTransactionDto.amount, - user: 'id_user', - userDestination: distributeTransactionDto.destination, - status: statusTransaction.SUCCESS, - type: typeTransaction.DISTRIBUTION, + let transactionData = new Transactions(); + transactionData.id = uuid.v4(); + transactionData.amount = distributeTransactionDto.amount, + transactionData.user = userData.id, + transactionData.status = statusTransaction.SUCCESS, + transactionData.type = typeTransaction.DISTRIBUTION, + + await manager.insert(Transactions, transactionData); + + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager:manager, + transaction: transactionData, + amount: transactionData.amount, + journals: [{ + coa_id: coaSenderWallet.id, + debit: transactionData.amount + }, { + coa_id: coaReceiverWallet.id, + credit: transactionData.amount + }, { + coa_id: coaAR.id, + debit: transactionData.amount + }, { + coa_id: coaAP.id, + credit: transactionData.amount + }] }); - - //INSERT TRANSACTION JOURNAL FOR SENDER - const journalSender = await manager.insert(TransactionJournal, { - amount: distributeTransactionDto.amount, - transaction: transactionSaved.identifiers[0], - coa: coaSender, - type: balanceType.CREDIT, - }); - - //INSERT TRANSACTION JOURNAL FOR RECEIVER - const journalReceiver = await manager.insert(TransactionJournal, { - amount: distributeTransactionDto.amount, - transaction: transactionSaved.identifiers[0], - coa: coaReciever, - type: balanceType.DEBIT, - }); - - //UPDATE AMOUNT COA SENDER - coaSender.amount = coaSender.amount - distributeTransactionDto.amount; - await manager.save(coaSender); - - coaReciever.amount = coaReciever.amount + distributeTransactionDto.amount; - await manager.save(coaReciever); }); return true;