Files
Vendaweb-api/src/sales/pre-order/pre-order.service.ts

510 lines
26 KiB
TypeScript

/*
https://docs.nestjs.com/providers#services
*/
import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { Pcorcavendai } from 'src/domain/entity/tables/pcorcavendai.entity';
import { Cart } from 'src/domain/models/cart.model';
import { SharedService } from 'src/shared/services/shared.service';
import { Connection } from 'typeorm';
//import { DataSource } from 'typeorm';
import { EntityManager } from 'typeorm';
import { Pcorcavendac } from '../../domain/entity/tables/pcorcavendac.entity';
import { Shopping } from '../../domain/entity/tables/estprevendac.entity';
import { connectionOptions } from 'src/configs/typeorm.config';
import { ListsService } from 'src/backoffice/lists/lists.service';
import { CustomerService } from '../customer/customer.service';
import { AddressCustomerService } from '../address-customer/address-customer.service';
@Injectable()
export class PreOrderService {
constructor(
private readonly sharedService: SharedService,
private readonly listsService: ListsService,
private readonly customerService: CustomerService,
private readonly addressCustomerService: AddressCustomerService) { }
async create(cart: Cart) {
console.log('cart: ' + JSON.stringify(cart));
// if (cart.idCustomer === 1 && cart.preCustomerDocument !== null) {
// this.createPreCustomer(cart);
// }
const connection = new Connection(connectionOptions);
await connection.connect();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
console.log('Processo 1');
try {
const customer = await this.sharedService.getCustomer(cart.idCustomer);
let idPreOrder = 0;
let idRca = 0;
const preOrder = new Pcorcavendac();
const shopping = await queryRunner.query(' SELECT ESTPREVENDAC.NUMORCA as "idPreOrder", ESTPREVENDAC.CODUSUR as "idRca" ' +
' FROM ESTPREVENDAC ' +
' WHERE ESTPREVENDAC.ID = :1 ' +
' AND ESTPREVENDAC.NUMORCA IS NOT NULL ', [cart.id]);
if (shopping.length > 0) {
idPreOrder = shopping[0].idPreOrder;
const existPreOrder = await queryRunner
.query('SELECT PCORCAVENDAC.CODUSUR as "idRca" FROM PCORCAVENDAC WHERE NUMORCA = :NUMORCA', [idPreOrder]);
idRca = existPreOrder[0].idRca;
await queryRunner.query('DELETE FROM PCORCAVENDAI WHERE NUMORCA = :1', [idPreOrder]);
await queryRunner.query('DELETE FROM PCORCAVENDAC WHERE NUMORCA = :1', [idPreOrder]);
} else {
idPreOrder = await this.sharedService.generateIdPreOrder(cart.idSeller);
}
//Create pre-customers
if (cart.idCustomer === 1 && cart.preCustomerDocument !== null) {
const preCustomer = await queryRunner.query(`SELECT ESTVENDAPRECLIENTE.CPF FROM ESTVENDAPRECLIENTE ` +
` WHERE IDCART = :1 AND CPF = :2`, [cart.id, cart.preCustomerDocument]);
if (preCustomer === null || preCustomer.length === 0) {
const sqlInsert = ` INSERT INTO ESTVENDAPRECLIENTE ( CPF, IDCART, NOME, TELEFONE, DTCADASTRO, CODUSUR, NUMPEDRCA ) ` +
` VALUES ( REGEXP_REPLACE(:CPF, '[^0-9]', '') , :IDCART, :NOME, :TELEFONE, SYSDATE, :CODUSUR, :NUMPEDRCA ) `;
await queryRunner.query(sqlInsert, [cart.preCustomerDocument,
cart.id, cart.preCustomerName, cart.preCustomerPhone, cart.idSeller, idPreOrder]);
}
} else {
if (cart.preCustomerDocument != null) {
await queryRunner.query(`DELETE FROM ESTVENDAPRECLIENTE WHERE IDCART = :1 AND REGEXP_REPLACE(:CPF, '[^0-9]', '')`,
[cart.id, cart.preCustomerDocument]);
}
}
const dataAtual = await queryRunner.query("SELECT TO_CHAR(SYSDATE, \'DD\') AS \"dia\" " +
" ,TO_CHAR(SYSDATE, \'MM\') AS \"mes\" " +
" ,TO_CHAR(SYSDATE, \'YYYY\') AS \"ano\" FROM DUAL");
preOrder.numorca = idPreOrder;
const dateNow = new Date(dataAtual[0].ano, dataAtual[0].mes - 1, dataAtual[0].dia);
const dateDelivery = new Date(dataAtual[0].ano, dataAtual[0].mes, dataAtual[0].dia);
dateDelivery.setDate(dateDelivery.getDate() + 3); // setDate(dateNow.getDate() + 3);
console.log('Processo 2');
let numeroSeq = 1;
for (const item of cart.itens) {
const itemPreOrder = new Pcorcavendai();
itemPreOrder.numorca = preOrder.numorca;
itemPreOrder.data = this.formatDate(new Date());
itemPreOrder.codcli = cart.idCustomer;
itemPreOrder.codprod = item.idProduct;
itemPreOrder.codauxiliar = item.ean;
itemPreOrder.codusur = (idRca > 0) ? idRca : cart.idSeller;
itemPreOrder.qt = item.quantity;
itemPreOrder.pvenda = item.salePrice;
itemPreOrder.ptabela = item.listPrice;
itemPreOrder.numcar = 0;
itemPreOrder.posicao = 'L';
itemPreOrder.st = 0;
itemPreOrder.vlcustocont = 0;
itemPreOrder.vlcustofin = 0;
itemPreOrder.vlcustoreal = 0;
itemPreOrder.vlcustorep = 0;
itemPreOrder.percom = 0;
itemPreOrder.perdesc = (item.listPrice > 0) ? ((item.listPrice - item.salePrice) / item.listPrice) * 100 : 0;
itemPreOrder.numseq = numeroSeq;
itemPreOrder.pvendabase = 0;
itemPreOrder.codst = await this.
sharedService.
getTaxId(item.idProduct,
cart.saleStore,
customer.estent);
itemPreOrder.custofinest = 0;
itemPreOrder.codauxiliar = item.ean;
itemPreOrder.codfilialretira = item.idStock;
itemPreOrder.poriginal = 0;
itemPreOrder.pvendabase = 0;
itemPreOrder.pvenda1 = 0;
itemPreOrder.tipoentrega = item.deliveryMethod;
// eslint-disable-next-line @typescript-eslint/camelcase
// itemPreOrder.rp_imediata = (item.deliveryMethod == "RA") ? "S" : "N";
itemPreOrder.complemento = item.descriptionAux;
itemPreOrder.ambiente = item.environment;
console.log('Processo 3');
await queryRunner.manager
.createQueryBuilder()
.insert()
.into(Pcorcavendai)
.values(itemPreOrder)
.execute();
console.log('Processo 4');
numeroSeq = numeroSeq + 1;
}
if (cart.shippingValue > 0) {
const itemPreOrder = new Pcorcavendai();
itemPreOrder.numorca = preOrder.numorca;
itemPreOrder.data = this.formatDate(new Date());
itemPreOrder.codcli = cart.idCustomer;
itemPreOrder.codprod = 48500;
itemPreOrder.codauxiliar = 48500;
itemPreOrder.codusur = (idRca > 0) ? idRca : cart.idSeller;
itemPreOrder.qt = 1;
itemPreOrder.pvenda = Number.parseFloat(cart.shippingValue.toString());
itemPreOrder.ptabela = Number.parseFloat(cart.shippingValue.toString());
itemPreOrder.numcar = 0;
itemPreOrder.posicao = 'L';
itemPreOrder.st = 0;
itemPreOrder.vlcustocont = 0;
itemPreOrder.vlcustofin = 0;
itemPreOrder.vlcustoreal = 0;
itemPreOrder.vlcustorep = 0;
itemPreOrder.percom = 0;
itemPreOrder.perdesc = 0;
itemPreOrder.numseq = numeroSeq;
itemPreOrder.pvendabase = 0;
itemPreOrder.codst = await this.
sharedService.
getTaxId(48500,
cart.saleStore,
customer.estent);
itemPreOrder.custofinest = 0;
itemPreOrder.codauxiliar = 48500;
itemPreOrder.codfilialretira = cart.saleStore;
itemPreOrder.poriginal = 0;
itemPreOrder.pvendabase = 0;
itemPreOrder.pvenda1 = 0;
itemPreOrder.tipoentrega = 'EF';
console.log('Processo 3');
await queryRunner.manager
.createQueryBuilder()
.insert()
.into(Pcorcavendai)
.values(itemPreOrder)
.execute();
console.log('Processo 4');
numeroSeq = numeroSeq + 1;
}
//#region create PCORCAVENDAC
console.log('Processo 5' + cart);
const supervisor = await queryRunner.manager.query('SELECT PCUSUARI.CODSUPERVISOR as "codsupervisor" FROM PCUSUARI WHERE CODUSUR = :1', [cart.idSeller]);
console.log('Supervisor: ' + JSON.stringify(supervisor));
preOrder.posicao = 'L';
preOrder.numcar = 0;
preOrder.numpedrca = preOrder.numorca;
preOrder.percvenda = 100;
preOrder.codendent = cart.idAddress;
preOrder.codcob = cart.idBilling;
preOrder.codplpag = cart.idPaymentPlan;
preOrder.condvenda = 7;
preOrder.data = this.formatDate(new Date());
preOrder.hora = new Date().getHours();
preOrder.minuto = new Date().getMinutes();
preOrder.dtentrega = cart.shippingDate; // dateDelivery;
preOrder.codfilial = cart.saleStore,
preOrder.codusur = (idRca > 0) ? idRca : cart.idSeller;
preOrder.codemitente = cart.userId;
preOrder.codusur3 = cart.idProfessional;
preOrder.tipoprioridadeentrega = cart.shippingPriority;
if (supervisor != null && supervisor.length > 0) {
preOrder.codsupervisor = supervisor[0].codsupervisor;
}
preOrder.codemitente = cart.userId;
preOrder.vlfrete = cart.shippingValue;
preOrder.vloutrasdesp = 0;
preOrder.numitens = cart.itens.length;
preOrder.obs1 = cart.notation1;
preOrder.obs2 = cart.notation2;
preOrder.obsentrega1 = cart.deliveryNote1;
preOrder.obsentrega2 = cart.deliveryNote2;
preOrder.obsentrega3 = cart.deliveryNote3;
//Dados do cliente
preOrder.codcli = cart.idCustomer;
preOrder.codpraca = customer.codpraca;
preOrder.fretedespacho = customer.fretedespacho;
preOrder.data = dateNow;
preOrder.vlfrete = Number.parseFloat(cart.shippingValue.toString());
//#endregion
//#region create PCPEDITEMP
//#endregion
// execute some operations on this transaction:
console.log('Processo 6');
const totalOrca = await queryRunner.
query('SELECT SUM((PCORCAVENDAI.QT * PCORCAVENDAI.PVENDA)) AS \"valorTotal\" ' +
' ,SUM(PCORCAVENDAI.QT * PCORCAVENDAI.PTABELA ) AS \"valorTabela\" ' +
' ,SUM(PCORCAVENDAI.QT * PCPRODUT.PESOBRUTO ) AS \"pesoTotal\" ' +
' ,SUM(PCORCAVENDAI.QT * PCPRODUT.VOLUME ) AS \"volumeTotal\" ' +
' ,SUM(PCORCAVENDAI.QT * ( PCORCAVENDAI.PTABELA - PCORCAVENDAI.PVENDA) ) AS \"valorDesconto\" ' +
' FROM PCORCAVENDAI, PCPRODUT ' +
' WHERE PCORCAVENDAI.CODPROD = PCPRODUT.CODPROD ' +
' AND PCORCAVENDAI.NUMORCA = :idPreOrder ', [preOrder.numorca]);
preOrder.vltotal = totalOrca[0].valorTotal;
preOrder.vlatend = totalOrca[0].valorTotal;
preOrder.vltabela = totalOrca[0].valorTabela;
preOrder.totpeso = totalOrca[0].pesoTotal;
preOrder.totvolume = totalOrca[0].volumeTotal;
preOrder.vldesconto = totalOrca[0].valorDesconto;
await queryRunner.manager
.createQueryBuilder()
.insert()
.into(Pcorcavendac)
.values(preOrder)
.execute();
const sql = 'UPDATE PCORCAVENDAC SET DATA = TRUNC(SYSDATE) ' +
' WHERE PCORCAVENDAC.NUMORCA = :1 ';
await queryRunner.query(sql, [
preOrder.numorca
]);
console.log('Processo 7');
await queryRunner.manager
.createQueryBuilder()
.update(Shopping)
.set({
numorca: idPreOrder
})
.where("ESTPREVENDAC.ID = :idcart", { idcart: cart.id })
.execute();
await queryRunner.commitTransaction();
return preOrder;
} catch (err) {
await queryRunner.rollbackTransaction();
console.log(err);
throw err;
} finally {
await queryRunner.release();
await connection.close();
}
}
formatDate(date: Date) {
const day = date.getDay();
const month = date.getMonth() + 1;
const year = date.getFullYear();
const newDate: Date = new Date(year, month, day);
console.log(newDate);
return newDate;
}
async getPreOrders(sellerId: number, storeId: string, start: Date, end: Date, idPreOrder: number, document: string, nameCustomer: string) {
console.log('Vendedor: ' + sellerId);
const connection = new Connection(connectionOptions);
await connection.connect();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
try {
const startDate = new Date(start);
let day = startDate.getDate();
let month = ("00" + (startDate.getMonth() + 1)).slice(-2);
let year = startDate.getFullYear();
const startFormat = day + "/" + month + "/" + year;
const endDate = new Date(end);
day = endDate.getDate();
month = ("00" + (endDate.getMonth() + 1)).slice(-2);
year = endDate.getFullYear();
const endFormat = day + "/" + month + "/" + year;
let sql = 'SELECT TO_CHAR(PCORCAVENDAC.DATA, \'DD/MM/YYYY\') as "data" ' +
' ,PCORCAVENDAC.NUMORCA as "idPreOrder" ' +
' ,PCORCAVENDAC.VLATEND as "value" ' +
' ,PCORCAVENDAC.VLTABELA as "listValue" ' +
' ,PCORCAVENDAC.CODCLI as "idCustomer" ' +
` ,CASE WHEN PCORCAVENDAC.CODCLI = 1 THEN NVL(( SELECT ESTVENDAPRECLIENTE.NOME || '( PRE-CADASTRO)' ` +
' FROM ESTVENDAPRECLIENTE ' +
' WHERE ESTVENDAPRECLIENTE.IDCART = ESTPREVENDAC.ID AND ROWNUM = 1 ), ' +
' PCCLIENT.CLIENTE ) ELSE PCCLIENT.CLIENTE END as "customer" ' +
' ,PCORCAVENDAC.CODUSUR as "idSeller" ' +
' ,PCUSUARI.NOME as "seller" ' +
' ,CASE WHEN PCORCAVENDAC.ORCAMENTOUTILIZADO = \'S\' THEN \'ORÇAMENTO UTILIZADO\' ELSE \'PENDENTE\' END as "status"' +
' ,PCORCAVENDAC.NUMPED as "orderId" ' +
' ,( SELECT ESTVENDAPRECLIENTE.CPF FROM ESTVENDAPRECLIENTE WHERE ESTVENDAPRECLIENTE.IDCART = ESTPREVENDAC.ID AND ROWNUM = 1 ) as "cpfPreCustomer" ' +
' ,( SELECT ESTVENDAPRECLIENTE.NOME FROM ESTVENDAPRECLIENTE WHERE ESTVENDAPRECLIENTE.IDCART = ESTPREVENDAC.ID AND ROWNUM = 1 ) as "namePreCustomer" ' +
' FROM PCORCAVENDAC, PCCLIENT, PCUSUARI, ESTPREVENDAC ' +
' WHERE PCORCAVENDAC.CODCLI = PCCLIENT.CODCLI ' +
' AND PCORCAVENDAC.CODUSUR = PCUSUARI.CODUSUR ' +
' AND PCORCAVENDAC.NUMORCA = ESTPREVENDAC.NUMORCA ' +
' AND PCORCAVENDAC.CODFILIAL = :1 ' +
' AND PCORCAVENDAC.DATA BETWEEN TO_DATE(:2, \'DD/MM/YYYY\') AND TO_DATE(:3, \'DD/MM/YYYY\')';
if (sellerId > 0) {
sql += ` AND PCORCAVENDAC.CODUSUR = ${sellerId} `;
}
if (idPreOrder > 0) {
sql += ` AND PCORCAVENDAC.NUMORCA = ${idPreOrder} `;
}
if (document.length > 0) {
sql += ` AND REGEXP_REPLACE(PCCLIENT.CGCENT, '[^0-9]', '') = REGEXP_REPLACE(${document}, '[^0-9]', '') `;
}
if (nameCustomer.length > 0) {
sql += ` AND PCCLIENT.CLIENTE LIKE UPPER('${nameCustomer}')||'%' `;
}
const preOrders =
await queryRunner.query(sql, [storeId, startFormat, endFormat]);
return preOrders;
} catch (err) {
throw err;
} finally {
await queryRunner.release();
await connection.close();
}
}
async getCartId(preOrderId: number) {
const connection = new Connection(connectionOptions);
await connection.connect();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
try {
const preOrder = await queryRunner.query('SELECT PCORCAVENDAC.DATA as "createDate" ' +
' ,PCORCAVENDAC.ORCAMENTOUTILIZADO as "preOrderFinish" ' +
' ,PCORCAVENDAC.NUMPED as "orderId" ' +
' ,PCORCAVENDAC.CODFILIAL as "invoiceStore" ' +
' ,PCORCAVENDAC.CODCLI as "customerId" ' +
' ,PCORCAVENDAC.CODPLPAG as "paymentPlanId" ' +
' ,PCORCAVENDAC.CODCOB as "billindId" ' +
' ,PCORCAVENDAC.CODENDENT as "addressId" ' +
' ,PCORCAVENDAC.CODUSUR3 as "partnerId" ' +
' ,ESTPREVENDAC.ID as "cartId" ' +
' ,PCORCAVENDAC.OBS as "notification" ' +
' ,PCORCAVENDAC.OBS1 as "notification1" ' +
' ,PCORCAVENDAC.OBS2 as "notification2" ' +
' ,PCORCAVENDAC.OBSENTREGA1 as "notificationDelivery1" ' +
' ,PCORCAVENDAC.OBSENTREGA2 as "notificationDelivery2" ' +
' ,PCORCAVENDAC.OBSENTREGA3 as "notificationDelivery3" ' +
' ,PCORCAVENDAC.DTENTREGA as "deliveryDate" ' +
` ,NVL(PCORCAVENDAC.TIPOPRIORIDADEENTREGA, 'B') as "priorityDelivery" ` +
' ,( SELECT ESTVENDAPRECLIENTE.CPF FROM ESTVENDAPRECLIENTE WHERE ESTVENDAPRECLIENTE.IDCART = ESTPREVENDAC.ID AND ROWNUM = 1 ) as "cpfPreCustomer" ' +
' ,( SELECT ESTVENDAPRECLIENTE.NOME FROM ESTVENDAPRECLIENTE WHERE ESTVENDAPRECLIENTE.IDCART = ESTPREVENDAC.ID AND ROWNUM = 1 ) as "namePreCustomer" ' +
' FROM PCORCAVENDAC, ESTPREVENDAC ' +
' WHERE PCORCAVENDAC.NUMORCA = ESTPREVENDAC.NUMORCA ' +
' AND PCORCAVENDAC.NUMORCA = :1', [preOrderId]);
if (preOrder.length == 0) {
throw new HttpException(`Orçamento não foi localizado`, HttpStatus.NOT_FOUND);
}
if (preOrder.preOrderFinish == 'S') {
throw new HttpException(`Orçamento já utilizado, não pode sofre alterações. Número do pedido gerado: ${preOrder.orderId}`, HttpStatus.BAD_REQUEST);
}
await queryRunner.query("BEGIN ESK_VENDA.ATUALIZAR_PRECO_VENDA(:idcart, :paymentPlanId); END;",
[preOrder[0].cartId, preOrder[0].paymentPlanId]);
const invoiceStores = await this.listsService.GetStoreAll();
const invoiceStore = await invoiceStores.find(data => data.id === preOrder[0].invoiceStore);
const customer = await this.customerService.findCustomerById(preOrder[0].customerId);
const billinds = await this.listsService.GetBilling(preOrder[0].customerId);
const partners = await this.listsService.GetPartners();
const preCustomer = await this.listsService.GetPreCustomer(preOrder[0].cartId);
let address: any;
if (preOrder[0].addressId > 0) {
address = await this.addressCustomerService.getAddress(preOrder[0].customerId, preOrder[0].addressId);
}
// const address = await this.addressCustomerService.getAddress(preOrder[0].customerId, preOrder[0].addressId);
const billing = billinds.find(data => data.codcob === preOrder[0].billindId);
const paymentPlans = await this.listsService.GetPaymentPlan((billing !== null && billing !== undefined) ? billing.codcob : '9999', preOrder[0].customerId);
const paymentPlan = paymentPlans.find(data => data.codplpag === preOrder[0].paymentPlanId);
const partner = partners.find(data => data.id === preOrder[0].partnerId);
return {
cartId: preOrder[0].cartId, invoiceStore: invoiceStore, customer: customer, partner: partner ?? null,
paymentPlan: paymentPlan ?? null, billing: billing ?? null, address: address ?? null,
notification: preOrder[0].notification, notification1: preOrder[0].notification1, notification2: preOrder[0].notification2,
notificationDelivery1: preOrder[0].notificationDelivery1, notificationDelivery2: preOrder[0].notificationDelivery2,
notificationDelivery3: preOrder[0].notificationDelivery3, deliveryDate: preOrder[0].deliveryDate,
priorityDelivery: preOrder[0].priorityDelivery, preCustomer: preCustomer
}
} finally {
await queryRunner.release();
await connection.close();
}
}
async getItensPreOrder(idPreOrder: number) {
const connection = new Connection(connectionOptions);
await connection.connect();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
let sql = '';
try {
sql = ` SELECT PCORCAVENDAI.CODPROD as "productId", PCPRODUT.DESCRICAO as "description", ` +
` PCPRODUT.EMBALAGEM as "package", ` +
` PCORCAVENDAI.COMPLEMENTO as "color" , ` +
` PCORCAVENDAI.AMBIENTE as "local", ` +
` PCORCAVENDAI.QT as "quantity", PCORCAVENDAI.PVENDA as "price", ` +
` ( PCORCAVENDAI.QT * PCORCAVENDAI.PVENDA ) as "subTotal" ` +
` FROM PCORCAVENDAI, PCORCAVENDAC, PCPRODUT ` +
` WHERE PCORCAVENDAI.CODPROD = PCPRODUT.CODPROD ` +
` AND PCORCAVENDAI.NUMORCA = PCORCAVENDAC.NUMORCA ` +
` AND PCORCAVENDAC.NUMORCA = :NUMORCA ` +
` ORDER BY PCORCAVENDAI.NUMSEQ `;
const result = await queryRunner.query(sql, [idPreOrder]);
return result;
} catch (error) {
console.log(error);
throw error;
} finally {
await queryRunner.release();
await connection.close();
}
}
async createPreCustomer(cart: Cart) {
const connection = new Connection(connectionOptions);
await connection.connect();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
// const preCustomer = await queryRunner.query(`SELECT ESTVENDAPRECLIENTE.CPF FROM ESTVENDAPRECLIENTE ` +
// ` WHERE IDCART = :1 AND CPF = :2`, [cart.id, cart.preCustomerDocument]);
const sqlInsert = ` INSERT INTO ESTVENDAPRECLIENTE ( CPF, IDCART, NOME, TELEFONE, DTCADASTRO, CODUSUR ) ` +
` VALUES ( REGEXP_REPLACE(:CPF, '[^0-9]', '') , :IDCART, :NOME, :TELEFONE, SYSDATE, :CODUSUR ) `;
await queryRunner.query(sqlInsert, [cart.preCustomerDocument,
cart.id, cart.preCustomerName, cart.preCustomerPhone, cart.idSeller]);
await queryRunner.commitTransaction();
} catch (err) {
await queryRunner.rollbackTransaction();
throw err;
}
finally {
await queryRunner.release();
await connection.close();
}
}
}