import { HttpStatus } from '@nestjs/common'; import { Injectable, HttpException } from '@nestjs/common'; import { connectionOptions } from 'src/configs/typeorm.config'; import { Customer } from 'src/domain/models/customer.model'; import { Connection } from 'typeorm'; import { Pcclient } from '../../domain/entity/tables/pcclient.entity'; import { Estcategoriacliente } from '../../domain/entity/tables/estcategoriacliente.entity'; import { Estsubcategoriacliente } from 'src/domain/entity/tables/estsubcategoriacliente.entity'; @Injectable() export class CustomerService { async findCustomerByName(name: string) { let auxName = ''; for (let i = 0; i < name.length; i++) { auxName += name[i].replace("@", "%"); } const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); try { const sql = ' SELECT pcclient.cliente as "name" ' + ' ,pcclient.codcli as "customerId" ' + ' ,pcclient.emailnfe as "email" ' + ' ,pcclient.cgcent as "cpfCnpj" ' + ' ,pcclient.sexo as "gender" ' + ' ,pcclient.enderent as "address" ' + ' ,pcclient.numeroent as "addressNumber" ' + ' ,pcclient.complementoent as "complement" ' + ' ,pcclient.bairroent as "neigborhood" ' + ' ,pcclient.municent as "city" ' + ' ,pcclient.estent as "state" ' + ' ,pcclient.cepent as "zipCode" ' + ' ,pcclient.telent as "phone" ' + ' ,pcclient.telcelent as "cellPhone" ' + ' ,pcclient.ieent as "numberState" ' + ' ,pcclient.codcategoria as "categoryId" ' + ' ,pcclient.codsubcategoria as "subCategoryId" ' + ' ,pcclient.codpraca as "placeId" ' + ' ,pcclient.codusur1 as "sellerId" ' + ' ,pccidade.codibge as "ibgeCode" ' + ' ,pcclient.dtnasc as "birthdate" ' + ' ,pcclient.codatv1 as "ramoId" ' + ' ,pcclient.meiocomunicacao as "communicate" ' + ' ,pcclient.latitude as "latitude" ' + ' ,pcclient.longitude as "longitude" ' + ' ,pcclient.codmunicipio as "ibgeCode" ' + ' ,pcclient.codcidade as "cityId" ' + ' FROM pcclient, pccidade ' + ' WHERE pcclient.codcidade = pccidade.codcidade (+)'; let where = ` AND ( pcclient.cliente like '%'||'${auxName.replace('@', '%')}'||'%' OR ` + ` REGEXP_REPLACE(pcclient.cgcent, '[^0-9]', '') = REGEXP_REPLACE('${name}', '[^0-9]') OR ` + ` pcclient.codcli = REGEXP_REPLACE('${name}', '[^0-9]') )`; where += ` AND pcclient.codcli NOT IN (2) AND pcclient.DTEXCLUSAO IS NULL `; const orderBy = ` ORDER BY pcclient.cliente `; const pagination = ` OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY`; const customers = await queryRunner.manager .query(sql + where + orderBy + pagination) as Customer[]; return customers; } catch (error) { console.log(error); throw error; } finally { await queryRunner.release(); await connection.close(); } } async findCustomerByCpf(cpf: string) { const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); try { const sql = ' SELECT pcclient.cliente as "name" ' + ' ,pcclient.codcli as "customerId" ' + ' ,pcclient.emailnfe as "email" ' + ' ,pcclient.cgcent as "cpfCnpj" ' + ' ,pcclient.sexo as "gender" ' + ' ,pcclient.enderent as "address" ' + ' ,pcclient.numeroent as "addressNumber" ' + ' ,pcclient.complementoent as "complement" ' + ' ,pcclient.bairroent as "neighborhood" ' + ' ,pcclient.municent as "city" ' + ' ,pcclient.estent as "state" ' + ' ,pcclient.cepent as "zipCode" ' + ' ,pcclient.telent as "phone" ' + ' ,pcclient.telcelent as "cellPhone" ' + ' ,pcclient.ieent as "numberState" ' + ' ,pcclient.codcategoria as "categoryId" ' + ' ,pcclient.codsubcategoria as "subCategoryId" ' + ' ,pcclient.codpraca as "placeId" ' + ' ,pcclient.codusur1 as "sellerId" ' + ' ,pccidade.codibge as "ibgeCode" ' + ' ,pcclient.dtnasc as "birthdate" ' + ' ,pcclient.codatv1 as "ramoId" ' + ' ,pcclient.meiocomunicacao as "communicate" ' + ' ,pcclient.latitude as "latitude" ' + ' ,pcclient.longitude as "longitude" ' + ' ,pcclient.codmunicipio as "ibgeCode" ' + ' ,pcclient.codcidade as "cityId" ' + ' FROM pcclient, pccidade ' + ' WHERE pcclient.codcidade = pccidade.codcidade (+)'; const where = ` AND REGEXP_REPLACE(pcclient.cgcent, '[^0-9]', '') =REGEXP_REPLACE('${cpf}', '[^0-9]', '')`; const customer = await queryRunner.query(sql + where); return customer[0]; } catch (error) { console.log(error); throw error; } finally { await queryRunner.release(); await connection.close(); } } async findCustomerById(idCustomer: number) { const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); try { const sql = ' SELECT pcclient.cliente as "name" ' + ' ,pcclient.codcli as "customerId" ' + ' ,pcclient.emailnfe as "email" ' + ' ,pcclient.cgcent as "cpfCnpj" ' + ' ,pcclient.sexo as "gender" ' + ' ,pcclient.enderent as "address" ' + ' ,pcclient.numeroent as "addressNumber" ' + ' ,pcclient.complementoent as "complement" ' + ' ,pcclient.bairroent as "neighborhood" ' + ' ,pcclient.municent as "city" ' + ' ,pcclient.estent as "state" ' + ' ,pcclient.cepent as "zipCode" ' + ' ,pcclient.telent as "phone" ' + ' ,pcclient.telcelent as "cellPhone" ' + ' ,pcclient.ieent as "numberState" ' + ' ,pcclient.codcategoria as "categoryId" ' + ' ,pcclient.codsubcategoria as "subCategoryId" ' + ' ,pcclient.codpraca as "placeId" ' + ' ,pcclient.codusur1 as "sellerId" ' + ' ,pccidade.codibge as "ibgeCode" ' + ' ,pcclient.dtnasc as "birthdate" ' + ' ,pcclient.codatv1 as "ramoId" ' + ' ,pcclient.meiocomunicacao as "communicate" ' + ' ,pcclient.latitude as "latitude" ' + ' ,pcclient.longitude as "longitude" ' + ' ,pcclient.codmunicipio as "ibgeCode" ' + ' ,pcclient.codcidade as "cityId" ' + ' FROM pcclient, pccidade ' + ' WHERE pcclient.codcidade = pccidade.codcidade (+)'; const where = ` AND pcclient.codcli = ${idCustomer}`; const customer = await queryRunner.query(sql + where); // const customer = await queryRunner.manager // .getRepository(Pcclient) // .createQueryBuilder('pcclient') // .select("\"pcclient\".codcli as \"customerId\"") // .addSelect("\"pcclient\".cliente as \"name\"") // .addSelect("\"pcclient\".emailnfe as \"email\"") // .addSelect("\"pcclient\".cgcent as \"cpfCnpj\"") // .addSelect("\"pcclient\".ieent as \"numberState\"") // .addSelect("\"pcclient\".enderent as \"address\"") // .addSelect("\"pcclient\".numeroent as \"addressNumber\"") // .addSelect("\"pcclient\".bairroent as \"neighborhood\"") // .addSelect("\"pcclient\".complementoent as \"complement\"") // .addSelect("\"pcclient\".municent as \"city\"") // .addSelect("\"pcclient\".estent as \"state\"") // .addSelect("\"pcclient\".cepent as \"zipCode\"") // .addSelect("\"pcclient\".telent as \"phone\"") // .addSelect("\"pcclient\".telcelent as \"cellPhone\"") // .addSelect("\"pcclient\".codcategoria as \"categoryId\"") // .addSelect("\"pcclient\".codsubcategoria as \"subCategoryId\"") // .addSelect("\"pcclient\".codpraca as \"placeId\"") // .where("\"pcclient\".codcli = :codcli", { codcli: idCustomer }) // .andWhere("\"pcclient\".CODCLI NOT IN (2)") // .getOne(); return customer[0]; } catch (error) { console.log(error); throw error; } finally { await queryRunner.release(); await connection.close(); } } async findCustomerByQuery(field: string, textSearch: string) { let where = ""; switch (field) { case "name": where += "\"pcclient\".cliente like '" + textSearch + "%'"; break; case "document": where += "REGEXP_REPLACE(\"pcclient\".cgcent, '[^0-9]', '') = REGEXP_REPLACE('" + textSearch + "', '[^0-9]', '')"; break; case "phone": where += "REGEXP_REPLACE(\"pcclient\".telent, '[^0-9]', '') = REGEXP_REPLACE('" + textSearch + "', '[^0-9]', '')"; break; case "cellphone": where += "REGEXP_REPLACE(\"pcclient\".telcelent, '[^0-9]', '') = REGEXP_REPLACE('" + textSearch + "', '[^0-9]', '')"; break; case "customerId": where += "\"pcclient\".codcli = " + textSearch; break; default: throw new HttpException('Não foi informado um campo válido para pesquisa.', HttpStatus.BAD_REQUEST); } /* if (document){ where += "REGEXP_REPLACE(\"pcclient\".cgcent, '[^0-9]', '') = REGEXP_REPLACE('"+document+"', '[^0-9]', '')"; } if (name){ if(where.length > 0) { where += " AND \"pcclient\".cliente like '" + name + "%'"; } else { where += "\"pcclient\".cliente like '" + name + "%'"; } }*/ const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); try { const customers = await queryRunner.manager .getRepository(Pcclient) .createQueryBuilder('pcclient') .select("\"pcclient\".codcli as \"customerId\"") .addSelect("\"pcclient\".cliente as \"name\"") .addSelect("\"pcclient\".emailnfe as \"email\"") .addSelect("\"pcclient\".cgcent as \"cpfCnpj\"") .addSelect("\"pcclient\".sexo as \"gender\"") .addSelect("\"pcclient\".enderent as \"address\"") .addSelect("\"pcclient\".numeroent as \"addressNumber\"") .addSelect("\"pcclient\".bairroent as \"neighborhood\"") .addSelect("\"pcclient\".complementoent as \"complement\"") .addSelect("\"pcclient\".municent as \"city\"") .addSelect("\"pcclient\".estent as \"state\"") .addSelect("\"pcclient\".cepent as \"zipCode\"") .addSelect("\"pcclient\".telent as \"phone\"") .addSelect("\"pcclient\".telcelent as \"cellPhone\"") .addSelect("\"pcclient\".codcategoria as \"categoryId\"") .addSelect("\"pcclient\".codsubcategoria as \"subCategoryId\"") .addSelect("\"pcclient\".codpraca as \"placeId\"") .addSelect("\"pcclient\".ieent as \"numberState\"") .addSelect("\"pcclient\".latitude as \"latitude\"") .addSelect("\"pcclient\".longitude as \"longitude\"") .addSelect("\"pcclient\".codmunicipio as \"ibgeCode\"") .addSelect("\"pcclient\".codcidade as \"cityId\"") .where(where) .andWhere("\"pcclient\".CODCLI NOT IN (2) AND \"pcclient\".DTEXCLUSAO IS NULL") .getRawMany(); return customers; } catch (error) { console.log(error); throw error; } finally { await queryRunner.release(); await connection.close(); } } async createCustomer(customer: Customer) { try { console.log("Dados consumer: " + JSON.stringify(customer)); const newCustomer = await this.InitializeCustomer(); newCustomer.tipofj = (customer.company == 'true' ? "J" : "F"); newCustomer.ieent = (customer.company == 'true' ? customer.numberState : "ISENTO"); newCustomer.inscestadual = newCustomer.ieent; newCustomer.cgcent = customer.cpfCnpj; newCustomer.sexo = customer.gender; newCustomer.cgcentrega = customer.cpfCnpj; newCustomer.cliente = customer.name.toUpperCase(); newCustomer.fantasia = newCustomer.cliente; newCustomer.email = customer.email.toLowerCase(); newCustomer.emailnfe = customer.email.toLowerCase(); newCustomer.telent = customer.cellPhone; newCustomer.telcelent = customer.cellPhone; newCustomer.celularwhatsapp = customer.cellPhone; newCustomer.codusur1 = customer.sellerId; newCustomer.codatv1 = ( customer.ramo != null && customer.ramo.id > 0 ) ? customer.ramo.id : newCustomer.codatv1; //Endereço de entrega newCustomer.cepent = customer.zipCode; newCustomer.enderent = customer.address.toUpperCase(); newCustomer.numeroent = customer.addressNumber; if ( customer.complement !== null && customer.complement.length > 80 ) { newCustomer.complementoent = customer.complement.substring(0, 80 ).toUpperCase(); } else { if ( customer.complement != null ) { newCustomer.complementoent = customer.complement.toUpperCase(); } } newCustomer.bairroent = customer.neighborhood.toUpperCase(); newCustomer.municent = customer.city.toUpperCase(); newCustomer.estent = customer.state.toUpperCase(); //Endereço de comercial newCustomer.cepcom = customer.zipCode; newCustomer.endercom = customer.address.toUpperCase(); newCustomer.numerocom = customer.addressNumber.toUpperCase(); if ( customer.complement !== null && customer.complement.length > 80 ) { newCustomer.complementocom = customer.complement.substring(0, 80 ).toUpperCase(); } else { if ( customer.complement != null ) { newCustomer.complementocom = customer.complement.toUpperCase(); } } newCustomer.bairrocom = customer.neighborhood.toUpperCase(); newCustomer.municcom = customer.city.toUpperCase(); newCustomer.estcom = customer.state.toUpperCase(); //Endereço de cobrança newCustomer.cepcob = customer.zipCode; newCustomer.endercob = customer.address.toUpperCase(); newCustomer.numerocob = customer.addressNumber; if ( customer.complement !== null && customer.complement.length > 80 ) { newCustomer.complementocob = customer.complement.substring(0, 80 ).toUpperCase(); } else { if ( customer.complement ) { newCustomer.complementocob = customer.complement.toUpperCase(); } } newCustomer.bairrocob = customer.neighborhood.toUpperCase(); newCustomer.municcob = customer.city.toUpperCase(); newCustomer.estcob = customer.state.toUpperCase(); newCustomer.codcategoria = (customer.category != null) ? customer.category.id : null; newCustomer.codsubcategoria = (customer.subCategory != null) ? customer.subCategory.id : null; newCustomer.codpraca = customer.place.id; newCustomer.codcidade = customer.ibgeCode != null ? await this.findCity(customer.ibgeCode) : null; newCustomer.codmunicipio = Number.parseInt(customer.ibgeCode); newCustomer.codcidadecom = newCustomer.codcidade; newCustomer.dtnasc = customer.birthdate; newCustomer.meiocomunicacao = customer.communicate; newCustomer.codfunccad = customer.idUser; newCustomer.codfunccadastro = customer.idUser; newCustomer.codfuncultalter = customer.idUser; newCustomer.dtultalter = new Date(); newCustomer.latitude = customer.latitude; newCustomer.longitude = customer.longitude; const oldCustomer = await this.findCustomerByCpf(newCustomer.cgcent); if (oldCustomer) { console.log('Cliente localizado: ' + oldCustomer.customerId); newCustomer.codcli = oldCustomer.customerId; await this.updateCustomer(newCustomer); return { customerId: oldCustomer.customerId, company: customer.company, name: customer.name, sexo: customer.gender, cpfCnpj: customer.cpfCnpj, numberState: customer.numberState, email: customer.email, zipCode: customer.zipCode, address: customer.address, addressNumber: customer.addressNumber, complement: customer.complement, neighborhood: customer.neighborhood, city: customer.city, state: customer.state, allowMessage: customer.allowMessage, cellPhone: customer.cellPhone, category: customer.category, subCategory: customer.subCategory, place: customer.place, ramo: customer.ramo, meiocomunicacao: customer.communicate, latitude: customer.latitude, longitude: customer.longitude, ibgeCode: customer.ibgeCode }; } else { const idCustomer = await this.generateIdCustomer(); if (idCustomer == -1) return new HttpException("Erro ao gerar númeração de cliente.", HttpStatus.INTERNAL_SERVER_ERROR); newCustomer.codcli = idCustomer; await this.insertCustomer(newCustomer); return { customerId: idCustomer, company: customer.company, name: customer.name, cpfCnpj: customer.cpfCnpj, gender: customer.gender, numberState: customer.numberState, email: customer.email, zipCode: customer.zipCode, address: customer.address, addressNumber: customer.addressNumber, complement: customer.complement, neighborhood: customer.neighborhood, city: customer.city, state: customer.state, allowMessage: customer.allowMessage, cellPhone: customer.cellPhone, category: customer.category, subCategory: customer.subCategory, place: customer.place, meiocomunicacao: customer.communicate, ramo: customer.ramo, latitude: customer.latitude, longitude: customer.longitude, ibgeCode: customer.ibgeCode }; } } catch (error) { throw error; } } async updateCustomer(client: Pcclient) { const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); try { console.log("MEIO DE COMUNICACAO: " + client.meiocomunicacao); await queryRunner.manager .createQueryBuilder() .update(Pcclient) .set({ cliente: client.cliente, fantasia: client.cliente, telcelent: client.telcelent, sexo: client.sexo, telent: client.telent, email: client.email, emailnfe: client.email, cepent: client.cepent, enderent: client.enderent, numeroent: client.numeroent, complementoent: client.complementoent, bairroent: client.bairroent, municent: client.municent, estent: client.estent, cepcob: client.cepent, endercob: client.enderent, numerocob: client.numeroent, complementocob: client.complementoent, bairrocob: client.bairroent, municcob: client.municent, estcob: client.estent, cepcom: client.cepent, endercom: client.enderent, numerocom: client.numeroent, complementocom: client.complementoent, bairrocom: client.bairroent, municcom: client.municent, estcom: client.estent, codcategoria: client.codcategoria, codsubcategoria: client.codsubcategoria, codpraca: client.codpraca, codcidade: client.codcidade, codmunicipio: client.codmunicipio, codcidadecom: client.codcidade, dtnasc: client.dtnasc, codatv1: client.codatv1, meiocomunicacao: client.meiocomunicacao, codfuncultalter: client.codfuncultalter, dtultalter: client.dtultalter, latitude: client.latitude, longitude: client.longitude, }) .where({ codcli: client.codcli }) .execute(); await queryRunner.commitTransaction(); return client; } catch (err) { await queryRunner.rollbackTransaction(); throw err; } finally { if ( queryRunner.isTransactionActive) { await queryRunner.rollbackTransaction(); } await queryRunner.release(); await connection.close(); } } async findCity(ibgeCode: string) { if (ibgeCode == null) { return 0; } const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); try { const city = await queryRunner.query('SELECT PCCIDADE.CODCIDADE as "codigoCidade" FROM PCCIDADE WHERE PCCIDADE.codibge = :1', [ibgeCode]); let cityId = 0; if (city.length > 0) { cityId = city[0].codigoCidade; } return cityId; } catch (err) { throw err; } finally { await queryRunner.release(); await connection.close(); } } async InitializeCustomer() { const cliente = new Pcclient(); cliente.codusur1 = 1; cliente.codplpag = 10; cliente.codpraca = 119; cliente.codcob = "D"; cliente.dtcadastro = new Date(); cliente.codcontab = "1"; cliente.aceitavendafracao = "N"; //cliente.Meiocomunicacao = "N"; cliente.bloqueio = "N"; cliente.bloqueiosefaz = "N"; cliente.bloqueiosefazped = "N"; cliente.bloqvendapf = "N"; cliente.condvenda1 = "S"; cliente.condvenda5 = "S"; cliente.condvenda7 = "S"; cliente.condvenda8 = "S"; cliente.contribuinte = "N"; cliente.validarmultiplovenda = "N"; cliente.codfunccad = 1; cliente.codfunccadastro = 1; cliente.horacadastro = new Date(); cliente.dtcadastro = new Date(); cliente.dtultvisita = new Date(); cliente.codatv1 = 7; cliente.aceitatrocanegativa = "N"; cliente.consumidorfinal = "S"; cliente.aplicadescnf = "S"; cliente.simplesnacional = "N"; cliente.sexo = "M"; cliente.isencaosuframa = "T"; cliente.clicrm = "N"; cliente.tv10usacustoproduto = "N"; cliente.inscestadual = "ISENTO"; cliente.codpais = 1058; //Brasil cliente.observacao = "Importado do E-Commerce"; cliente.aceitachterceiros = "S"; cliente.agregarvalorstdescfin = "N"; cliente.anvisa = "N"; cliente.aplicredbaseicmstransp = "N"; cliente.atendedomingo = "N"; cliente.atendequarta = "N"; cliente.atendequinta = "N"; cliente.atendesabado = "N"; cliente.atendesegunda = "N"; cliente.atendesexta = "N"; cliente.atendeterca = "N"; cliente.atualizasaldoccdescfin = "N"; cliente.bloqremcob = "N"; cliente.clientedan = "N"; cliente.clientefontest = "N"; cliente.clientemonitorado = "N"; cliente.clientprotesto = "S"; cliente.fretedespacho = "0"; cliente.aceitavendafracao = "S"; cliente.validarmultiplovenda = "S"; return cliente; } async generateIdCustomer() { console.log("Gerando idcustomer"); const connection = new Connection(connectionOptions); const queryRunner = connection.createQueryRunner(); try { await connection.connect(); await queryRunner.connect(); // lets now open a new transaction: await queryRunner.startTransaction(); let sql = `SELECT PROXNUMCLI as "proxnumcli" FROM PCCONSUM WHERE 1 = 1 FOR UPDATE`; let param = await queryRunner.query(sql); // const param = await queryRunner.manager // .getRepository(Pcconsum) // .createQueryBuilder('pcconsum') // .setLock("dirty_read") // .getOne(); const idCustomer = param[0].proxnumcli; console.log(idCustomer); sql = `UPDATE PCCONSUM SET PROXNUMCLI = NVL(PROXNUMCLI,0) + 1`; param = await queryRunner.query(sql); // await queryRunner.manager // .createQueryBuilder() // .update(Pcconsum) // .set({ proxnumcli: idCustomer + 1 }) // .execute(); // commit transaction now: await queryRunner.commitTransaction(); return idCustomer; } catch (err) { // since we have errors let's rollback changes we made if ( queryRunner.isTransactionActive) { await queryRunner.rollbackTransaction(); } console.log(err); return -1; } finally { if ( queryRunner.isTransactionActive) { await queryRunner.rollbackTransaction(); } // you need to release query runner which is manually created: await queryRunner.release(); await connection.close(); } } async insertCustomer(client: Pcclient) { console.log(client); const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); try { await queryRunner.manager .createQueryBuilder() .insert() .into(Pcclient) .values(client) .execute(); await queryRunner.commitTransaction(); return client; } catch (err) { await queryRunner.rollbackTransaction(); console.log(err); throw err; } finally { if ( queryRunner.isTransactionActive) { await queryRunner.rollbackTransaction(); } await queryRunner.release(); await connection.close(); } } async getCategory() { const connectionDb = new Connection(connectionOptions) await connectionDb.connect(); const queryRunner = connectionDb.createQueryRunner(); await queryRunner.connect(); try { return await queryRunner.manager .getRepository(Estcategoriacliente) .createQueryBuilder("estcategoriacliente") .getMany(); } catch (err) { console.log(err); throw err; } finally { await queryRunner.release(); await connectionDb.close(); } } async getSubCategory() { const connectionDb = new Connection(connectionOptions) await connectionDb.connect(); const queryRunner = connectionDb.createQueryRunner(); await queryRunner.connect(); try { return await queryRunner.manager .getRepository(Estsubcategoriacliente) .createQueryBuilder("estsubcategoriacliente") .getMany(); } catch (err) { console.log(err); throw err; } finally { await queryRunner.release(); await connectionDb.close(); } } }