From 4befb8d9fd1aa960d6d560c25adddcbc7f40599c Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 28 Jun 2022 13:51:18 +0700 Subject: [PATCH 1/8] fix: callback ppob --- .../entities/callback-partner.entity.ts | 18 +++++ src/transaction/transaction.controller.ts | 25 +++++++ src/transaction/transaction.module.ts | 2 + src/transaction/transaction.service.ts | 65 +++++++++++++++++-- src/users/users.service.ts | 2 +- 5 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 src/transaction/entities/callback-partner.entity.ts diff --git a/src/transaction/entities/callback-partner.entity.ts b/src/transaction/entities/callback-partner.entity.ts new file mode 100644 index 0000000..f7c03b4 --- /dev/null +++ b/src/transaction/entities/callback-partner.entity.ts @@ -0,0 +1,18 @@ +import { Column, Entity, ManyToOne, OneToMany } from 'typeorm'; +import { BaseModel } from '../../config/basemodel.entity'; +import { statusTransaction, typeTransaction } from '../../helper/enum-list'; +import { ProductHistoryPrice } from '../../product/entities/product-history-price.entity'; +import { UserDetail } from '../../users/entities/user_detail.entity'; +import { TransactionJournal } from './transaction-journal.entity'; + +@Entity() +export class CallbackPartner extends BaseModel { + @Column() + trx_id: string; + + @Column() + partner_trx_id: string; + + @Column() + url: string; +} diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 0ebaf40..67ac85d 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -132,6 +132,31 @@ export class TransactionController { }; } + @Get('resend-partner/success/:code') + async resendSuccess(@Request() req, @Param('code') code: string) { + const data = await this.transactionService.resendOrderToPartner(code, true); + + return { + data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Get('resend-partner/failed/:code') + async resendFailed(@Request() req, @Param('code') code: string) { + const data = await this.transactionService.resendOrderToPartner( + code, + false, + ); + + return { + data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get('history') async getHistoryTransactionUser( @Query('page') page: number, diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index a384646..5e7c0ee 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -11,6 +11,7 @@ import { ProductModule } from '../product/product.module'; import { UsersModule } from 'src/users/users.module'; import { ConfigurableModule } from '../configurable/configurable.module'; import { CheckBillHistory } from './entities/check-bill-history.entity'; +import { CallbackPartner } from './entities/callback-partner.entity'; @Module({ imports: [ @@ -19,6 +20,7 @@ import { CheckBillHistory } from './entities/check-bill-history.entity'; TransactionJournal, Transactions, CheckBillHistory, + CallbackPartner, ]), ProductModule, ConfigurableModule, diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 2c3abb4..1ecff78 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -29,6 +29,7 @@ import { doTransaction } from '../helper/irs-api'; import { ProductHistoryPrice } from '../product/entities/product-history-price.entity'; import axios from 'axios'; import { CheckBillHistory } from './entities/check-bill-history.entity'; +import { CallbackPartner } from './entities/callback-partner.entity'; @Injectable() export class TransactionService { @@ -43,6 +44,8 @@ export class TransactionService { private coaRepository: Repository, @InjectRepository(CheckBillHistory) private checkBillHistoryRepository: Repository, + @InjectRepository(CallbackPartner) + private callbackPartnerRepository: Repository, private coaService: CoaService, private productService: ProductService, private productHistoryPriceService: ProductHistoryPriceService, @@ -1135,7 +1138,7 @@ export class TransactionService { if (userData.partner) { const message = `Transaksi ${product.code} dengan tujuan ${dataTransaction.destination} telah gagal.`; this.callbackToPartner( - userData.id, + userData.partner.id, message, dataTransaction.partner_trx_id, dataTransaction.amount, @@ -1219,7 +1222,7 @@ export class TransactionService { if (userData.partner) { const message = `Transaksi ${product.code} dengan tujuan ${dataTransaction.destination} telah berhasil.`; this.callbackToPartner( - userData.id, + userData.partner.id, message, dataTransaction.partner_trx_id, dataTransaction.amount, @@ -1231,6 +1234,53 @@ export class TransactionService { } } + async resendOrderToPartner(supplier_trx_id: string, status: boolean){ + const dataTransaction = await this.transactionRepository.findOne({ + where: { + supplier_trx_id: supplier_trx_id, + }, + relations: ['product_price'], + }); + + const userData = await this.userService.findExist(dataTransaction.user); + + const product_price = await this.productHistoryPriceService.findById( + dataTransaction.product_price.id, + ); + + const product = await this.productService.findOneById( + product_price.product.id, + ); + + if (status) { + const message = `Transaksi ${product.code} dengan tujuan ${dataTransaction.destination} telah berhasil.`; + await this.callbackToPartner( + userData.partner.id, + message, + dataTransaction.partner_trx_id, + dataTransaction.amount, + product.code, + dataTransaction.destination, + dataTransaction.seri_number, + 'berhasil', + ); + } else { + const message = `Transaksi ${product.code} dengan tujuan ${dataTransaction.destination} telah gagal.`; + this.callbackToPartner( + userData.partner.id, + message, + dataTransaction.partner_trx_id, + dataTransaction.amount, + product.code, + dataTransaction.destination, + '-', + 'gagal', + ); + } + + + } + async callbackToPartner( partnerId: string, message: string, @@ -1242,9 +1292,14 @@ export class TransactionService { status: string, ) { const partnerData = await this.userService.findPartner(partnerId); - const res = await axios.get( - `${partnerData.callback_url}?status=${status}&memberID=${partnerData.code}&trxid=${trxId}&harga=${harga}&product=${productCode}&dest=${destination}&seriNumber=${seriNumber}&message=${message}`, - ); + const url = `${partnerData.callback_url}?status=${status}&memberID=${partnerData.code}&trxid=${trxId}&harga=${harga}&product=${productCode}&dest=${destination}&seriNumber=${seriNumber}&message=${message}`; + const result = await this.callbackPartnerRepository.insert({ + partner_trx_id: partnerId, + trx_id: trxId, + url: url, + }); + const res = await axios.get(url); + return res; } async withdrawBenefit(user) { diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 6382310..285c036 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -366,7 +366,7 @@ export class UsersService { where: { id: id, }, - relations: ['superior', 'roles'], + relations: ['superior', 'roles', 'partner'], }); } catch (e) { if (e instanceof EntityNotFoundError) { From c2b4b5ec30a44c4122fc5687ee863004e455df1d Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 28 Jun 2022 14:58:05 +0700 Subject: [PATCH 2/8] fix: rollback jurnal --- src/transaction/transaction.controller.ts | 11 +++++- src/transaction/transaction.service.ts | 46 +++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 67ac85d..4f37830 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -132,10 +132,19 @@ export class TransactionController { }; } + @Get('rollback-jurnal/:trxId') + async rollbackJurnal(@Request() req, @Param('trxId') trxId: string) { + const data = await this.transactionService.rollbackJurnal(trxId); + return { + data, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get('resend-partner/success/:code') async resendSuccess(@Request() req, @Param('code') code: string) { const data = await this.transactionService.resendOrderToPartner(code, true); - return { data, statusCode: HttpStatus.OK, diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 1ecff78..b2fce8c 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1302,6 +1302,52 @@ export class TransactionService { return res; } + async rollbackJurnal(trxId: string) { + const dataTransaction = await this.transactionRepository.findOne({ + where: { + id: trxId, + }, + relations: ['product_price'], + }); + + const dataTransactionJurnal = await this.transactionJournalRepository.find({ + where: { + transaction_head: trxId, + }, + relations: ['coa'], + }); + + let dataRollbackJurnal = []; + + dataTransactionJurnal.map((it) => { + let data = { + coa_id: it.coa.id, + }; + + if (it.type == 0) { + data['credit'] = it.amount; + } else { + data['debit'] = it.amount; + } + + dataRollbackJurnal.push(data); + }); + + try { + await this.connection.transaction(async (manager) => { + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager: manager, + transaction: dataTransaction, + amount: dataTransaction.amount, + journals: dataRollbackJurnal, + }); + }); + } catch (e) { + throw e; + } + } + async withdrawBenefit(user) { const userData = await this.userService.findExist(user); From 953161c4b242fce5888a7e52df71e1092ae7857a Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 28 Jun 2022 15:14:51 +0700 Subject: [PATCH 3/8] fix: rollback jurnal --- src/transaction/transaction.service.ts | 50 +++++++++++++++++--------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index b2fce8c..9383a0b 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1310,12 +1310,26 @@ export class TransactionService { relations: ['product_price'], }); - const dataTransactionJurnal = await this.transactionJournalRepository.find({ - where: { - transaction_head: trxId, - }, - relations: ['coa'], - }); + let dataTransactionJurnal; + if (dataTransaction.type == typeTransaction.ORDER) { + dataTransactionJurnal = await this.transactionJournalRepository.find({ + where: { + transaction_head: trxId, + }, + relations: ['coa'], + skip: 4, + order: { + createdAt: 'ASC', + }, + }); + } else { + dataTransactionJurnal = await this.transactionJournalRepository.find({ + where: { + transaction_head: trxId, + }, + relations: ['coa'], + }); + } let dataRollbackJurnal = []; @@ -1333,18 +1347,20 @@ export class TransactionService { dataRollbackJurnal.push(data); }); - try { - await this.connection.transaction(async (manager) => { - await this.accountingTransaction({ - createTransaction: false, - transactionalEntityManager: manager, - transaction: dataTransaction, - amount: dataTransaction.amount, - journals: dataRollbackJurnal, + if (dataRollbackJurnal.length > 0) { + try { + await this.connection.transaction(async (manager) => { + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager: manager, + transaction: dataTransaction, + amount: dataTransaction.amount, + journals: dataRollbackJurnal, + }); }); - }); - } catch (e) { - throw e; + } catch (e) { + throw e; + } } } From 359b375556ee72627b3841947654614971ba31d7 Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 28 Jun 2022 15:40:01 +0700 Subject: [PATCH 4/8] fix: callbacktransction --- src/transaction/transaction.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 9383a0b..fe65019 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1180,7 +1180,8 @@ export class TransactionService { const coaExpense = await this.coaService.findByName( `${coaType[coaType.EXPENSE]}-SYSTEM`, ); - if (userData.partner != null) { + + if (userData.partner == null) { //GET SALES supervisorData = await this.calculateCommission( supervisorData, From 47bf474a6af35cebbbba1ddeacd5afc2b85fdce0 Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 28 Jun 2022 16:22:01 +0700 Subject: [PATCH 5/8] fix: callbacktransction --- src/transaction/transaction.service.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index fe65019..250f2aa 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1159,7 +1159,13 @@ export class TransactionService { }); dataTransaction.status = statusTransaction.SUCCESS; - dataTransaction.seri_number = callback['sn']; + if(callback['sn']){ + dataTransaction.seri_number = callback['sn']; + } else { + const response = callback['message']; + const responseBaru = response.split(' '); + dataTransaction.seri_number = responseBaru[10]; + } dataTransaction.callback_json = callback; const userData = await this.userService.findExist(dataTransaction.user); @@ -1293,7 +1299,14 @@ export class TransactionService { status: string, ) { const partnerData = await this.userService.findPartner(partnerId); - const url = `${partnerData.callback_url}?status=${status}&memberID=${partnerData.code}&trxid=${trxId}&harga=${harga}&product=${productCode}&dest=${destination}&seriNumber=${seriNumber}&message=${message}`; + const userData = await this.userService.findOneByPartner(partnerId); + + const coaAccount = await this.coaService.findByUser( + userData.id, + coaType.WALLET, + ); + + const url = `${partnerData.callback_url}?status=${status}&memberID=${partnerData.code}&trxid=${trxId}&harga=${harga}&product=${productCode}&dest=${destination}&seriNumber=${seriNumber}&message=${message}&saldo=${coaAccount.amount}`; const result = await this.callbackPartnerRepository.insert({ partner_trx_id: partnerId, trx_id: trxId, From 5d3b8dbcb45ba55897ba0e0e663b695027db4afb Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 28 Jun 2022 17:06:16 +0700 Subject: [PATCH 6/8] fix: callbacktransction --- src/transaction/transaction.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 250f2aa..c4744f4 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1164,7 +1164,7 @@ export class TransactionService { } else { const response = callback['message']; const responseBaru = response.split(' '); - dataTransaction.seri_number = responseBaru[10]; + dataTransaction.seri_number = responseBaru[9]; } dataTransaction.callback_json = callback; From 104067f2634e280d3ce593dac8dd1dd1a5541ad5 Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 28 Jun 2022 17:10:07 +0700 Subject: [PATCH 7/8] fix: callbacktransction --- src/transaction/transaction.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index c4744f4..6d87697 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1164,7 +1164,8 @@ export class TransactionService { } else { const response = callback['message']; const responseBaru = response.split(' '); - dataTransaction.seri_number = responseBaru[9]; + dataTransaction.seri_number = + responseBaru[10].length > 1 ? responseBaru[10] : responseBaru[9]; } dataTransaction.callback_json = callback; From fe7702836e051af28ffb930db65d545187fb0bab Mon Sep 17 00:00:00 2001 From: ilham Date: Wed, 29 Jun 2022 18:07:07 +0700 Subject: [PATCH 8/8] fix: rollback --- src/transaction/transaction.controller.ts | 6 +- src/transaction/transaction.service.ts | 70 ++++++++++------------- 2 files changed, 33 insertions(+), 43 deletions(-) diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 4f37830..8cac296 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -132,9 +132,9 @@ export class TransactionController { }; } - @Get('rollback-jurnal/:trxId') - async rollbackJurnal(@Request() req, @Param('trxId') trxId: string) { - const data = await this.transactionService.rollbackJurnal(trxId); + @Post('rollback-jurnal') + async rollbackJurnal(@Body() request, @Request() req) { + const data = await this.transactionService.rollbackJurnal(request.trxId); return { data, statusCode: HttpStatus.OK, diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 6d87697..e33c081 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -3,7 +3,7 @@ import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; -import { Between, Connection, EntityNotFoundError, Repository } from 'typeorm'; +import { Between, Connection, EntityNotFoundError, In, Repository } from 'typeorm'; import { COA } from './entities/coa.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; @@ -1317,35 +1317,25 @@ export class TransactionService { return res; } - async rollbackJurnal(trxId: string) { - const dataTransaction = await this.transactionRepository.findOne({ - where: { - id: trxId, - }, - relations: ['product_price'], - }); + async rollbackJurnal(trxId: string[]) { + // const dataTransaction = await this.transactionRepository.findOne({ + // where: { + // id: trxId, + // }, + // relations: ['product_price'], + // }); - let dataTransactionJurnal; - if (dataTransaction.type == typeTransaction.ORDER) { - dataTransactionJurnal = await this.transactionJournalRepository.find({ - where: { - transaction_head: trxId, - }, - relations: ['coa'], - skip: 4, - order: { - createdAt: 'ASC', - }, - }); - } else { - dataTransactionJurnal = await this.transactionJournalRepository.find({ - where: { - transaction_head: trxId, - }, - relations: ['coa'], - }); + if (trxId.length % 2 != 0) { + throw Error("Not Balance") } + const dataTransactionJurnal = await this.transactionJournalRepository.find({ + where: { + id: In(trxId), + }, + relations: ['coa'], + }); + let dataRollbackJurnal = []; dataTransactionJurnal.map((it) => { @@ -1362,20 +1352,20 @@ export class TransactionService { dataRollbackJurnal.push(data); }); - if (dataRollbackJurnal.length > 0) { - try { - await this.connection.transaction(async (manager) => { - await this.accountingTransaction({ - createTransaction: false, - transactionalEntityManager: manager, - transaction: dataTransaction, - amount: dataTransaction.amount, - journals: dataRollbackJurnal, - }); + const dataTransaction = new Transactions(); + + try { + await this.connection.transaction(async (manager) => { + await this.accountingTransaction({ + createTransaction: false, + transactionalEntityManager: manager, + transaction: dataTransaction, + amount: dataTransaction.amount, + journals: dataRollbackJurnal, }); - } catch (e) { - throw e; - } + }); + } catch (e) { + throw e; } }