From 1f44cf484cf387579ec68b3090cbc0c910978c46 Mon Sep 17 00:00:00 2001 From: Ilham Dwi Pratama S Date: Thu, 9 Dec 2021 03:22:52 +0700 Subject: [PATCH] add saldo IRS --- .vscode/launch.json | 15 +++++ src/helper/enum-list.ts | 1 - src/transaction/coa.service.ts | 18 +++++ src/transaction/dto/add-saldo-supplier.dto.ts | 12 ++++ src/transaction/dto/create-journal.dto.ts | 3 +- src/transaction/transaction.controller.ts | 17 +++++ src/transaction/transaction.service.ts | 67 ++++++++++++++----- 7 files changed, 114 insertions(+), 19 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 src/transaction/dto/add-saldo-supplier.dto.ts diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7a9dfa0 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "pwa-chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:8080", + "webRoot": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index 7477e13..303ff60 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -8,7 +8,6 @@ export enum typeTransaction { DISTRIBUTION, ORDER, DEPOSIT_IRS, - } export enum productType { diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index aad3b45..10222a9 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -50,4 +50,22 @@ export class CoaService { } } } + + async findByName(name: string) { + try { + return await this.coaRepository.findOneOrFail({ name: name }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'COA Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } } diff --git a/src/transaction/dto/add-saldo-supplier.dto.ts b/src/transaction/dto/add-saldo-supplier.dto.ts new file mode 100644 index 0000000..6f27f52 --- /dev/null +++ b/src/transaction/dto/add-saldo-supplier.dto.ts @@ -0,0 +1,12 @@ +import { IsNotEmpty, IsUUID } from 'class-validator'; +import { balanceType, coaType, statusTransaction, typeTransaction } from 'src/helper/enum-list'; +import { EntityManager } from 'typeorm'; + + +export class AddSaldoSupplier { + @IsNotEmpty() + supplier?: string; + + @IsNotEmpty() + amount?: number; +} diff --git a/src/transaction/dto/create-journal.dto.ts b/src/transaction/dto/create-journal.dto.ts index fd218c2..0cbf949 100644 --- a/src/transaction/dto/create-journal.dto.ts +++ b/src/transaction/dto/create-journal.dto.ts @@ -1,6 +1,7 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; import { balanceType, coaType, statusTransaction, typeTransaction } from 'src/helper/enum-list'; import { EntityManager } from 'typeorm'; +import { Transactions } from '../entities/transactions.entity'; interface JournalEntry { coa_id: string; @@ -19,7 +20,7 @@ export class CreateJournalDto { userId?: string; @IsNotEmpty() - transactionId?: string; + transaction?: Transactions; @IsNotEmpty() type?: typeTransaction; diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 8822465..e0f5ccd 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -6,11 +6,14 @@ import { Patch, Param, Delete, + Request, + HttpStatus } from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto'; +import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; @Controller({ path: 'transaction', @@ -24,6 +27,20 @@ export class TransactionController { return this.transactionService.distributeDeposit(createTransactionDto); } + @Post('add-saldo-supplier') + async addSaldoSupplier( + @Body() addSaldoSupplier: AddSaldoSupplier, + @Request() req + ) { + + return { + data: await this.transactionService.addIRSWallet(addSaldoSupplier,req.user), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + + @Post('order') orderTransaction(@Body() orderTransactionDto: OrderTransactionDto) { return this.transactionService.orderTransaction(orderTransactionDto); diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 77f6ab5..379d78a 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -20,6 +20,8 @@ import { import { ProductService } from '../product/product.service'; import * as irsService from '../helper/irs-service'; import { CreateJournalDto } from './dto/create-journal.dto'; +import { UsersService } from 'src/users/users.service'; +import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto'; interface JournalEntry { coa_id: string; @@ -27,7 +29,6 @@ interface JournalEntry { credit?: string; } - @Injectable() export class TransactionService { constructor( @@ -41,9 +42,55 @@ export class TransactionService { private coaRepository: Repository, private coaService: CoaService, private productService: ProductService, + private userService: UsersService, private connection: Connection, ) {} + async addIRSWallet(addSaldoSupplier: AddSaldoSupplier,currentUser:any) { + // GET COA + const coaBank = await this.coaService.findByName( + coaType[coaType.BANK]+'-SYSTEM', + ); + + const coaInventory = await this.coaService.findByName( + coaType[coaType.INVENTORY]+'-'+addSaldoSupplier.supplier, + ); + console.log(coaInventory); + + //GET USER + const userData = await this.userService.findByUsername(currentUser.username); + + + await this.connection.transaction(async (manager) => { + //INSERT TRANSACTION + let transactionData = new Transactions(); + transactionData.id = uuid.v4(); + transactionData.amount = addSaldoSupplier.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: coaBank.id, + debit: transactionData.amount + }, { + coa_id: coaInventory.id, + credit: transactionData.amount + }] + }); + + }); + + return true; + } + async distributeDeposit(distributeTransactionDto: DistributeTransactionDto) { // GET COA const coaSender = await this.coaService.findByUser( @@ -158,9 +205,6 @@ export class TransactionService { } async accountingTransaction(createJournalDto: CreateJournalDto ) { - - createJournalDto.transactionId = createJournalDto.transactionId ?? uuid.v4(); - let creditSum = createJournalDto.journals.map(it => it.credit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); let debitSum = createJournalDto.journals.map(it => it.debit).filter(it => it).reduce((a, b) => a.plus(b), new Decimal(0)); let coaIds = uniq(createJournalDto.journals.map(it => it.coa_id)); @@ -171,20 +215,9 @@ export class TransactionService { const coas = await this.coaRepository.findByIds(coaIds); - let transaction: Transactions; + console.log("berhasil") - if(createJournalDto.createTransaction) { - transaction = new Transactions(); - transaction.id = createJournalDto.transactionId; - transaction.type = createJournalDto.type; - transaction.amount = createJournalDto.amount; - transaction.user = createJournalDto.userId; - transaction.status = createJournalDto.transactionStatus; - - await this.transactionRepository.save(transaction); - } else { - transaction = await this.transactionRepository.findOneOrFail(createJournalDto.transactionId); - } + const transaction = createJournalDto.transaction await Promise.all(createJournalDto.journals.map(journal => { const coa = coas.find(it => it.id === journal.coa_id);