add: change implement enum and distribution

This commit is contained in:
ilham 2021-12-07 20:23:26 +07:00
parent a4cd9d0b92
commit 495ba88ef8
10 changed files with 147 additions and 111 deletions

25
src/helper/enum-list.ts Normal file
View File

@ -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,
}

View File

@ -6,11 +6,7 @@ import {
} from 'typeorm'; } from 'typeorm';
import { Product } from './product.entity'; import { Product } from './product.entity';
import { BaseModel } from '../../config/basemodel.entity'; import { BaseModel } from '../../config/basemodel.entity';
import { productType } from '../../helper/enum-list';
enum Type {
NORMAL,
PROMO,
}
@Entity() @Entity()
export class ProductHistoryPrice extends BaseModel { export class ProductHistoryPrice extends BaseModel {
@ -30,5 +26,5 @@ export class ProductHistoryPrice extends BaseModel {
endDate: Date; endDate: Date;
@Column('text') @Column('text')
type: Type; type: productType;
} }

View File

@ -6,11 +6,7 @@ import { CreateProductDto } from '../product/dto/product/create-product.dto';
import { ProductSubCategoriesService } from './product-sub-categories.service'; import { ProductSubCategoriesService } from './product-sub-categories.service';
import { UpdateProductDto } from './dto/product/update-product.dto'; import { UpdateProductDto } from './dto/product/update-product.dto';
import { ProductHistoryPrice } from './entities/product-history-price.entity'; import { ProductHistoryPrice } from './entities/product-history-price.entity';
import { productType } from '../helper/enum-list';
enum Type {
NORMAL,
PROMO,
}
export class ProductService { export class ProductService {
constructor( constructor(
@ -36,7 +32,7 @@ export class ProductService {
await this.productHistoryPrice.insert({ await this.productHistoryPrice.insert({
product: result.identifiers[0], product: result.identifiers[0],
type: Type.NORMAL, type: productType.NORMAL,
startDate: new Date(), startDate: new Date(),
endDate: null, endDate: null,
}); });

View File

@ -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<COA>,
) {}
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;
}
}
}
}

View File

@ -1,23 +1,9 @@
import { import {
Entity, Entity,
Column, Column,
PrimaryGeneratedColumn,
UpdateDateColumn,
DeleteDateColumn,
VersionColumn,
CreateDateColumn,
ManyToOne,
ManyToMany,
JoinTable,
} from 'typeorm'; } from 'typeorm';
import { Product } from '../../product/entities/product.entity';
import { User } from '../../users/entities/user.entity';
import { BaseModel } from '../../config/basemodel.entity'; import { BaseModel } from '../../config/basemodel.entity';
import { balanceType } from '../../helper/enum-list';
enum balanceType {
DEBIT,
CREDIT,
}
@Entity() @Entity()
export class CoaType extends BaseModel { export class CoaType extends BaseModel {
@ -26,8 +12,4 @@ export class CoaType extends BaseModel {
@Column('text') @Column('text')
normalBalance: balanceType; normalBalance: balanceType;
@ManyToMany(() => User)
@JoinTable()
user: User[];
} }

View File

@ -1,28 +1,9 @@
import { import {
Entity, Entity,
Column, Column,
PrimaryGeneratedColumn,
UpdateDateColumn,
DeleteDateColumn,
VersionColumn,
CreateDateColumn,
ManyToOne,
ManyToMany,
JoinTable,
} from 'typeorm'; } from 'typeorm';
import { Product } from '../../product/entities/product.entity';
import { User } from '../../users/entities/user.entity';
import { BaseModel } from '../../config/basemodel.entity'; import { BaseModel } from '../../config/basemodel.entity';
import { coaType, balanceType } from '../../helper/enum-list';
enum type {
SYSTEM_BANk,
INCOME,
}
enum balanceType {
DEBIT,
CREDIT,
}
@Entity() @Entity()
export class COA extends BaseModel { export class COA extends BaseModel {
@ -30,7 +11,7 @@ export class COA extends BaseModel {
name: string; name: string;
@Column('text') @Column('text')
type: type; type: coaType;
@Column('text') @Column('text')
balanceType: balanceType; balanceType: balanceType;
@ -38,7 +19,6 @@ export class COA extends BaseModel {
@Column() @Column()
amount: number; amount: number;
@ManyToMany(() => User) @Column()
@JoinTable() user: string;
user: User[];
} }

View File

@ -1,44 +1,52 @@
import { import {
Entity, Entity,
Column, Column,
PrimaryGeneratedColumn, ManyToOne,
UpdateDateColumn, ManyToMany,
DeleteDateColumn, JoinTable,
VersionColumn, OneToOne,
CreateDateColumn, ManyToOne, ManyToMany, JoinTable, OneToOne,
} from 'typeorm'; } from 'typeorm';
import { Product } from '../../product/entities/product.entity';
import { User } from '../../users/entities/user.entity';
import { BaseModel } from '../../config/basemodel.entity'; import { BaseModel } from '../../config/basemodel.entity';
import { ProductCategories } from '../../product/entities/product-category.entity';
import { COA } from './coa.entity'; import { COA } from './coa.entity';
import { Transactions } from './transactions.entity'; import { Transactions } from './transactions.entity';
import { TransactionType } from './transaction-type.entity'; import { TransactionType } from './transaction-type.entity';
import { balanceType } from '../../helper/enum-list';
enum type {
SYSTEM_BANk,
INCOME,
}
enum balanceType {
DEBIT,
CREDIT,
}
@Entity() @Entity()
export class TransactionJournal extends BaseModel { export class TransactionJournal extends BaseModel {
@Column('text') @Column('text')
type: type; type: balanceType;
@Column() @Column()
amount: number; amount: number;
@OneToOne(() => Transactions, (trans) => trans.id) @OneToOne(
() => {
return Transactions;
},
(trans) => {
return trans.id;
},
)
transaction: Transactions; transaction: Transactions;
@ManyToOne(() => COA, (coa) => coa.id) @ManyToOne(
() => {
return COA;
},
(coa) => {
return coa.id;
},
)
coa: COA; coa: COA;
@ManyToOne(() => TransactionType, (transType) => transType.id) @ManyToOne(
() => {
return TransactionType;
},
(transType) => {
return transType.id;
},
)
transactionType: TransactionType; transactionType: TransactionType;
} }

View File

@ -10,17 +10,8 @@ import {
ManyToMany, ManyToMany,
JoinTable, JoinTable,
} from 'typeorm'; } from 'typeorm';
import { Product } from '../../product/entities/product.entity';
import { User } from '../../users/entities/user.entity';
import { BaseModel } from '../../config/basemodel.entity'; import { BaseModel } from '../../config/basemodel.entity';
import { COA } from './coa.entity'; import { statusTransaction, typeTransaction } from '../../helper/enum-list';
import { ProductHistoryPrice } from '../../product/entities/product-history-price.entity';
enum status {
PENDING,
SUCCESS,
FAILED,
}
@Entity() @Entity()
export class Transactions extends BaseModel { export class Transactions extends BaseModel {
@ -28,8 +19,16 @@ export class Transactions extends BaseModel {
amount: number; amount: number;
@Column() @Column()
status: status; status: statusTransaction;
@ManyToOne(() => User, (user) => user.id) @Column()
user: User; type: typeTransaction;
@Column()
user: string;
@Column({
nullable: true,
})
userDestination: string;
} }

View File

@ -8,6 +8,7 @@ import { CoaType } from './entities/coa-type.entity';
import { TransactionType } from './entities/transaction-type.entity'; import { TransactionType } from './entities/transaction-type.entity';
import { TransactionJournal } from './entities/transaction-journal.entity'; import { TransactionJournal } from './entities/transaction-journal.entity';
import { Transactions } from './entities/transactions.entity'; import { Transactions } from './entities/transactions.entity';
import { CoaService } from './coa.service';
@Module({ @Module({
imports: [ imports: [
@ -20,6 +21,6 @@ import { Transactions } from './entities/transactions.entity';
]), ]),
], ],
controllers: [TransactionController, PpobCallbackController], controllers: [TransactionController, PpobCallbackController],
providers: [TransactionService], providers: [TransactionService, CoaService],
}) })
export class TransactionModule {} export class TransactionModule {}

