add:partner module
This commit is contained in:
parent
78470a0e3f
commit
ff60406af2
|
@ -28,6 +28,7 @@ export class AuthService {
|
||||||
username: user.username,
|
username: user.username,
|
||||||
sub: user.id,
|
sub: user.id,
|
||||||
role: user.roles.name,
|
role: user.roles.name,
|
||||||
|
partner: user.partner.id,
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -28,7 +28,7 @@ export class RoleService {
|
||||||
throw new HttpException(
|
throw new HttpException(
|
||||||
{
|
{
|
||||||
statusCode: HttpStatus.NOT_FOUND,
|
statusCode: HttpStatus.NOT_FOUND,
|
||||||
error: 'Data not found',
|
error: 'Data Role not found',
|
||||||
},
|
},
|
||||||
HttpStatus.NOT_FOUND,
|
HttpStatus.NOT_FOUND,
|
||||||
);
|
);
|
||||||
|
|
|
@ -21,7 +21,7 @@ import * as irsService from '../helper/irs-service';
|
||||||
import { CreateJournalDto } from './dto/create-journal.dto';
|
import { CreateJournalDto } from './dto/create-journal.dto';
|
||||||
import { UsersService } from 'src/users/users.service';
|
import { UsersService } from 'src/users/users.service';
|
||||||
import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto';
|
import { AddSaldoSupplier } from './dto/add-saldo-supplier.dto';
|
||||||
import { SupplierService } from '../users/supplier.service';
|
import { SupplierService } from '../users/supplier/supplier.service';
|
||||||
|
|
||||||
interface JournalEntry {
|
interface JournalEntry {
|
||||||
coa_id: string;
|
coa_id: string;
|
||||||
|
|
|
@ -12,4 +12,7 @@ export class CreatePartnerDto {
|
||||||
|
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
npwp: string;
|
npwp: string;
|
||||||
|
|
||||||
|
@IsNotEmpty()
|
||||||
|
password_account: string;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { IsNotEmpty, IsOptional, IsUUID, ValidateIf } from 'class-validator';
|
import { IsNotEmpty, IsOptional, IsUUID, ValidateIf } from 'class-validator';
|
||||||
|
import { Partner } from '../entities/partner.entity';
|
||||||
|
|
||||||
export class CreateUserDto {
|
export class CreateUserDto {
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
|
@ -13,6 +14,7 @@ export class CreateUserDto {
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
superior: boolean;
|
superior: boolean;
|
||||||
|
|
||||||
|
partner: Partner;
|
||||||
// @ValidateIf((o) => {
|
// @ValidateIf((o) => {
|
||||||
// return !!o.superior;
|
// return !!o.superior;
|
||||||
// })
|
// })
|
||||||
|
|
22
src/users/entities/partner.entity.ts
Normal file
22
src/users/entities/partner.entity.ts
Normal file
|
@ -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;
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ import { Roles } from 'src/configurable/entities/roles.entity';
|
||||||
import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm';
|
import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm';
|
||||||
import { BaseModel } from '../../config/basemodel.entity';
|
import { BaseModel } from '../../config/basemodel.entity';
|
||||||
import { hashPassword } from '../../helper/hash_password';
|
import { hashPassword } from '../../helper/hash_password';
|
||||||
|
import { Partner } from './partner.entity';
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class User extends BaseModel {
|
export class User extends BaseModel {
|
||||||
|
@ -39,4 +40,14 @@ export class User extends BaseModel {
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
roles: Roles;
|
roles: Roles;
|
||||||
|
|
||||||
|
@ManyToOne(
|
||||||
|
() => {
|
||||||
|
return Partner;
|
||||||
|
},
|
||||||
|
(partner) => {
|
||||||
|
return partner.id;
|
||||||
|
},
|
||||||
|
)
|
||||||
|
partner: Partner;
|
||||||
}
|
}
|
||||||
|
|
18
src/users/partner/partner.service.spec.ts
Normal file
18
src/users/partner/partner.service.spec.ts
Normal file
|
@ -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>(PartnerService);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be defined', () => {
|
||||||
|
expect(service).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
79
src/users/partner/partner.service.ts
Normal file
79
src/users/partner/partner.service.ts
Normal file
|
@ -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<Partner>,
|
||||||
|
@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',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,11 +7,11 @@ import {
|
||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
import { InjectRepository } from '@nestjs/typeorm';
|
import { InjectRepository } from '@nestjs/typeorm';
|
||||||
import { Connection, EntityNotFoundError, Repository } from 'typeorm';
|
import { Connection, EntityNotFoundError, Repository } from 'typeorm';
|
||||||
import { Supplier } from './entities/supplier.entity';
|
import { Supplier } from '../entities/supplier.entity';
|
||||||
import { InputCoaDto } from '../transaction/dto/input-coa.dto';
|
import { InputCoaDto } from '../../transaction/dto/input-coa.dto';
|
||||||
import { balanceType, coaType } from '../helper/enum-list';
|
import { balanceType, coaType } from '../../helper/enum-list';
|
||||||
import { CreateSupplierDto } from './dto/create-supplier.dto';
|
import { CreateSupplierDto } from '../dto/create-supplier.dto';
|
||||||
import { CoaService } from '../transaction/coa.service';
|
import { CoaService } from '../../transaction/coa.service';
|
||||||
import * as uuid from 'uuid';
|
import * as uuid from 'uuid';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
|
@ -16,7 +16,9 @@ import { CreateUserDto } from './dto/create-user.dto';
|
||||||
import { UpdateUserDto } from './dto/update-user.dto';
|
import { UpdateUserDto } from './dto/update-user.dto';
|
||||||
import { Public } from '../auth/public.decorator';
|
import { Public } from '../auth/public.decorator';
|
||||||
import { CreateSupplierDto } from './dto/create-supplier.dto';
|
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({
|
@Controller({
|
||||||
path: 'users',
|
path: 'users',
|
||||||
|
@ -26,6 +28,7 @@ export class UsersController {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly usersService: UsersService,
|
private readonly usersService: UsersService,
|
||||||
private readonly supplierService: SupplierService,
|
private readonly supplierService: SupplierService,
|
||||||
|
private readonly partnerService: PartnerService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
@Post()
|
@Post()
|
||||||
|
@ -38,7 +41,7 @@ export class UsersController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Post('supplier')
|
@Post('supplier')
|
||||||
async createPartner(@Body() createPartnerDto: CreateSupplierDto) {
|
async createSupplier(@Body() createPartnerDto: CreateSupplierDto) {
|
||||||
return {
|
return {
|
||||||
data: await this.supplierService.create(createPartnerDto),
|
data: await this.supplierService.create(createPartnerDto),
|
||||||
statusCode: HttpStatus.CREATED,
|
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()
|
@Get()
|
||||||
async findAll(@Query('page') page: number) {
|
async findAll(@Request() req, @Query('page') page: number) {
|
||||||
const [data, count] = await this.usersService.findAll(page);
|
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 {
|
return {
|
||||||
data,
|
data,
|
||||||
|
@ -65,6 +107,7 @@ export class UsersController {
|
||||||
req.user.userId,
|
req.user.userId,
|
||||||
page,
|
page,
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
count,
|
count,
|
||||||
|
@ -79,6 +122,7 @@ export class UsersController {
|
||||||
@Query('page') page: number,
|
@Query('page') page: number,
|
||||||
) {
|
) {
|
||||||
const [data, count] = await this.usersService.findByRoles(id, page);
|
const [data, count] = await this.usersService.findByRoles(id, page);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
count,
|
count,
|
||||||
|
|
|
@ -5,17 +5,19 @@ import { UsersController } from './users.controller';
|
||||||
import { User } from './entities/user.entity';
|
import { User } from './entities/user.entity';
|
||||||
import { TransactionModule } from 'src/transaction/transaction.module';
|
import { TransactionModule } from 'src/transaction/transaction.module';
|
||||||
import { ConfigurableModule } from 'src/configurable/configurable.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 { Supplier } from './entities/supplier.entity';
|
||||||
|
import { Partner } from './entities/partner.entity';
|
||||||
|
import { PartnerService } from './partner/partner.service';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
TypeOrmModule.forFeature([User, Supplier]),
|
TypeOrmModule.forFeature([User, Supplier, Partner]),
|
||||||
forwardRef(() => TransactionModule),
|
forwardRef(() => TransactionModule),
|
||||||
ConfigurableModule,
|
ConfigurableModule,
|
||||||
],
|
],
|
||||||
controllers: [UsersController],
|
controllers: [UsersController],
|
||||||
providers: [UsersService, SupplierService],
|
providers: [UsersService, SupplierService, PartnerService],
|
||||||
exports: [UsersService, SupplierService],
|
exports: [UsersService, SupplierService],
|
||||||
})
|
})
|
||||||
export class UsersModule {}
|
export class UsersModule {}
|
||||||
|
|
|
@ -7,7 +7,13 @@ import {
|
||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
import { CreateUserDto } from './dto/create-user.dto';
|
import { CreateUserDto } from './dto/create-user.dto';
|
||||||
import { UpdateUserDto } from './dto/update-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 { User } from './entities/user.entity';
|
||||||
import { InjectRepository } from '@nestjs/typeorm';
|
import { InjectRepository } from '@nestjs/typeorm';
|
||||||
import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util';
|
import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util';
|
||||||
|
@ -59,53 +65,56 @@ export class UsersService {
|
||||||
userData.username = createUserDto.username;
|
userData.username = createUserDto.username;
|
||||||
userData.password = await hashPassword(createUserDto.password, salt);
|
userData.password = await hashPassword(createUserDto.password, salt);
|
||||||
userData.salt = salt;
|
userData.salt = salt;
|
||||||
userData.superior = superior;
|
if (createUserDto.superior) {
|
||||||
|
userData.superior = superior;
|
||||||
|
} else {
|
||||||
|
userData.superior = null;
|
||||||
|
userData.partner = createUserDto.partner;
|
||||||
|
}
|
||||||
userData.roles = roles;
|
userData.roles = roles;
|
||||||
|
|
||||||
await this.connection.transaction(async (manager) => {
|
await this.connection.transaction(async (manager) => {
|
||||||
const result = await manager.insert(User, userData);
|
const result = await manager.insert(User, userData);
|
||||||
|
|
||||||
const dataCoaWallet = new InputCoaDto();
|
const dataCoaWallet = new InputCoaDto();
|
||||||
|
|
||||||
dataCoaWallet.user = userData;
|
dataCoaWallet.user = userData;
|
||||||
dataCoaWallet.balanceType = balanceType.CREDIT;
|
dataCoaWallet.balanceType = balanceType.CREDIT;
|
||||||
dataCoaWallet.type = coaType.WALLET;
|
dataCoaWallet.type = coaType.WALLET;
|
||||||
dataCoaWallet.coaEntityManager = manager;
|
dataCoaWallet.coaEntityManager = manager;
|
||||||
|
await this.coaService.create(dataCoaWallet);
|
||||||
|
|
||||||
if (createUserDto.superior) {
|
if (createUserDto.superior) {
|
||||||
const dataCoaAP = new InputCoaDto();
|
const dataCoaAP = new InputCoaDto();
|
||||||
|
|
||||||
dataCoaAP.user = userData;
|
dataCoaAP.user = userData;
|
||||||
dataCoaAP.balanceType = balanceType.CREDIT;
|
dataCoaAP.balanceType = balanceType.CREDIT;
|
||||||
dataCoaAP.relatedUserId = superior.id;
|
dataCoaAP.relatedUserId = superior.id;
|
||||||
dataCoaAP.type = coaType.ACCOUNT_PAYABLE;
|
dataCoaAP.type = coaType.ACCOUNT_PAYABLE;
|
||||||
dataCoaAP.coaEntityManager = manager;
|
dataCoaAP.coaEntityManager = manager;
|
||||||
|
await this.coaService.create(dataCoaAP);
|
||||||
|
|
||||||
const dataCoaAR = new InputCoaDto();
|
const dataCoaAR = new InputCoaDto();
|
||||||
|
|
||||||
dataCoaAR.user = userData;
|
dataCoaAR.user = userData;
|
||||||
dataCoaAR.balanceType = balanceType.DEBIT;
|
dataCoaAR.balanceType = balanceType.DEBIT;
|
||||||
dataCoaAR.relatedUserId = superior.id;
|
dataCoaAR.relatedUserId = superior.id;
|
||||||
dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE;
|
dataCoaAR.type = coaType.ACCOUNT_RECEIVABLE;
|
||||||
dataCoaAR.coaEntityManager = manager;
|
dataCoaAR.coaEntityManager = manager;
|
||||||
|
|
||||||
await this.coaService.create(dataCoaAP);
|
|
||||||
await this.coaService.create(dataCoaAR);
|
await this.coaService.create(dataCoaAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.coaService.create(dataCoaWallet);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return userData;
|
return userData;
|
||||||
}
|
}
|
||||||
|
|
||||||
findAll(page: number) {
|
findAll(page: number, id: string) {
|
||||||
return this.usersRepository.findAndCount({
|
return this.usersRepository.findAndCount({
|
||||||
skip: page * 10,
|
skip: page * 10,
|
||||||
take: 10,
|
take: 10,
|
||||||
order: {
|
order: {
|
||||||
version: 'DESC',
|
version: 'DESC',
|
||||||
},
|
},
|
||||||
|
where: {
|
||||||
|
id: Not(Equal(id)),
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user