diff --git a/src/transaction/entities/transactions.entity.ts b/src/transaction/entities/transactions.entity.ts index fb1aed7..493992f 100644 --- a/src/transaction/entities/transactions.entity.ts +++ b/src/transaction/entities/transactions.entity.ts @@ -10,6 +10,9 @@ export class Transactions extends BaseModel { @Column() amount: number; + @Column() + balance_remaining: number; + @Column() status: statusTransaction; diff --git a/src/transaction/ppob_callback.controller.ts b/src/transaction/ppob_callback.controller.ts index 983d833..99f3cc7 100644 --- a/src/transaction/ppob_callback.controller.ts +++ b/src/transaction/ppob_callback.controller.ts @@ -1,7 +1,15 @@ -import { Controller, Get, HttpStatus, Logger, Req } from '@nestjs/common'; +import { + Controller, + Get, + HttpException, + HttpStatus, + Logger, + Req, +} from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { FastifyRequest } from 'fastify'; import { Public } from '../auth/public.decorator'; +import { EntityNotFoundError } from 'typeorm'; @Controller({ path: 'ppob_callback', @@ -20,15 +28,14 @@ export class PpobCallbackController { if (response['statuscode'] == 2) { //TODO: UPDATE GAGAL await this.transactionService.checkCallbackOrderFailed( - response['clientid'], - response, - ); + response['clientid'], + response, + ); } else { - //TODO: UPDATE BERHASIL await this.transactionService.checkCallbackOrderSuccess( - response['clientid'], - response, + response['clientid'], + response, ); } } @@ -36,75 +43,92 @@ export class PpobCallbackController { @Public() @Get('/metro') async getMetro(@Req() request: FastifyRequest) { - const response = request.query; + try { + const response = request.query; - if (response['message'].toLowerCase().includes('cek tagihan')) { - if (response['status'] != 20) { - //TODO: UPDATE GAGAL - await this.transactionService.updateBill( + if (response['message'].toLowerCase().includes('cek tagihan')) { + if (response['status'] != 20) { + //TODO: UPDATE GAGAL + await this.transactionService.updateBill( response['refid'], null, null, false, response['message'], - ); + ); - return { - statusCode: HttpStatus.OK, - message: 'success', - }; - } + return { + statusCode: HttpStatus.OK, + message: 'success', + }; + } - const splitMessage = response['message'].split('"'); - //TODO: UPDATE BERHASIL - await this.transactionService.updateBill( + const splitMessage = response['message'].split('"'); + + //TODO: UPDATE BERHASIL + await this.transactionService.updateBill( response['refid'], Number(splitMessage[21].replace(/^\D+/g, '')), Number(splitMessage[17].replace(/^\D+/g, '')), true, response['message'], - ); - // - } else { - console.log('statusapani', response['status']); - console.log('statusapani2', response.toString()); - if (response['status'].toString() != '20') { - console.log("masukkesiniga", "msk") - //TODO: UPDATE GAGAL - const updateTransaction = - await this.transactionService.callbackOrderFailed( - response['refid'], - response, - ); - - return { - updateTransaction, - statusCode: HttpStatus.BAD_REQUEST, - message: 'failed to proccess', - }; + ); + // } else { + console.log('statusapani', response['status']); + console.log('statusapani2', response.toString()); - //TODO: UPDATE BERHASIL - const updateTransaction = - await this.transactionService.callbackOrderSuccess( - response['refid'], - response, - ); + if (response['status'].toString() != '20') { + //TODO: UPDATE GAGAL + const updateTransaction = + await this.transactionService.callbackOrderFailed( + response['refid'], + response, + ); - return { - updateTransaction, - statusCode: HttpStatus.OK, - message: 'success', - }; + return { + updateTransaction, + statusCode: HttpStatus.BAD_REQUEST, + message: 'failed to proccess', + }; + } else { + + //TODO: UPDATE BERHASIL + const updateTransaction = + await this.transactionService.callbackOrderSuccess( + response['refid'], + response, + ); + + return { + updateTransaction, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + } + + this.logger.log({ + requestQuery: request.query, + }); + + return { + statusCode: HttpStatus.OK, + message: 'success', + }; + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Error callback', + message: e + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; } } - this.logger.log({ - requestQuery: request.query, - }); - - return { - statusCode: HttpStatus.OK, - message: 'success', - }; } } diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 5e7c0ee..f797d0b 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -12,6 +12,7 @@ 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'; +import {ProductHistoryPrice} from "../product/entities/product-history-price.entity"; @Module({ imports: [ @@ -21,6 +22,7 @@ import { CallbackPartner } from './entities/callback-partner.entity'; Transactions, CheckBillHistory, CallbackPartner, + ProductHistoryPrice, ]), ProductModule, ConfigurableModule, diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 793cb68..5271d07 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -35,6 +35,8 @@ export class TransactionService { private transactionRepository: Repository, @InjectRepository(TransactionJournal) private transactionJournalRepository: Repository, + @InjectRepository(ProductHistoryPrice) + private productPriceRepository: Repository, @InjectRepository(COA) private coaRepository: Repository, @InjectRepository(CheckBillHistory) @@ -627,6 +629,7 @@ export class TransactionService { transactionData.partner_trx_id = orderTransactionDto.trx_id; transactionData.supplier_trx_id = trxId; transactionData.check_bill = orderTransactionDto.bill_trx_id; + transactionData.balance_remaining = coaAccount.amount - product_price.mark_up_price - costInventory; if (!hitSupplier.success) { transactionData.status = statusTransaction.FAILED; @@ -1201,6 +1204,12 @@ export class TransactionService { relations: ['product_price'], }); + const dataProductHistoryPrice = await this.productPriceRepository.findOne({ + where: { + id: dataTransaction.product_price.id, + }, + }); + // const dataMsg = callback.msg; // const failedReason = dataMsg.split('.'); @@ -1222,10 +1231,13 @@ export class TransactionService { dataTransaction.callback_json = callback; dataTransaction.failed_reason = `Trx ${product.code} ke ${dataTransaction.destination} gagal`; + console.log("inipricetable", dataTransaction.product_price.price) + console.log("inipricecallback", callback['price']) if(callback['message']) { if (callback['message'].includes('METRO')) { if (callback['price'] != dataTransaction.product_price.price) { - dataTransaction.product_price.price = callback['price'] + console.log("mskupdt", "msk") + dataTransaction.product_price.price = parseInt(callback['price']) } } } @@ -1236,6 +1248,11 @@ export class TransactionService { coaType.WALLET, ); + dataTransaction.status = statusTransaction.FAILED; + dataTransaction.callback_json = callback; + dataTransaction.failed_reason = `Trx ${product.code} ke ${dataTransaction.destination} gagal`; + dataTransaction.balance_remaining = coaAccount.amount + product_price.mark_up_price + product_price.price; + const coaInventory = await this.coaService.findByName( `${coaType[coaType.INVENTORY]}-${product.supplier.code}`, ); @@ -1251,6 +1268,7 @@ export class TransactionService { try { await this.connection.transaction(async (manager) => { await manager.save(dataTransaction); + await manager.save(dataProductHistoryPrice); await this.accountingTransaction({ createTransaction: false, @@ -1304,6 +1322,12 @@ export class TransactionService { relations: ['product_price'], }); + const dataProductHistoryPrice = await this.productPriceRepository.findOne({ + where: { + id: dataTransaction.product_price.id, + }, + }); + dataTransaction.status = statusTransaction.SUCCESS; if(callback['sn']){ dataTransaction.seri_number = callback['sn']; @@ -1318,7 +1342,7 @@ export class TransactionService { if(callback['message']) { if (callback['message'].includes('METRO')) { if (callback['price'] != dataTransaction.product_price.price) { - dataTransaction.product_price.price = callback['price'] + dataProductHistoryPrice.price = parseInt(callback['price']) } } } @@ -1342,6 +1366,8 @@ export class TransactionService { `${coaType[coaType.EXPENSE]}-SYSTEM`, ); + // dataTransaction.balance_remaining = coaAccount.amount - product_price.mark_up_price - costInventory; + if (userData.partner == null) { //GET SALES supervisorData = await this.calculateCommission( @@ -1368,6 +1394,7 @@ export class TransactionService { try { await this.connection.transaction(async (manager) => { await manager.save(dataTransaction); + await manager.save(dataProductHistoryPrice) await this.accountingTransaction({ createTransaction: false, @@ -1461,14 +1488,26 @@ export class TransactionService { coaType.WALLET, ); + if (!partnerData.callback_url) { + this.logger.error(`Call to partner failed, reason: no callback url`); + return false; + } + 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, url: url, }); - const res = await axios.get(url); - return res; + + try { + const res = await axios.get(url); + + return res; + } catch (e) { + this.logger.error(`Call to partner failed, reason: ${e.message}`); + return false; + } } async rollbackJurnal(trxId: string[]) { @@ -1625,7 +1664,8 @@ export class TransactionService { .leftJoin('product.supplier', 'supplier') .addSelect('transaction.amount', 'price') .addSelect('transaction.destination') - .addSelect('transaction.seri_number', 'seri_number') + .addSelect('transaction.balance_remaining', 'balance_remaining') + .addSelect('transaction.seri_number', 'seri_number') .addSelect('transaction.supplier_trx_id', 'transaction_code') .addSelect('transaction.status', 'status') .addSelect('transaction.partner_trx_id', 'partner_transaction_code') @@ -1633,6 +1673,7 @@ export class TransactionService { .addSelect('userData.name', 'buyer') .addSelect('product.name', 'name') .addSelect('product_price.price', 'product_price') + .addSelect('product_price.mark_up_price', 'mark_up_price') .addSelect('product.name', 'supplier_name') .addSelect('supplier.name', 'supplier_name') .orderBy('transaction.created_at', 'DESC');