View File

@ -3,11 +3,12 @@ import { DistributeTransactionDto } from './dto/distribute-transaction.dto';
import { UpdateTransactionDto } from './dto/update-transaction.dto'; import { UpdateTransactionDto } from './dto/update-transaction.dto';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { Transactions } from './entities/transactions.entity'; import { Transactions } from './entities/transactions.entity';
import { Repository } from 'typeorm'; import { Connection, Repository } from 'typeorm';
import { User } from '../users/entities/user.entity';
import { COA } from './entities/coa.entity'; import { COA } from './entities/coa.entity';
import { TransactionType } from './entities/transaction-type.entity'; import { TransactionType } from './entities/transaction-type.entity';
import { TransactionJournal } from './entities/transaction-journal.entity'; import { TransactionJournal } from './entities/transaction-journal.entity';
import { CoaService } from './coa.service';
import { statusTransaction } from '../helper/enum-list';
@Injectable() @Injectable()
export class TransactionService { export class TransactionService {
@ -19,31 +20,50 @@ export class TransactionService {
@InjectRepository(TransactionJournal) @InjectRepository(TransactionJournal)
private transactionJournalRepository: Repository<TransactionJournal>, private transactionJournalRepository: Repository<TransactionJournal>,
@InjectRepository(COA) @InjectRepository(COA)
private coaRepository: Repository<COA> private coaRepository: Repository<COA>,
private coaService: CoaService,
private connection: Connection,
) {} ) {}
async create(distributeTransactionDto: DistributeTransactionDto) { async create(distributeTransactionDto: DistributeTransactionDto) {
// GET USER
// GET COA // GET COA
const coaSender = await this.coaService.findByUser('id_user');
const coaReciever = await this.coaService.findByUser('id_user');
// GET TYPE TRANSAKSI // 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 //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({ // await this.coaRepository.update({
// amount:1 // amount:1