From d332935e85eeb4be870210ce9148cd24929a0bc4 Mon Sep 17 00:00:00 2001 From: ilham Date: Sat, 11 Dec 2021 11:24:28 +0700 Subject: [PATCH 1/5] add: commission setting --- src/configurable/commission.service.ts | 48 +++++++++++++++++++ src/configurable/configurable.controller.ts | 30 +++++++++++- src/configurable/configurable.module.ts | 8 ++-- .../entities/commission_setting.entity.ts | 16 +++++++ src/helper/enum-list.ts | 9 +++- src/users/entities/partner.entity.ts | 13 +++++ src/users/entities/userDetail.entity.ts | 18 ------- src/users/entities/user_detail.entity.ts | 22 +++++++++ 8 files changed, 140 insertions(+), 24 deletions(-) create mode 100644 src/configurable/commission.service.ts create mode 100644 src/configurable/entities/commission_setting.entity.ts create mode 100644 src/users/entities/partner.entity.ts delete mode 100644 src/users/entities/userDetail.entity.ts create mode 100644 src/users/entities/user_detail.entity.ts diff --git a/src/configurable/commission.service.ts b/src/configurable/commission.service.ts new file mode 100644 index 0000000..3765970 --- /dev/null +++ b/src/configurable/commission.service.ts @@ -0,0 +1,48 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { EntityNotFoundError, Repository } from 'typeorm'; +import { Roles } from './entities/roles.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { UpdateUserDto } from '../users/dto/update-user.dto'; +import { CommissionSetting } from './entities/commission_setting.entity'; + +@Injectable() +export class CommissionService { + constructor( + @InjectRepository(CommissionSetting) + private commissionRepository: Repository, + ) {} + + findAllRoles(page) { + return this.commissionRepository.findAndCount({ + skip: page * 10, + take: 10, + order: { + version: 'DESC', + }, + }); + } + + async updateCommission(id: string, request) { + try { + await this.commissionRepository.findOneOrFail(id); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + + const result = await this.commissionRepository.update(id, { + commission: request.value, + }); + + return this.commissionRepository.findOneOrFail(id); + } +} diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index f1ca79c..63d6006 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -11,13 +11,17 @@ import { Query, } from '@nestjs/common'; import { RoleService } from './roles.service'; +import { CommissionService } from './commission.service'; @Controller({ path: 'config', version: '1', }) export class ConfigurableController { - constructor(private readonly roleService: RoleService) {} + constructor( + private readonly roleService: RoleService, + private readonly commissionService: CommissionService, + ) {} @Get('/roles') async findAll(@Query('page') page: number) { @@ -31,6 +35,18 @@ export class ConfigurableController { }; } + @Get('/commission') + async findCommission(@Query('page') page: number) { + const [data, count] = await this.commissionService.findAllRoles(page); + + return { + data, + count, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + @Get(':id') async findOne(@Param('id', ParseUUIDPipe) id: string) { return { @@ -39,4 +55,16 @@ export class ConfigurableController { message: 'success', }; } + + @Put('/commission/:id') + async updateCommission( + @Param('id', ParseUUIDPipe) id: string, + @Body() request, + ) { + return { + data: await this.commissionService.updateCommission(id, request), + statusCode: HttpStatus.OK, + message: 'success', + }; + } } diff --git a/src/configurable/configurable.module.ts b/src/configurable/configurable.module.ts index 5325245..58d0459 100644 --- a/src/configurable/configurable.module.ts +++ b/src/configurable/configurable.module.ts @@ -3,11 +3,13 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { Roles } from './entities/roles.entity'; import { ConfigurableController } from './configurable.controller'; import { RoleService } from './roles.service'; +import { CommissionService } from './commission.service'; +import { CommissionSetting } from './entities/commission_setting.entity'; @Module({ - imports: [TypeOrmModule.forFeature([Roles])], + imports: [TypeOrmModule.forFeature([Roles, CommissionSetting])], controllers: [ConfigurableController], - providers: [RoleService], - exports: [RoleService] + providers: [RoleService, CommissionService], + exports: [RoleService], }) export class ConfigurableModule {} diff --git a/src/configurable/entities/commission_setting.entity.ts b/src/configurable/entities/commission_setting.entity.ts new file mode 100644 index 0000000..8f0de02 --- /dev/null +++ b/src/configurable/entities/commission_setting.entity.ts @@ -0,0 +1,16 @@ +import { Entity, Column, OneToOne, JoinColumn } from 'typeorm'; +import { BaseModel } from '../../config/basemodel.entity'; +import { Roles } from './roles.entity'; + +@Entity() +export class CommissionSetting extends BaseModel { + @Column() + name: string; + + @Column() + commission: number; + + @OneToOne(() => Roles) + @JoinColumn() + role: Roles; +} diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index 303ff60..2ba4d88 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -24,10 +24,15 @@ export enum coaType { BANK, EXPENSE, ACCOUNT_RECEIVABLE, - ACCOUNT_PAYABLE + ACCOUNT_PAYABLE, } export enum balanceType { DEBIT, CREDIT, -} \ No newline at end of file +} + +export enum accountType { + PARTNER, + CUSTOMER, +} diff --git a/src/users/entities/partner.entity.ts b/src/users/entities/partner.entity.ts new file mode 100644 index 0000000..8ff03d9 --- /dev/null +++ b/src/users/entities/partner.entity.ts @@ -0,0 +1,13 @@ +import { Roles } from 'src/configurable/entities/roles.entity'; +import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; +import { BaseModel } from '../../config/basemodel.entity'; +import { hashPassword } from '../../helper/hash_password'; + +@Entity() +export class User extends BaseModel { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + name: string; +} diff --git a/src/users/entities/userDetail.entity.ts b/src/users/entities/userDetail.entity.ts deleted file mode 100644 index 579325b..0000000 --- a/src/users/entities/userDetail.entity.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { - Entity, - Column, - PrimaryGeneratedColumn, - UpdateDateColumn, - DeleteDateColumn, - VersionColumn, - CreateDateColumn, -} from 'typeorm'; - -@Entity() -export class User { - @PrimaryGeneratedColumn('uuid') - id: string; - - @Column() - firstName: string; -} diff --git a/src/users/entities/user_detail.entity.ts b/src/users/entities/user_detail.entity.ts new file mode 100644 index 0000000..7113eb9 --- /dev/null +++ b/src/users/entities/user_detail.entity.ts @@ -0,0 +1,22 @@ +import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; +import { accountType } from '../../helper/enum-list'; + +@Entity() +export class UserDetail { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + name: string; + + @Column() + first_name: string; + + @Column() + phone_number: string; + + @Column({ + nullable: true, + }) + type: accountType; +} From 14a00988d90e9c400bf56d57521022f4ec6357c5 Mon Sep 17 00:00:00 2001 From: ilham Date: Sat, 11 Dec 2021 23:45:03 +0700 Subject: [PATCH 2/5] add: create supplier --- src/helper/enum-list.ts | 2 + src/product/dto/product/create-product.dto.ts | 3 + .../entities/product-history-price.entity.ts | 4 + src/product/entities/product.entity.ts | 11 ++ src/transaction/coa.service.ts | 57 +++++++-- src/transaction/dto/input-coa.dto.ts | 4 + src/transaction/entities/coa.entity.ts | 16 ++- .../entities/transaction-journal.entity.ts | 1 - .../entities/transaction-type.entity.ts | 11 -- src/transaction/transaction.module.ts | 10 +- src/transaction/transaction.service.ts | 3 - src/users/dto/create-partner.dto.ts | 15 +++ src/users/dto/create-supplier.dto.ts | 9 ++ .../{partner.entity.ts => supplier.entity.ts} | 8 +- src/users/supplier.service.spec.ts | 18 +++ src/users/supplier.service.ts | 114 ++++++++++++++++++ src/users/users.controller.ts | 16 ++- src/users/users.module.ts | 10 +- 18 files changed, 267 insertions(+), 45 deletions(-) delete mode 100644 src/transaction/entities/transaction-type.entity.ts create mode 100644 src/users/dto/create-partner.dto.ts create mode 100644 src/users/dto/create-supplier.dto.ts rename src/users/entities/{partner.entity.ts => supplier.entity.ts} (77%) create mode 100644 src/users/supplier.service.spec.ts create mode 100644 src/users/supplier.service.ts diff --git a/src/helper/enum-list.ts b/src/helper/enum-list.ts index 2ba4d88..8c29165 100644 --- a/src/helper/enum-list.ts +++ b/src/helper/enum-list.ts @@ -25,6 +25,8 @@ export enum coaType { EXPENSE, ACCOUNT_RECEIVABLE, ACCOUNT_PAYABLE, + BUDGET, + CONTRA_BUDGET, } export enum balanceType { diff --git a/src/product/dto/product/create-product.dto.ts b/src/product/dto/product/create-product.dto.ts index be1ab0c..74433dc 100644 --- a/src/product/dto/product/create-product.dto.ts +++ b/src/product/dto/product/create-product.dto.ts @@ -18,4 +18,7 @@ export class CreateProductDto { @IsUUID() subCategoriesId: string; + + @IsUUID() + supplierId: string; } diff --git a/src/product/entities/product-history-price.entity.ts b/src/product/entities/product-history-price.entity.ts index e50d22d..6abf098 100644 --- a/src/product/entities/product-history-price.entity.ts +++ b/src/product/entities/product-history-price.entity.ts @@ -2,6 +2,7 @@ import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; import { Product } from './product.entity'; import { BaseModel } from '../../config/basemodel.entity'; import { productType } from '../../helper/enum-list'; +import { User } from '../../users/entities/user.entity'; @Entity() export class ProductHistoryPrice extends BaseModel { @@ -11,6 +12,9 @@ export class ProductHistoryPrice extends BaseModel { @ManyToOne(() => Product, (product) => product.id) product: Product; + @ManyToOne(() => User, (user) => user.id) + user: User; + @Column() price: number; diff --git a/src/product/entities/product.entity.ts b/src/product/entities/product.entity.ts index 982fa3b..cc2241f 100644 --- a/src/product/entities/product.entity.ts +++ b/src/product/entities/product.entity.ts @@ -11,6 +11,7 @@ import { } from 'typeorm'; import { ProductSubCategories } from './product-sub-category.entity'; import { BaseModel } from '../../config/basemodel.entity'; +import { Supplier } from '../../users/entities/supplier.entity'; @Entity() export class Product extends BaseModel { @@ -43,4 +44,14 @@ export class Product extends BaseModel { }, ) sub_categories: ProductSubCategories; + + @ManyToOne( + () => { + return Supplier; + }, + (partner) => { + return partner.id; + }, + ) + supplier: Supplier; } diff --git a/src/transaction/coa.service.ts b/src/transaction/coa.service.ts index d828f5f..33beffc 100644 --- a/src/transaction/coa.service.ts +++ b/src/transaction/coa.service.ts @@ -1,4 +1,10 @@ -import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { COA } from './entities/coa.entity'; @@ -10,24 +16,40 @@ export class CoaService { constructor( @InjectRepository(COA) private coaRepository: Repository, - @Inject(forwardRef(() => UsersService)) + @Inject( + forwardRef(() => { + return UsersService; + }), + ) private userService: UsersService, ) {} async create(inputCoaDto: InputCoaDto) { - const user = inputCoaDto.user - let coaData = new COA(); - coaData.user = user.id; - coaData.name = coaType[inputCoaDto.type] + '-' + user.username; + const coaData = new COA(); + let name = ''; + if (inputCoaDto.user) { + coaData.user = inputCoaDto.user.id; + name = inputCoaDto.user.username; + } + + if (inputCoaDto.supplier) { + coaData.supplier = inputCoaDto.supplier.id; + name = inputCoaDto.supplier.code; + } + + coaData.name = `${coaType[inputCoaDto.type]}-${name}`; coaData.balanceType = inputCoaDto.balanceType; coaData.type = inputCoaDto.type; coaData.amount = 0; - const result = await inputCoaDto.coaEntityManager.insert(COA,coaData); + const result = await inputCoaDto.coaEntityManager.insert(COA, coaData); - if(inputCoaDto.type == coaType.ACCOUNT_RECEIVABLE || inputCoaDto.type == coaType.ACCOUNT_PAYABLE){ + if ( + inputCoaDto.type == coaType.ACCOUNT_RECEIVABLE || + inputCoaDto.type == coaType.ACCOUNT_PAYABLE + ) { coaData.relatedUser = inputCoaDto.relatedUserId; - await inputCoaDto.coaEntityManager.save(coaData) + await inputCoaDto.coaEntityManager.save(coaData); } return coaData; @@ -35,7 +57,10 @@ export class CoaService { async findByUser(id: string, typeOfCoa: coaType) { try { - return await this.coaRepository.findOneOrFail({ user: id, type: typeOfCoa }); + return await this.coaRepository.findOneOrFail({ + user: id, + type: typeOfCoa, + }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( @@ -51,9 +76,17 @@ export class CoaService { } } - async findByUserWithRelated(id: string, relatedId: string, typeOfCoa: coaType) { + async findByUserWithRelated( + id: string, + relatedId: string, + typeOfCoa: coaType, + ) { try { - return await this.coaRepository.findOneOrFail({ user: id, type: typeOfCoa, relatedUser:relatedId }); + return await this.coaRepository.findOneOrFail({ + user: id, + type: typeOfCoa, + relatedUser: relatedId, + }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( diff --git a/src/transaction/dto/input-coa.dto.ts b/src/transaction/dto/input-coa.dto.ts index 5e068dc..b6c580d 100644 --- a/src/transaction/dto/input-coa.dto.ts +++ b/src/transaction/dto/input-coa.dto.ts @@ -2,6 +2,7 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; import { balanceType, coaType } from 'src/helper/enum-list'; import { User } from 'src/users/entities/user.entity'; import { EntityManager } from 'typeorm'; +import { Supplier } from '../../users/entities/supplier.entity'; export class InputCoaDto { @IsUUID() @@ -16,6 +17,9 @@ export class InputCoaDto { @IsUUID() relatedUserId: string; + @IsUUID() + supplier: Supplier; + @IsNotEmpty() coaEntityManager: EntityManager; } diff --git a/src/transaction/entities/coa.entity.ts b/src/transaction/entities/coa.entity.ts index a463b68..b26ece3 100644 --- a/src/transaction/entities/coa.entity.ts +++ b/src/transaction/entities/coa.entity.ts @@ -1,7 +1,4 @@ -import { - Entity, - Column, -} from 'typeorm'; +import { Entity, Column } from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; import { coaType, balanceType } from '../../helper/enum-list'; @@ -19,11 +16,18 @@ export class COA extends BaseModel { @Column() amount: number; - @Column() + @Column({ + nullable: true, + }) user: string; @Column({ - nullable:true + nullable: true, }) relatedUser: string; + + @Column({ + nullable: true, + }) + supplier: string; } diff --git a/src/transaction/entities/transaction-journal.entity.ts b/src/transaction/entities/transaction-journal.entity.ts index ad5ba0a..821fc71 100644 --- a/src/transaction/entities/transaction-journal.entity.ts +++ b/src/transaction/entities/transaction-journal.entity.ts @@ -9,7 +9,6 @@ import { import { BaseModel } from '../../config/basemodel.entity'; import { COA } from './coa.entity'; import { Transactions } from './transactions.entity'; -import { TransactionType } from './transaction-type.entity'; import { balanceType } from '../../helper/enum-list'; @Entity() diff --git a/src/transaction/entities/transaction-type.entity.ts b/src/transaction/entities/transaction-type.entity.ts deleted file mode 100644 index c146c85..0000000 --- a/src/transaction/entities/transaction-type.entity.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { - Entity, - Column, -} from 'typeorm'; -import { BaseModel } from '../../config/basemodel.entity'; - -@Entity() -export class TransactionType extends BaseModel { - @Column() - name: string; -} diff --git a/src/transaction/transaction.module.ts b/src/transaction/transaction.module.ts index 8b1f631..698ef2b 100644 --- a/src/transaction/transaction.module.ts +++ b/src/transaction/transaction.module.ts @@ -4,7 +4,6 @@ import { TransactionController } from './transaction.controller'; import { PpobCallbackController } from './ppob_callback.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { COA } from './entities/coa.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'; @@ -13,17 +12,12 @@ import { UsersModule } from 'src/users/users.module'; @Module({ imports: [ - TypeOrmModule.forFeature([ - TransactionType, - COA, - TransactionJournal, - Transactions, - ]), + TypeOrmModule.forFeature([COA, TransactionJournal, Transactions]), ProductModule, forwardRef(() => UsersModule), ], controllers: [TransactionController, PpobCallbackController], providers: [TransactionService, CoaService], - exports:[CoaService] + exports: [CoaService], }) export class TransactionModule {} diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 9e818f9..17769fd 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -5,7 +5,6 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; import { Connection, EntityManager, 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 * as uuid from 'uuid'; @@ -34,8 +33,6 @@ export class TransactionService { constructor( @InjectRepository(Transactions) private transactionRepository: Repository, - @InjectRepository(TransactionType) - private transactionTypeRepository: Repository, @InjectRepository(TransactionJournal) private transactionJournalRepository: Repository, @InjectRepository(COA) diff --git a/src/users/dto/create-partner.dto.ts b/src/users/dto/create-partner.dto.ts new file mode 100644 index 0000000..b4acc45 --- /dev/null +++ b/src/users/dto/create-partner.dto.ts @@ -0,0 +1,15 @@ +import { IsNotEmpty } from 'class-validator'; + +export class CreatePartnerDto { + @IsNotEmpty() + name: string; + + @IsNotEmpty() + address: string; + + @IsNotEmpty() + owner: string; + + @IsNotEmpty() + npwp: string; +} diff --git a/src/users/dto/create-supplier.dto.ts b/src/users/dto/create-supplier.dto.ts new file mode 100644 index 0000000..8a2e585 --- /dev/null +++ b/src/users/dto/create-supplier.dto.ts @@ -0,0 +1,9 @@ +import { IsNotEmpty } from 'class-validator'; + +export class CreateSupplierDto { + @IsNotEmpty() + name: string; + + @IsNotEmpty() + code: string; +} diff --git a/src/users/entities/partner.entity.ts b/src/users/entities/supplier.entity.ts similarity index 77% rename from src/users/entities/partner.entity.ts rename to src/users/entities/supplier.entity.ts index 8ff03d9..080c04c 100644 --- a/src/users/entities/partner.entity.ts +++ b/src/users/entities/supplier.entity.ts @@ -4,10 +4,16 @@ import { BaseModel } from '../../config/basemodel.entity'; import { hashPassword } from '../../helper/hash_password'; @Entity() -export class User extends BaseModel { +export class Supplier extends BaseModel { @PrimaryGeneratedColumn('uuid') id: string; @Column() name: string; + + @Column() + code: string; + + @Column() + status: boolean; } diff --git a/src/users/supplier.service.spec.ts b/src/users/supplier.service.spec.ts new file mode 100644 index 0000000..9eb9cce --- /dev/null +++ b/src/users/supplier.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { SupplierService } from './supplier.service'; + +describe('PartnerService', () => { + let service: SupplierService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [SupplierService], + }).compile(); + + service = module.get(SupplierService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/users/supplier.service.ts b/src/users/supplier.service.ts new file mode 100644 index 0000000..a5ccbcf --- /dev/null +++ b/src/users/supplier.service.ts @@ -0,0 +1,114 @@ +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Connection, EntityNotFoundError, Repository } from 'typeorm'; +import { Supplier } from './entities/supplier.entity'; +import { InputCoaDto } from '../transaction/dto/input-coa.dto'; +import { balanceType, coaType } from '../helper/enum-list'; +import { CreateSupplierDto } from './dto/create-supplier.dto'; +import { CoaService } from '../transaction/coa.service'; +import * as uuid from 'uuid'; + +@Injectable() +export class SupplierService { + constructor( + @InjectRepository(Supplier) + private supplierRepository: Repository, + @Inject( + forwardRef(() => { + return CoaService; + }), + ) + private coaService: CoaService, + private connection: Connection, + ) {} + + async create(createSupplierDto: CreateSupplierDto) { + const check = await this.supplierRepository.findOne({ + code: createSupplierDto.code, + }); + + if (check) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'Supplier Already Exist', + }, + HttpStatus.NOT_FOUND, + ); + } + + const supplierData = new Supplier(); + supplierData.id = uuid.v4(); + supplierData.name = createSupplierDto.name; + supplierData.code = createSupplierDto.code; + supplierData.status = true; + + await this.connection.transaction(async (manager) => { + const result = await manager.insert(Supplier, supplierData); + + const dataCoaInventory = new InputCoaDto(); + dataCoaInventory.supplier = supplierData; + dataCoaInventory.balanceType = balanceType.DEBIT; + dataCoaInventory.type = coaType.INVENTORY; + dataCoaInventory.coaEntityManager = manager; + await this.coaService.create(dataCoaInventory); + + const dataCoaCostOfSales = new InputCoaDto(); + dataCoaCostOfSales.supplier = supplierData; + dataCoaCostOfSales.balanceType = balanceType.DEBIT; + dataCoaCostOfSales.type = coaType.COST_OF_SALES; + dataCoaCostOfSales.coaEntityManager = manager; + await this.coaService.create(dataCoaCostOfSales); + + const dataCoaBudget = new InputCoaDto(); + dataCoaBudget.supplier = supplierData; + dataCoaBudget.balanceType = balanceType.DEBIT; + dataCoaBudget.type = coaType.BUDGET; + dataCoaBudget.coaEntityManager = manager; + await this.coaService.create(dataCoaBudget); + + const dataCoaContraBudget = new InputCoaDto(); + dataCoaContraBudget.supplier = supplierData; + dataCoaContraBudget.balanceType = balanceType.CREDIT; + dataCoaContraBudget.type = coaType.CONTRA_BUDGET; + dataCoaContraBudget.coaEntityManager = manager; + await this.coaService.create(dataCoaContraBudget); + }); + + return supplierData; + } + + findAllSupplier(page) { + return this.supplierRepository.findAndCount({ + skip: page * 10, + take: 10, + order: { + version: 'DESC', + }, + }); + } + + async findOne(id: string) { + try { + return await this.supplierRepository.findOneOrFail(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/users/users.controller.ts b/src/users/users.controller.ts index addb15e..7980740 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -15,13 +15,18 @@ import { UsersService } from './users.service'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { Public } from '../auth/public.decorator'; +import { CreateSupplierDto } from './dto/create-supplier.dto'; +import { SupplierService } from './supplier.service'; @Controller({ path: 'users', version: '1', }) export class UsersController { - constructor(private readonly usersService: UsersService) {} + constructor( + private readonly usersService: UsersService, + private readonly supplierService: SupplierService, + ) {} @Post() async create(@Request() req, @Body() createUserDto: CreateUserDto) { @@ -32,6 +37,15 @@ export class UsersController { }; } + @Post('supplier') + async createPartner(@Body() createPartnerDto: CreateSupplierDto) { + return { + data: await this.supplierService.create(createPartnerDto), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Public() @Get() async findAll(@Query('page') page: number) { diff --git a/src/users/users.module.ts b/src/users/users.module.ts index c9ef16d..637a6ea 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -5,11 +5,17 @@ import { UsersController } from './users.controller'; import { User } from './entities/user.entity'; import { TransactionModule } from 'src/transaction/transaction.module'; import { ConfigurableModule } from 'src/configurable/configurable.module'; +import { SupplierService } from './supplier.service'; +import { Supplier } from './entities/supplier.entity'; @Module({ - imports: [TypeOrmModule.forFeature([User]), forwardRef(() => TransactionModule), ConfigurableModule], + imports: [ + TypeOrmModule.forFeature([User, Supplier]), + forwardRef(() => TransactionModule), + ConfigurableModule, + ], controllers: [UsersController], - providers: [UsersService], + providers: [UsersService, SupplierService], exports: [UsersService], }) export class UsersModule {} From ed5ca6556dfefe47fb707a1a4572746ca48bc4ee Mon Sep 17 00:00:00 2001 From: ilham Date: Sun, 12 Dec 2021 00:23:13 +0700 Subject: [PATCH 3/5] add: top up saldo supplier --- src/transaction/dto/add-saldo-supplier.dto.ts | 16 +++++---- src/transaction/transaction.controller.ts | 2 +- src/transaction/transaction.service.ts | 34 ++++++++++++++----- src/users/supplier.service.ts | 6 ++-- src/users/users.module.ts | 2 +- 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/transaction/dto/add-saldo-supplier.dto.ts b/src/transaction/dto/add-saldo-supplier.dto.ts index 6f27f52..8927ac7 100644 --- a/src/transaction/dto/add-saldo-supplier.dto.ts +++ b/src/transaction/dto/add-saldo-supplier.dto.ts @@ -1,12 +1,16 @@ import { IsNotEmpty, IsUUID } from 'class-validator'; -import { balanceType, coaType, statusTransaction, typeTransaction } from 'src/helper/enum-list'; +import { + balanceType, + coaType, + statusTransaction, + typeTransaction, +} from 'src/helper/enum-list'; import { EntityManager } from 'typeorm'; - export class AddSaldoSupplier { - @IsNotEmpty() - supplier?: string; + @IsNotEmpty() + supplier: string; - @IsNotEmpty() - amount?: number; + @IsNotEmpty() + amount: number; } diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 1d60c85..9d95332 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -54,7 +54,7 @@ export class TransactionController { @Request() req, ) { return { - data: await this.transactionService.addIRSWallet( + data: await this.transactionService.addPartnerSaldo( addSaldoSupplier, req.user, ), diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 17769fd..7772502 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -21,6 +21,7 @@ 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'; +import { SupplierService } from '../users/supplier.service'; interface JournalEntry { coa_id: string; @@ -40,17 +41,29 @@ export class TransactionService { private coaService: CoaService, private productService: ProductService, private userService: UsersService, + private supplierService: SupplierService, private connection: Connection, ) {} - async addIRSWallet(addSaldoSupplier: AddSaldoSupplier, currentUser: any) { + async addPartnerSaldo(addSaldoSupplier: AddSaldoSupplier, currentUser: any) { + const supplier = await this.supplierService.findByCode( + addSaldoSupplier.supplier, + ); // GET COA const coaBank = await this.coaService.findByName( `${coaType[coaType.BANK]}-SYSTEM`, ); const coaInventory = await this.coaService.findByName( - `${coaType[coaType.INVENTORY]}-${addSaldoSupplier.supplier}`, + `${coaType[coaType.INVENTORY]}-${supplier.code}`, + ); + + const coaBudget = await this.coaService.findByName( + `${coaType[coaType.BUDGET]}-${supplier.code}`, + ); + + const coaContraBudget = await this.coaService.findByName( + `${coaType[coaType.CONTRA_BUDGET]}-${supplier.code}`, ); //GET USER @@ -78,10 +91,18 @@ export class TransactionService { journals: [ { coa_id: coaBank.id, - debit: transactionData.amount, + credit: transactionData.amount, }, { coa_id: coaInventory.id, + debit: transactionData.amount, + }, + { + coa_id: coaBudget.id, + debit: transactionData.amount, + }, + { + coa_id: coaContraBudget.id, credit: transactionData.amount, }, ], @@ -429,15 +450,12 @@ export class TransactionService { ); let balance = new Decimal(coa.amount); - - if (coa.balanceType === balanceType.DEBIT) { + if (coa.balanceType == balanceType.DEBIT) { balance = balance.plus(debitSum.minus(creditSum)); - } else if (coa.balanceType === balanceType.CREDIT) { + } else if (coa.balanceType == balanceType.CREDIT) { balance = balance.plus(creditSum.minus(debitSum)); } - const diff = balance.minus(new Decimal(coa.amount)); - return createJournalDto.transactionalEntityManager .createQueryBuilder() .update(COA) diff --git a/src/users/supplier.service.ts b/src/users/supplier.service.ts index a5ccbcf..6f5278b 100644 --- a/src/users/supplier.service.ts +++ b/src/users/supplier.service.ts @@ -94,9 +94,11 @@ export class SupplierService { }); } - async findOne(id: string) { + async findByCode(code: string) { try { - return await this.supplierRepository.findOneOrFail(id); + return await this.supplierRepository.findOneOrFail({ + code: code, + }); } catch (e) { if (e instanceof EntityNotFoundError) { throw new HttpException( diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 637a6ea..0cf442a 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -16,6 +16,6 @@ import { Supplier } from './entities/supplier.entity'; ], controllers: [UsersController], providers: [UsersService, SupplierService], - exports: [UsersService], + exports: [UsersService, SupplierService], }) export class UsersModule {} From 78470a0e3fdca66f7ebd8490dd455acd995d1514 Mon Sep 17 00:00:00 2001 From: ilham Date: Sun, 12 Dec 2021 01:01:37 +0700 Subject: [PATCH 4/5] fix: distribute saldo partner from admin --- .../dto/distribute-transaction.dto.ts | 3 ++ .../entities/transaction-journal.entity.ts | 8 ++-- src/transaction/transaction.service.ts | 39 ++++++++++++++++--- src/users/users.service.ts | 5 ++- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/transaction/dto/distribute-transaction.dto.ts b/src/transaction/dto/distribute-transaction.dto.ts index 7d79186..c1728ce 100644 --- a/src/transaction/dto/distribute-transaction.dto.ts +++ b/src/transaction/dto/distribute-transaction.dto.ts @@ -6,4 +6,7 @@ export class DistributeTransactionDto { @IsNotEmpty() destination: string; + + @IsNotEmpty() + supplier: string; } diff --git a/src/transaction/entities/transaction-journal.entity.ts b/src/transaction/entities/transaction-journal.entity.ts index 821fc71..b3a9664 100644 --- a/src/transaction/entities/transaction-journal.entity.ts +++ b/src/transaction/entities/transaction-journal.entity.ts @@ -19,15 +19,15 @@ export class TransactionJournal extends BaseModel { @Column() amount: number; - @OneToOne( + @ManyToOne( () => { return Transactions; }, - (trans) => { - return trans.id; + (transaction) => { + return transaction.id; }, ) - transaction: Transactions; + transaction_head: Transactions; @ManyToOne( () => { diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 7772502..f831e16 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -116,6 +116,25 @@ export class TransactionService { distributeTransactionDto: DistributeTransactionDto, currentUser: any, ) { + //GET USER + const userData = await this.userService.findByUsername( + currentUser.username, + ); + if (userData.roles.name != 'Admin') { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'Roles Not Admin', + }, + HttpStatus.NOT_ACCEPTABLE, + ); + } + + //GET Supplier + const supplier = await this.supplierService.findByCode( + distributeTransactionDto.supplier, + ); + // GET COA const coaAR = await this.coaService.findByUser( distributeTransactionDto.destination, @@ -125,10 +144,12 @@ export class TransactionService { distributeTransactionDto.destination, coaType.WALLET, ); + const coaBudget = await this.coaService.findByName( + `${coaType[coaType.BUDGET]}-${supplier.code}`, + ); - //GET USER - const userData = await this.userService.findByUsername( - currentUser.username, + const coaContraBudget = await this.coaService.findByName( + `${coaType[coaType.CONTRA_BUDGET]}-${supplier.code}`, ); await this.connection.transaction(async (manager) => { @@ -157,6 +178,14 @@ export class TransactionService { coa_id: coaWallet.id, credit: transactionData.amount, }, + { + coa_id: coaBudget.id, + credit: transactionData.amount, + }, + { + coa_id: coaContraBudget.id, + debit: transactionData.amount, + }, ], }); }); @@ -412,9 +441,9 @@ export class TransactionService { ? balanceType.DEBIT : balanceType.CREDIT; journalEntry.amount = journal.debit ? journal.debit : journal.credit; - journalEntry.transaction = transaction; + journalEntry.transaction_head = transaction; - return this.transactionJournalRepository.save(journalEntry); + return createJournalDto.transactionalEntityManager.save(journalEntry); }), ); diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 228a642..2f3cb0e 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -157,7 +157,10 @@ export class UsersService { async findByUsername(username: string) { try { return await this.usersRepository.findOneOrFail({ - username: username, + where: { + username: username, + }, + relations: ['roles'], }); } catch (e) { if (e instanceof EntityNotFoundError) { From ff60406af29e3aad45be79dc82a8fee3768044e9 Mon Sep 17 00:00:00 2001 From: ilham Date: Mon, 13 Dec 2021 00:49:13 +0700 Subject: [PATCH 5/5] add:partner module --- src/auth/auth.service.ts | 1 + src/configurable/roles.service.ts | 2 +- src/transaction/transaction.service.ts | 2 +- src/users/dto/create-partner.dto.ts | 3 + src/users/dto/create-user.dto.ts | 2 + src/users/entities/partner.entity.ts | 22 ++++++ src/users/entities/user.entity.ts | 11 +++ src/users/partner/partner.service.spec.ts | 18 +++++ src/users/partner/partner.service.ts | 79 +++++++++++++++++++ .../{ => supplier}/supplier.service.spec.ts | 0 src/users/{ => supplier}/supplier.service.ts | 10 +-- src/users/users.controller.ts | 54 +++++++++++-- src/users/users.module.ts | 8 +- src/users/users.service.ts | 29 ++++--- 14 files changed, 216 insertions(+), 25 deletions(-) create mode 100644 src/users/entities/partner.entity.ts create mode 100644 src/users/partner/partner.service.spec.ts create mode 100644 src/users/partner/partner.service.ts rename src/users/{ => supplier}/supplier.service.spec.ts (100%) rename src/users/{ => supplier}/supplier.service.ts (91%) diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index e0212c1..78f8b4b 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -28,6 +28,7 @@ export class AuthService { username: user.username, sub: user.id, role: user.roles.name, + partner: user.partner.id, }; return { diff --git a/src/configurable/roles.service.ts b/src/configurable/roles.service.ts index 9404376..7147f1a 100644 --- a/src/configurable/roles.service.ts +++ b/src/configurable/roles.service.ts @@ -28,7 +28,7 @@ export class RoleService { throw new HttpException( { statusCode: HttpStatus.NOT_FOUND, - error: 'Data not found', + error: 'Data Role not found', }, HttpStatus.NOT_FOUND, ); diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index f831e16..3af4c7a 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -21,7 +21,7 @@ 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'; -import { SupplierService } from '../users/supplier.service'; +import { SupplierService } from '../users/supplier/supplier.service'; interface JournalEntry { coa_id: string; diff --git a/src/users/dto/create-partner.dto.ts b/src/users/dto/create-partner.dto.ts index b4acc45..2fbac10 100644 --- a/src/users/dto/create-partner.dto.ts +++ b/src/users/dto/create-partner.dto.ts @@ -12,4 +12,7 @@ export class CreatePartnerDto { @IsNotEmpty() npwp: string; + + @IsNotEmpty() + password_account: string; } diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index d9f00b8..122fd85 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -1,4 +1,5 @@ import { IsNotEmpty, IsOptional, IsUUID, ValidateIf } from 'class-validator'; +import { Partner } from '../entities/partner.entity'; export class CreateUserDto { @IsNotEmpty() @@ -13,6 +14,7 @@ export class CreateUserDto { @IsNotEmpty() superior: boolean; + partner: Partner; // @ValidateIf((o) => { // return !!o.superior; // }) diff --git a/src/users/entities/partner.entity.ts b/src/users/entities/partner.entity.ts new file mode 100644 index 0000000..9d2402b --- /dev/null +++ b/src/users/entities/partner.entity.ts @@ -0,0 +1,22 @@ +import { Roles } from 'src/configurable/entities/roles.entity'; +import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; +import { BaseModel } from '../../config/basemodel.entity'; +import { hashPassword } from '../../helper/hash_password'; + +@Entity() +export class Partner extends BaseModel { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + name: string; + + @Column() + npwp: string; + + @Column() + address: string; + + @Column({ default: true }) + status: boolean; +} diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 5a121c6..89bc47f 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -2,6 +2,7 @@ import { Roles } from 'src/configurable/entities/roles.entity'; import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; import { BaseModel } from '../../config/basemodel.entity'; import { hashPassword } from '../../helper/hash_password'; +import { Partner } from './partner.entity'; @Entity() export class User extends BaseModel { @@ -39,4 +40,14 @@ export class User extends BaseModel { }, ) roles: Roles; + + @ManyToOne( + () => { + return Partner; + }, + (partner) => { + return partner.id; + }, + ) + partner: Partner; } diff --git a/src/users/partner/partner.service.spec.ts b/src/users/partner/partner.service.spec.ts new file mode 100644 index 0000000..81edeba --- /dev/null +++ b/src/users/partner/partner.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { PartnerService } from './partner.service'; + +describe('PartnerService', () => { + let service: PartnerService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [PartnerService], + }).compile(); + + service = module.get(PartnerService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/users/partner/partner.service.ts b/src/users/partner/partner.service.ts new file mode 100644 index 0000000..78ca16d --- /dev/null +++ b/src/users/partner/partner.service.ts @@ -0,0 +1,79 @@ +import { + forwardRef, + HttpException, + HttpStatus, + Inject, + Injectable, +} from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Connection, EntityNotFoundError, Repository } from 'typeorm'; +import { CoaService } from '../../transaction/coa.service'; +import { CreatePartnerDto } from '../dto/create-partner.dto'; +import { Partner } from '../entities/partner.entity'; +import * as uuid from 'uuid'; +import { UsersService } from '../users.service'; +import { CreateUserDto } from '../dto/create-user.dto'; + +@Injectable() +export class PartnerService { + constructor( + @InjectRepository(Partner) + private partnerRepository: Repository, + @Inject( + forwardRef(() => { + return CoaService; + }), + ) + private coaService: CoaService, + private userService: UsersService, + private connection: Connection, + ) {} + + async create(createPartnerDto: CreatePartnerDto, currentUser: any) { + const check = await this.partnerRepository.findOne({ + npwp: createPartnerDto.npwp, + }); + + if (check) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_ACCEPTABLE, + error: 'N Already Exist', + }, + HttpStatus.NOT_FOUND, + ); + } + + const partnerData = new Partner(); + partnerData.id = uuid.v4(); + partnerData.name = createPartnerDto.name; + partnerData.npwp = createPartnerDto.npwp; + partnerData.address = createPartnerDto.address; + partnerData.status = true; + + await this.connection.transaction(async (manager) => { + const result = await manager.insert(Partner, partnerData); + }); + + const dataUser = new CreateUserDto(); + dataUser.username = `admin_${partnerData.name}`; + dataUser.roleId = '21dceea2-416e-4b55-b74c-12605e1f8d1b'; + dataUser.superior = false; + dataUser.partner = partnerData; + dataUser.password = createPartnerDto.password_account; + + await this.userService.create(dataUser, currentUser); + + return partnerData; + } + + findAllPartner(page) { + return this.partnerRepository.findAndCount({ + skip: page * 10, + take: 10, + order: { + version: 'DESC', + }, + }); + } +} diff --git a/src/users/supplier.service.spec.ts b/src/users/supplier/supplier.service.spec.ts similarity index 100% rename from src/users/supplier.service.spec.ts rename to src/users/supplier/supplier.service.spec.ts diff --git a/src/users/supplier.service.ts b/src/users/supplier/supplier.service.ts similarity index 91% rename from src/users/supplier.service.ts rename to src/users/supplier/supplier.service.ts index 6f5278b..3bff728 100644 --- a/src/users/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -7,11 +7,11 @@ import { } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Connection, EntityNotFoundError, Repository } from 'typeorm'; -import { Supplier } from './entities/supplier.entity'; -import { InputCoaDto } from '../transaction/dto/input-coa.dto'; -import { balanceType, coaType } from '../helper/enum-list'; -import { CreateSupplierDto } from './dto/create-supplier.dto'; -import { CoaService } from '../transaction/coa.service'; +import { Supplier } from '../entities/supplier.entity'; +import { InputCoaDto } from '../../transaction/dto/input-coa.dto'; +import { balanceType, coaType } from '../../helper/enum-list'; +import { CreateSupplierDto } from '../dto/create-supplier.dto'; +import { CoaService } from '../../transaction/coa.service'; import * as uuid from 'uuid'; @Injectable() diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 7980740..e6a77ff 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -16,7 +16,9 @@ import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { Public } from '../auth/public.decorator'; import { CreateSupplierDto } from './dto/create-supplier.dto'; -import { SupplierService } from './supplier.service'; +import { SupplierService } from './supplier/supplier.service'; +import { PartnerService } from './partner/partner.service'; +import { CreatePartnerDto } from './dto/create-partner.dto'; @Controller({ path: 'users', @@ -26,6 +28,7 @@ export class UsersController { constructor( private readonly usersService: UsersService, private readonly supplierService: SupplierService, + private readonly partnerService: PartnerService, ) {} @Post() @@ -38,7 +41,7 @@ export class UsersController { } @Post('supplier') - async createPartner(@Body() createPartnerDto: CreateSupplierDto) { + async createSupplier(@Body() createPartnerDto: CreateSupplierDto) { return { data: await this.supplierService.create(createPartnerDto), statusCode: HttpStatus.CREATED, @@ -46,10 +49,49 @@ export class UsersController { }; } - @Public() + @Post('partner') + async createPartner( + @Request() req, + @Body() createPartnerDto: CreatePartnerDto, + ) { + return { + data: await this.partnerService.create(createPartnerDto, req.user), + statusCode: HttpStatus.CREATED, + message: 'success', + }; + } + @Get() - async findAll(@Query('page') page: number) { - const [data, count] = await this.usersService.findAll(page); + async findAll(@Request() req, @Query('page') page: number) { + const [data, count] = await this.usersService.findAll( + page, + req.user.userId, + ); + + return { + data, + count, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Public() + @Get('supplier') + async findAllSupplier(@Query('page') page: number) { + const [data, count] = await this.supplierService.findAllSupplier(page); + + return { + data, + count, + statusCode: HttpStatus.OK, + message: 'success', + }; + } + + @Get('partner') + async findAllPartner(@Query('page') page: number) { + const [data, count] = await this.partnerService.findAllPartner(page); return { data, @@ -65,6 +107,7 @@ export class UsersController { req.user.userId, page, ); + return { data, count, @@ -79,6 +122,7 @@ export class UsersController { @Query('page') page: number, ) { const [data, count] = await this.usersService.findByRoles(id, page); + return { data, count, diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 0cf442a..079856d 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -5,17 +5,19 @@ import { UsersController } from './users.controller'; import { User } from './entities/user.entity'; import { TransactionModule } from 'src/transaction/transaction.module'; import { ConfigurableModule } from 'src/configurable/configurable.module'; -import { SupplierService } from './supplier.service'; +import { SupplierService } from './supplier/supplier.service'; import { Supplier } from './entities/supplier.entity'; +import { Partner } from './entities/partner.entity'; +import { PartnerService } from './partner/partner.service'; @Module({ imports: [ - TypeOrmModule.forFeature([User, Supplier]), + TypeOrmModule.forFeature([User, Supplier, Partner]), forwardRef(() => TransactionModule), ConfigurableModule, ], controllers: [UsersController], - providers: [UsersService, SupplierService], + providers: [UsersService, SupplierService, PartnerService], exports: [UsersService, SupplierService], }) export class UsersModule {} diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 2f3cb0e..e94e43f 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -7,7 +7,13 @@ import { } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; -import { Connection, EntityNotFoundError, Repository } from 'typeorm'; +import { + Connection, + EntityNotFoundError, + Equal, + Not, + Repository, +} from 'typeorm'; import { User } from './entities/user.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; @@ -59,53 +65,56 @@ export class UsersService { userData.username = createUserDto.username; userData.password = await hashPassword(createUserDto.password, salt); userData.salt = salt; - userData.superior = superior; + if (createUserDto.superior) { + userData.superior = superior; + } else { + userData.superior = null; + userData.partner = createUserDto.partner; + } userData.roles = roles; await this.connection.transaction(async (manager) => { const result = await manager.insert(User, userData); const dataCoaWallet = new InputCoaDto(); - dataCoaWallet.user = userData; dataCoaWallet.balanceType = balanceType.CREDIT; dataCoaWallet.type = coaType.WALLET; dataCoaWallet.coaEntityManager = manager; + await this.coaService.create(dataCoaWallet); if (createUserDto.superior) { const dataCoaAP = new InputCoaDto(); - dataCoaAP.user = userData; dataCoaAP.balanceType = balanceType.CREDIT; dataCoaAP.relatedUserId = superior.id; dataCoaAP.type = coaType.ACCOUNT_PAYABLE; dataCoaAP.coaEntityManager = manager; + await this.coaService.create(dataCoaAP); const dataCoaAR = new InputCoaDto(); - dataCoaAR.user = userData; dataCoaAR.balanceType = balanceType.DEBIT; dataCoaAR.relatedUserId = superior.id; dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE; dataCoaAR.coaEntityManager = manager; - - await this.coaService.create(dataCoaAP); await this.coaService.create(dataCoaAR); } - - await this.coaService.create(dataCoaWallet); }); return userData; } - findAll(page: number) { + findAll(page: number, id: string) { return this.usersRepository.findAndCount({ skip: page * 10, take: 10, order: { version: 'DESC', }, + where: { + id: Not(Equal(id)), + }, }); }