ppob-backend/src/users/partner/partner.service.ts
2021-12-26 11:21:04 +07:00

160 lines
4.1 KiB
TypeScript

import {
forwardRef,
HttpException,
HttpStatus,
Inject,
Injectable,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Connection, EntityNotFoundError, Not, 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';
import { UpdatePartnerDto } from '../dto/update-partner.dto';
import { UpdateUserDto } from '../dto/update-user.dto';
import { when } from 'joi';
@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: 'NPWP 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.code = createPartnerDto.code;
partnerData.status = true;
await this.connection.transaction(async (manager) => {
const result = await manager.insert(Partner, partnerData);
});
const dataUser = new CreateUserDto();
dataUser.username = `admin_${partnerData.code}`;
dataUser.name = partnerData.name;
dataUser.phone_number = partnerData.phone_number;
dataUser.roleId = '21dceea2-416e-4b55-b74c-12605e1f8d1b';
dataUser.superior = false;
dataUser.partner = partnerData;
dataUser.password = createPartnerDto.password_account;
dataUser.phone_number = createPartnerDto.phone_number;
await this.userService.create(dataUser, currentUser);
return partnerData;
}
async update(
id: string,
updatePartnerDto: UpdatePartnerDto,
currentUser: any,
) {
const check = await this.partnerRepository.findOne({
npwp: updatePartnerDto.npwp,
id: Not(id),
});
if (check) {
throw new HttpException(
{
statusCode: HttpStatus.NOT_ACCEPTABLE,
error: 'NPWP Already Exist',
},
HttpStatus.NOT_FOUND,
);
}
const partnerData = new Partner();
partnerData.id = id;
partnerData.name = updatePartnerDto.name;
partnerData.address = updatePartnerDto.address;
if (updatePartnerDto.npwp) {
partnerData.npwp = updatePartnerDto.npwp;
}
await this.connection.transaction(async (manager) => {
await manager.update(Partner, { id: id }, partnerData);
});
const dataUser = new UpdateUserDto();
const userData = await this.userService.findOneByPartner(id);
dataUser.username = `admin_${partnerData.name}`;
dataUser.partner = partnerData;
await this.userService.update(userData.id, dataUser, currentUser);
return partnerData;
}
setStatus = async (id: string, type: string) => {
const partnerData = await this.partnerRepository.findOne({
id: id,
});
if (type === 'active') {
partnerData.status = true;
} else {
partnerData.status = false;
}
await this.connection.transaction(async (manager) => {
await manager.update(Partner, { id: id }, partnerData);
});
return partnerData;
};
async findOne(code: string) {
return await this.partnerRepository.findOne({
where: {
code: code,
},
});
}
findAllPartner(page, pageSize?) {
return this.partnerRepository.findAndCount({
skip: page * (pageSize || 10),
take: pageSize || 10,
order: {
version: 'DESC',
},
});
}
}