/* 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'); 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(); } } }