Boa tarde pessoal.
Estou desenvolvendo uma aplicação que tem o intuito de ler um arquivo CSV e gravar os dados obtidos na base de dados.
Se trata de um guia médico. Onde o arquivo CSV trás informações do Médico, da especialidade e do convênio que ele atende. Estou trabalhando com 4 tabelas, sendo elas: MEDICO, ESPECIALIDADE, CONVENIO e VINCULO.
A tabela vinculo é responsável por armazenar o vinculo do médico com a especialidade e o convênio que ele atende.
Porém, ao executar a aplicação todos os médicos do arquivo estão recebendo a mesma especialidade e convênio.
Poderiam me ajudar a entender onde estou errando?
O correto seria a aplicação ler a primeira linha do arquivo CSV executar as condições que desenvolvi, salvar no banco e só após esse processo ele ir para próxima linha do arquivo.
Mas após fazer depurar identifiquei que a aplicação percorre todas as linhas do arquivo e só depois ela vai para as validações que desenvolvi.
import { AppDataSource } from './data-source'
import { Umedic } from './entity/Umedic'
import { Umedespec } from './entity/Umedespec';
import { Umedconv } from './entity/Umedconv';
import { Umedvinc } from './entity/Umedvinc';
import { Request, Response, Router } from 'express';
import { Readable } from 'stream';
import * as readline from 'readline';
import * as multer from 'multer';
const multerConfig = multer();
const router = Router();
interface Medico {
idMed: number;
name: string;
crm: string;
doc: string;
telconsult: string;
telcel: string;
email: string;
tipoprest: string;
end: string;
num: string;
bairro: string;
cidade: string;
uf: string;
cep: string;
created_at: Date;
updated_at: Date|null;
}
interface Especialiadade {
idEspec: number;
descricaoEspec: string;
}
interface Convenio {
idConv: number;
descricaoConv: string;
}
interface ConvenioEspec{
idVinc: number;
idEspec: number;
idConv: number;
idMed: number;
}
function uid() {
var min = Math.ceil(1);
var max = Math.floor(99999);
return Math.floor(Math.random() * (max - min)) + min;
};
router.post(
'/medicos',
multerConfig.single('file'),
async (request: Request, response: Response) => {
const { file } = request;
if( file ) {
const { buffer } = file;
const readableFile = new Readable();
readableFile.push(buffer);
readableFile.push(null);
const medicoLine = readline.createInterface({
input: readableFile,
})
const medicos: Medico[] = [];
const especialidade: Especialiadade[] = [];
const convenio: Convenio[] = [];
for await (let line of medicoLine) {
const medicoLineSplit = line.split(';')
var datual = new Date(Date.now())
const idm = uid()
medicos.push({
idMed: idm,
name: medicoLineSplit[1],
crm: medicoLineSplit[2],
doc: medicoLineSplit[3],
telconsult: medicoLineSplit[4],
telcel: medicoLineSplit[5],
email: medicoLineSplit[6],
tipoprest: medicoLineSplit[7],
end: medicoLineSplit[8],
num: medicoLineSplit[9],
bairro: medicoLineSplit[10],
cidade: medicoLineSplit[11],
uf: medicoLineSplit[12],
cep: medicoLineSplit[13],
created_at: datual,
updated_at: null,
});
especialidade.push({
idEspec: 1,
descricaoEspec: medicoLineSplit[15]
});
convenio.push({
idConv: 1,
descricaoConv: medicoLineSplit[17]
});
for await ( let { idMed, name, crm, doc, telconsult, telcel, email, tipoprest, end, num, bairro, cidade, uf, cep, created_at, updated_at } of medicos) {
const medic = new Umedic()
medic.idMed = idMed
medic.name = name
medic.crm = crm
medic.doc = doc
medic.telconsult = telconsult
medic.telcel = telcel
medic.email = email
medic.tipoprest = tipoprest
medic.end = end
medic.bairro = bairro
medic.num = Number(num)
medic.bairro = bairro
medic.cidade = cidade
medic.uf = uf
medic.cep = cep
medic.created_at = created_at
medic.updated_at = updated_at
const docMed = doc;
const medRepo = await AppDataSource.manager
.createQueryBuilder(Umedic, "m")
.where("m.doc = :cpf", { cpf: docMed })
.getOne()
const medSearch = new Umedic();
if(medRepo){
console.log('Medic already exists in base: ' + medRepo.idMed)
medSearch.idMed = medRepo.idMed
}else{
await AppDataSource.manager.save(medic)
medSearch.idMed = medic.idMed
console.log('Saved a new medic with id: ' + medic.idMed)
}
// ESPECIALIDADE
var especMed:Umedespec;
for await ( let { descricaoEspec } of especialidade){
especMed = await AppDataSource.manager
.createQueryBuilder(Umedespec, "e")
.where("e.descricaoEspec = :descricao", { descricao: descricaoEspec })
.getOne()
}
//CONVENIO
var convMed:Umedconv;
for await ( let { descricaoConv } of convenio){
convMed = await AppDataSource.manager
.createQueryBuilder(Umedconv, "c")
.where("c.descricaoConv = :descricao", { descricao: descricaoConv })
.getOne()
}
//VINCULO
const vinculoExists = await AppDataSource.manager
.createQueryBuilder(Umedvinc, "v")
.where("v.idMed = :idMed", { idMed: medSearch.idMed })
.andWhere("v.idEspec = :idEspec", { idEspec: especMed.idEspec })
.andWhere("v.idConv = :idConv", { idConv: convMed.idConv })
.getOne()
const idv = uid()
if(vinculoExists){
console.log('This is medic is registered in database with the same information ' + medSearch.idMed)
}else{
const vinculoMed = new Umedvinc()
vinculoMed.idVinc = idv
vinculoMed.idMed = medSearch
vinculoMed.idConv = convMed
vinculoMed.idEspec = especMed
await AppDataSource.manager.save(vinculoMed)
}
}
AppDataSource.initialize().then(async () => {
})
}
return response.json(medicos);
}
}
);
export { router };