From 495ba88ef8369452961d671b32cd50ccc1c2238b Mon Sep 17 00:00:00 2001 From: ilham Date: Tue, 7 Dec 2021 20:23:26 +0700 Subject: [PATCH] add: change implement enum and distribution --- src/helper/enum-list.ts | 25 ++++++++ .../entities/product-history-price.entity.ts | 8 +-- src/product/product.service.ts | 8 +-- src/transaction/coa.service.ts | 29 +++++++++ src/transaction/entities/coa-type.entity.ts | 20 +------ src/transaction/entities/coa.entity.ts | 28 ++------- .../entities/transaction-journal.entity.ts | 52 +++++++++------- .../entities/transactions.entity.ts | 25 ++++---- src/transaction/transaction.module.ts | 3 +- src/transaction/transaction.service.ts | 60 ++++++++++++------- 10 files changed, 147 insertions(+), 111 deletions(-) create mode 100644 src/helper/enum-list.ts create mode 100644 src/transaction/coa.service.ts diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts new file mode 100644 index 0000000..27b3276 --- /dev/null +++ b/src/helper/enum-list.ts @@ -0,0 +1,25 @@ +export enum statusTransaction { + PENDING, + SUCCESS, + FAILED, +} + +export enum typeTransaction { + DISTRIBUTION, + ORDER, +} + +export enum productType { + NORMAL, + PROMO, +} + +export enum coaType { + SYSTEM_BANk, + INCOME, +} + +export enum balanceType { + DEBIT, + CREDIT, +} \ No newline at end of file diff --git a/src/product/entities/product-history-price.entity.ts b/src/product/entities/product-history-price.entity.ts index 99a5aca..4107952 100644 --- a/src/product/entities/product-history-price.entity.ts +++ b/src/product/entities/product-history-price.entity.ts @@ -6,11 +6,7 @@ import { } from 'typeorm'; import { Product } from './product.entity'; import { BaseModel } from '../../config/basemodel.entity'; - -enum Type { - NORMAL, - PROMO, -} +import { productType } from '../../helper/enum-list'; @Entity() export class ProductHistoryPrice extends BaseModel { @@ -30,5 +26,5 @@ export class ProductHistoryPrice extends BaseModel { endDate: Date; @Column('text') - type: Type; + type: productType; } diff --git a/src/product/product.service.ts b/src/product/product.service.ts index b1b97c5..aae809c 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -6,11 +6,7 @@ import { CreateProductDto } from '../product/dto/product/create-product.dto'; import { ProductSubCategoriesService } from './product-sub-categories.service'; import { UpdateProductDto } from './dto/product/update-product.dto'; import { ProductHistoryPrice } from './entities/product-history-price.entity'; - -enum Type { - NORMAL, - PROMO, -} +import { productType } from '../helper/enum-list'; export class ProductService { constructor( @@ -36,7 +32,7 @@ export class ProductService { await this.productHistoryPrice.insert({ product: result.identifiers[0], - type: Type.NORMAL, + type: productType.NORMAL, startDate: new Date(), endDate: null, }); diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts new file mode 100644 index 0000000..70abf8a --- /dev/null +++ b/src/transaction/coa.service.ts @@ -0,0 +1,29 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { EntityNotFoundError, Repository } from 'typeorm'; +import { InjectRepository } from '@nestjs/typeorm'; +import { COA } from './entities/coa.entity'; + +export class CoaService { + constructor( + @InjectRepository(COA) + private coaRepository: Repository, + ) {} + + async findByUser(id: string) { + try { + return await this.coaRepository.findOneOrFail({ user: id }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } +} diff --git a/src/transaction/entities/coa-type.entity.ts b/src/transaction/entities/coa-type.entity.ts index d2a86ef..bcbd19f 100644 --- a/src/transaction/entities/coa-type.entity.ts +++ b/src/transaction/entities/coa-type.entity.ts @@ -1,23 +1,9 @@ import { Entity, Column, - PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, - ManyToOne, - ManyToMany, - JoinTable, } from 'typeorm'; -import { Product } from '../../product/entities/product.entity'; -import { User } from '../../users/entities/user.entity'; import { BaseModel } from '../../config/basemodel.entity'; - -enum balanceType { - DEBIT, - CREDIT, -} +import { balanceType } from '../../helper/enum-list'; @Entity() export class CoaType extends BaseModel { @@ -26,8 +12,4 @@ export class CoaType extends BaseModel { @Column('text') normalBalance: balanceType; - - @ManyToMany(() => User) - @JoinTable() - user: User[]; } diff --git a/src/transaction/entities/coa.entity.ts b/src/transaction/entities/coa.entity.ts index cd95f70..937c84b 100644 --- a/src/transaction/entities/coa.entity.ts +++ b/src/transaction/entities/coa.entity.ts @@ -1,28 +1,9 @@ import { Entity, Column, - PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, - ManyToOne, - ManyToMany, - JoinTable, } from 'typeorm'; -import { Product } from '../../product/entities/product.entity'; -import { User } from '../../users/entities/user.entity'; import { BaseModel } from '../../config/basemodel.entity'; - -enum type { - SYSTEM_BANk, - INCOME, -} - -enum balanceType { - DEBIT, - CREDIT, -} +import { coaType, balanceType } from '../../helper/enum-list'; @Entity() export class COA extends BaseModel { @@ -30,7 +11,7 @@ export class COA extends BaseModel { name: string; @Column('text') - type: type; + type: coaType; @Column('text') balanceType: balanceType; @@ -38,7 +19,6 @@ export class COA extends BaseModel { @Column() amount: number; - @ManyToMany(() => User) - @JoinTable() - user: User[]; + @Column() + user: string; } diff --git a/src/transaction/entities/transaction-journal.entity.ts b/src/transaction/entities/transaction-journal.entity.ts index 4f99b5c..85a7e77 100644 --- a/src/transaction/entities/transaction-journal.entity.ts +++ b/src/transaction/entities/transaction-journal.entity.ts @@ -1,44 +1,52 @@ import { Entity, Column, - PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, ManyToOne, ManyToMany, JoinTable, OneToOne, + ManyToOne, + ManyToMany, + JoinTable, + OneToOne, } from 'typeorm'; -import { Product } from '../../product/entities/product.entity'; -import { User } from '../../users/entities/user.entity'; import { BaseModel } from '../../config/basemodel.entity'; -import { ProductCategories } from '../../product/entities/product-category.entity'; import { COA } from './coa.entity'; import { Transactions } from './transactions.entity'; import { TransactionType } from './transaction-type.entity'; - -enum type { - SYSTEM_BANk, - INCOME, -} - -enum balanceType { - DEBIT, - CREDIT, -} +import { balanceType } from '../../helper/enum-list'; @Entity() export class TransactionJournal extends BaseModel { @Column('text') - type: type; + type: balanceType; @Column() amount: number; - @OneToOne(() => Transactions, (trans) => trans.id) + @OneToOne( + () => { + return Transactions; + }, + (trans) => { + return trans.id; + }, + ) transaction: Transactions; - @ManyToOne(() => COA, (coa) => coa.id) + @ManyToOne( + () => { + return COA; + }, + (coa) => { + return coa.id; + }, + ) coa: COA; - @ManyToOne(() => TransactionType, (transType) => transType.id) + @ManyToOne( + () => { + return TransactionType; + }, + (transType) => { + return transType.id; + }, + ) transactionType: TransactionType; } diff --git a/src/transaction/entities/transactions.entity.ts b/src/transaction/entities/transactions.entity.ts index bed1e84..af235db 100644 --- a/src/transaction/entities/transactions.entity.ts +++ b/src/transaction/entities/transactions.entity.ts @@ -10,17 +10,8 @@ import { ManyToMany, JoinTable, } from 'typeorm'; -import { Product } from '../../product/entities/product.entity'; -import { User } from '../../users/entities/user.entity'; import { BaseModel } from '../../config/basemodel.entity'; -import { COA } from './coa.entity'; -import { ProductHistoryPrice } from '../../product/entities/product-history-price.entity'; - -enum status { - PENDING, - SUCCESS, - FAILED, -} +import { statusTransaction, typeTransaction } from '../../helper/enum-list'; @Entity() export class Transactions extends BaseModel { @@ -28,8 +19,16 @@ export class Transactions extends BaseModel { amount: number; @Column() - status: status; + status: statusTransaction; - @ManyToOne(() => User, (user) => user.id) - user: User; + @Column() + type: typeTransaction; + + @Column() + user: string; + + @Column({ + nullable: true, + }) + userDestination: string; } diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 1f586ed..74dc84e 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -8,6 +8,7 @@ import { CoaType } from './entities/coa-type.entity'; 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'; @Module({ imports: [ @@ -20,6 +21,6 @@ import { Transactions } from './entities/transactions.entity'; ]), ], controllers: [TransactionController, PpobCallbackController], - providers: [TransactionService], + providers: [TransactionService, CoaService], }) export class TransactionModule {} diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 3582afe..24bc015 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -3,11 +3,12 @@ import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; -import { Repository } from 'typeorm'; -import { User } from '../users/entities/user.entity'; +import { Connection, 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'; @Injectable() export class TransactionService { @@ -19,31 +20,50 @@ export class TransactionService { @InjectRepository(TransactionJournal) private transactionJournalRepository: Repository, @InjectRepository(COA) - private coaRepository: Repository + private coaRepository: Repository, + private coaService: CoaService, + private connection: Connection, ) {} async create(distributeTransactionDto: DistributeTransactionDto) { - // GET USER // GET COA + 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, { + amount: distributeTransactionDto.amount, + user: 'id_user', + userDestination: distributeTransactionDto.destination, + status: statusTransaction.SUCCESS, + }); + + //INSERT TRANSACTION JOURNAL FOR SENDER + const journalSender = await manager.insert(TransactionJournal, { + amount: distributeTransactionDto.amount, + transaction: transactionSaved.identifiers[0], + coa: coaSender, + }); + + //INSERT TRANSACTION JOURNAL FOR RECEIVER + const journalReceiver = await manager.insert(TransactionJournal, { + amount: distributeTransactionDto.amount, + transaction: transactionSaved.identifiers[0], + coa: coaReciever, + }); + + //UPDATE AMOUNT COA SENDER + coaSender.amount = coaSender.amount - distributeTransactionDto.amount; + await manager.save(coaSender); + + coaReciever.amount = coaReciever.amount + distributeTransactionDto.amount; + await manager.save(coaReciever); + }); + //ADD USER IN INSERT - const transactionSaved = await this.transactionRepository.insert({ - amount: distributeTransactionDto.amount, - }); - - //INSERT TRANSACTION JOURNAL FOR SEND - await this.transactionJournalRepository.insert({ - amount: distributeTransactionDto.amount, - transaction: transactionSaved.identifiers[0], - }); - - //INSERT TRANSACTION JOURNAL FOR RECIEVE - await this.transactionJournalRepository.insert({ - amount: distributeTransactionDto.amount, - transaction: transactionSaved.identifiers[0], - }); - // await this.coaRepository.update({ // amount:1