From 426c2ccec8bf058cf10406904eff22372a75cfcd Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 7 Dec 2021 23:07:29 +0700 Subject: [PATCH] add: transaction distribution and order --- package.json | 1 + src/helper/irs-service.ts | 25 ++++++ src/transaction/coa.service.ts | 5 +- src/transaction/dto/order-transaction.dto.ts | 3 + src/transaction/transaction.controller.ts | 2 +- src/transaction/transaction.module.ts | 2 - src/transaction/transaction.service.ts | 85 +++++++++++++++----- 7 files changed, 99 insertions(+), 24 deletions(-) create mode 100644 src/helper/irs-service.ts diff --git a/package.json b/package.json index 264ca45..8782836 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@nestjs/platform-express": "^8.0.0", "@nestjs/platform-fastify": "^8.0.8", "@nestjs/typeorm": "^8.0.2", + "axios": "^0.24.0", "class-transformer": "^0.4.0", "class-validator": "^0.13.1", "crypto": "^1.0.1", diff --git a/src/helper/irs-service.ts b/src/helper/irs-service.ts new file mode 100644 index 0000000..4aea493 --- /dev/null +++ b/src/helper/irs-service.ts @@ -0,0 +1,25 @@ +import * as axios from 'axios'; + +export const createTransaction = async (kode, tujuan) => { + const codeTransaksi = generateRequestId(); + + return axios.default + .get( + `http://h2h.elangpangarep.com/api/h2h?id=PT0005&pin=04JFGC&user=D10BD0&pass=6251F3&kodeproduk=${kode}&tujuan=${tujuan}&counter=1&idtrx=${codeTransaksi}`, + ) + .then((response) => { + return response.data; + }); +}; + +export const generateRequestId = () => { + return `${new Date() + .toLocaleString('en-us', { + year: '2-digit', + month: '2-digit', + day: '2-digit', + }) + .replace(/(\d+)\/(\d+)\/(\d+)/, '$3$1$2')}${Math.random() + .toPrecision(3) + .replace('0.', '')}`; +}; diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index 70abf8a..e51d36f 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -2,6 +2,7 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { COA } from './entities/coa.entity'; +import { coaType } from '../helper/enum-list'; export class CoaService { constructor( @@ -9,9 +10,9 @@ export class CoaService { private coaRepository: Repository, ) {} - async findByUser(id: string) { + async findByUser(id: string, type: coaType) { try { - return await this.coaRepository.findOneOrFail({ user: id }); + return await this.coaRepository.findOneOrFail({ user: id, type: type }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( diff --git a/src/transaction/dto/order-transaction.dto.ts b/src/transaction/dto/order-transaction.dto.ts index 462682c..2081cba 100644 --- a/src/transaction/dto/order-transaction.dto.ts +++ b/src/transaction/dto/order-transaction.dto.ts @@ -3,4 +3,7 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; export class OrderTransactionDto { @IsNotEmpty() productCode: string; + + @IsNotEmpty() + destination: string; } diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index d3f09bd..93734f8 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -19,7 +19,7 @@ import { UpdateTransactionDto } from './dto/update-transaction.dto'; export class TransactionController { constructor(private readonly transactionService: TransactionService) {} - @Post() + @Post('distribute') create(@Body() createTransactionDto: DistributeTransactionDto) { return this.transactionService.distributeDeposit(createTransactionDto); } diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 7a0c84f..3369cce 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -9,8 +9,6 @@ import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { Transactions } from './entities/transactions.entity'; import { CoaService } from './coa.service'; -import { ProductService } from '../product/product.service'; -import { ProductSubCategoriesService } from '../product/product-sub-categories.service'; import { ProductModule } from '../product/product.module'; @Module({ diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 0dc7fc2..e5ced1f 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -1,16 +1,18 @@ -import { Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; -import { Connection, Repository } from 'typeorm'; +import { Connection, EntityNotFoundError, Repository } from 'typeorm'; import { COA } from './entities/coa.entity'; import { TransactionType } from './entities/transaction-type.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; import { statusTransaction } from '../helper/enum-list'; import { ProductService } from '../product/product.service'; +import * as irsService from '../helper/irs-service'; +import { balanceType, typeTransaction } from '../helper/enum-list'; @Injectable() export class TransactionService { @@ -24,6 +26,7 @@ export class TransactionService { @InjectRepository(COA) private coaRepository: Repository, private coaService: CoaService, + private productService: ProductService, private connection: Connection, ) {} @@ -32,8 +35,6 @@ export class TransactionService { const coaSender = await this.coaService.findByUser('id_user'); const coaReciever = await this.coaService.findByUser('id_user'); - // GET TYPE TRANSAKSI - await this.connection.transaction(async (manager) => { //INSERT TRANSACTION const transactionSaved = await manager.insert(Transactions, { @@ -41,6 +42,7 @@ export class TransactionService { user: 'id_user', userDestination: distributeTransactionDto.destination, status: statusTransaction.SUCCESS, + type: typeTransaction.DISTRIBUTION, }); //INSERT TRANSACTION JOURNAL FOR SENDER @@ -48,6 +50,7 @@ export class TransactionService { amount: distributeTransactionDto.amount, transaction: transactionSaved.identifiers[0], coa: coaSender, + type: balanceType.CREDIT, }); //INSERT TRANSACTION JOURNAL FOR RECEIVER @@ -55,6 +58,7 @@ export class TransactionService { amount: distributeTransactionDto.amount, transaction: transactionSaved.identifiers[0], coa: coaReciever, + type: balanceType.DEBIT, }); //UPDATE AMOUNT COA SENDER @@ -69,22 +73,65 @@ export class TransactionService { } async orderTransaction(orderTransactionDto: OrderTransactionDto) { - // const product = await this.productService.findOne( - // orderTransactionDto.productCode, - // ); + const coaAccount = await this.coaService.findByUser('id_user'); + + //GET PRODUCT + const product = await this.productService.findOne( + orderTransactionDto.productCode, + ); + + if (coaAccount.amount <= product.price) { + throw new HttpException( + { + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + error: `Transaction Failed because saldo not enough`, + }, + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + + + try { + const orderIRS = await irsService.createTransaction( + orderTransactionDto.productCode, + orderTransactionDto.destination, + ); + + if (orderIRS.success) { + await this.connection.transaction(async (manager) => { + //INSERT TRANSACTION + const transactionSaved = await manager.insert(Transactions, { + amount: product.price, + user: 'id_user', + status: statusTransaction.SUCCESS, + type: typeTransaction.ORDER, + }); + + //INSERT TRANSACTION JOURNAL + const journalSender = await manager.insert(TransactionJournal, { + amount: product.price, + transaction: transactionSaved.identifiers[0], + coa: coaAccount, + type: balanceType.CREDIT, + }); + + //UPDATE AMOUNT COA + coaAccount.amount = coaAccount.amount - product.price; + await manager.save(coaAccount); + }); + } else { + throw new HttpException( + { + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + error: `Transaction Failed because ${orderIRS.msg}`, + }, + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } catch (e) { + throw e; + } return true; } - - findOne(id: number) { - return `This action returns a #${id} transaction`; - } - - update(id: number, updateTransactionDto: UpdateTransactionDto) { - return `This action updates a #${id} transaction`; - } - - remove(id: number) { - return `This action removes a #${id} transaction`; - } }