This commit is contained in:
@@ -0,0 +1,300 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\Exportacao\EstrategiaVacinacao;
|
||||
use App\Enums\AtencaoBasica\Exportacao\Imunobiologico;
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Exportacao\VacinaAplicadaExterior;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Enums\Imunizacao\Estrategia;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\AtencaoBasica\FichaVacinacao\FichaVacinacao;
|
||||
use App\Models\AtencaoBasica\FichaVacinacao\PacienteItem;
|
||||
use App\Models\AtencaoBasica\FichaVacinacao\VacinacaoPaciente;
|
||||
use App\Rules\Cns;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use DOMDocument;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use ZipArchive;
|
||||
|
||||
class FichaVacinacaoService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasVacinacao($mes_ano) as $fichaVacinacao) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaVacinacao);
|
||||
|
||||
$xmlPath = Storage::path($arquivo_caminho . 'xml_temp.xml');
|
||||
|
||||
$dadosExportacao['dom']->save($xmlPath);
|
||||
$zip = new ZipArchive;
|
||||
$zip->open(Storage::path($arquivo_caminho . $arquivo_nome), ZipArchive::CREATE);
|
||||
$zip->addFile($xmlPath, 'VA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasVacinacao($mesAnoInicial, false) as $fichaVacinacao) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaVacinacao);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaVacinacao->data_atendimento,
|
||||
'usuario_id' => $fichaVacinacao->usuario->id,
|
||||
'ocupacao_id' => $fichaVacinacao->ocupacao->id,
|
||||
'equipe_id' => $fichaVacinacao->equipe->id,
|
||||
'ficha_vacinacao_id' => $fichaVacinacao->id,
|
||||
'ficha_vacinacao_pacientes' => $dadosExportacao['ficha_vacinacao_pacientes'],
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'VA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasVacinacao($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return FichaVacinacao::whereNull('exportacao_id')
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data_atendimento', substr($mes_ano, 2))
|
||||
->whereMonth('data_atendimento', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_atendimento', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_atendimento', substr($mes_ano, 2))
|
||||
->whereMonth('data_atendimento', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->whereExists(function ($query) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('atencao_basica_vacinacao_paciente')
|
||||
->whereColumn('vacinacao_id', 'atencao_basica_ficha_vacinacao.id')
|
||||
->whereExists(function ($query) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('atencao_basica_vacinacao_paciente_item')
|
||||
->whereColumn('vacinacao_paciente_id', 'atencao_basica_vacinacao_paciente.id');
|
||||
});
|
||||
})
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaVacinacao)
|
||||
{
|
||||
$uuid = ExportacaoService::getUuid($fichaVacinacao->equipe->unidade->cnes);
|
||||
|
||||
$dom = new DOMDocument('1.0', 'UTF-8');
|
||||
$dadoTransporteTransportXml = $dom->createElementNS('http://esus.ufsc.br/dadotransporte', 'ns3:dadoTransporteTransportXml');
|
||||
$dadoTransporteTransportXml->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns2', 'http://esus.ufsc.br/dadoinstalacao');
|
||||
$dadoTransporteTransportXml->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns3', 'http://esus.ufsc.br/dadotransporte');
|
||||
$dadoTransporteTransportXml->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns4', 'http://esus.ufsc.br/fichavacinacaomaster');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::FICHA_DE_VACINACAO));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaVacinacao->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaVacinacao->equipe->unidade->cnes));
|
||||
if($fichaVacinacao->equipe->area->numero_ine) {
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', str_pad($fichaVacinacao->equipe->area->numero_ine, 10, '0', STR_PAD_LEFT)));
|
||||
}
|
||||
|
||||
$fichaVacinacaoMasterTransport = $dom->createElement('ns4:fichaVacinacaoMasterTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaVacinacaoMasterTransport);
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaVacinacaoMasterTransport->appendChild($headerTransport);
|
||||
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaVacinacao->usuario->cidadao->cns ?? ''));
|
||||
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaVacinacao->ocupacao->codigo ));
|
||||
$headerTransport->appendChild($dom->createElement('cnes', $fichaVacinacao->equipe->unidade->cnes));
|
||||
if($fichaVacinacao->equipe->area->numero_ine) {
|
||||
$headerTransport->appendChild($dom->createElement('ine', str_pad($fichaVacinacao->equipe->area->numero_ine, 10, '0', STR_PAD_LEFT)));
|
||||
}
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaVacinacao->data_atendimento) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaVacinacao->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
$fichaVacinacaoMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
$fichaVacinacaoMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
|
||||
$retorno = self::getVacinacao($dom, $fichaVacinacao, $fichaVacinacaoMasterTransport);
|
||||
$fichaVacinacaoPacientesPosicoes = $retorno['ficha_vacinacao_pacientes'];
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaVacinacao->uuid_ficha = $uuid;
|
||||
$fichaVacinacao->exportacao_id = $exportacao->id;
|
||||
$fichaVacinacao->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaVacinacao->usuario_exportacao_id = self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaVacinacao->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
'ficha_vacinacao_pacientes' => $fichaVacinacaoPacientesPosicoes,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getVacinacao(&$dom, $fichaVacinacao, &$fichaVacinacaoMasterTransport) {
|
||||
|
||||
$fichaVacinacaoPacientesPosicoes = collect();
|
||||
|
||||
$vacinacaoPaciente = VacinacaoPaciente::has('paciente')
|
||||
->where('vacinacao_id', $fichaVacinacao->id)
|
||||
->whereExists(function ($query) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('atencao_basica_vacinacao_paciente_item')
|
||||
->whereColumn('vacinacao_paciente_id', 'atencao_basica_vacinacao_paciente.id');
|
||||
})
|
||||
->get();
|
||||
|
||||
foreach ($vacinacaoPaciente as $i => $vacinacao) {
|
||||
|
||||
$fichaVacinacaoPacientesPosicoes->push([
|
||||
'posicao' => $i + 1,
|
||||
'id' => $vacinacao->id,
|
||||
]);
|
||||
|
||||
$vacinacoes = $dom->createElement('vacinacoes');
|
||||
$fichaVacinacaoMasterTransport->appendChild($vacinacoes);
|
||||
$vacinacoes->appendChild($dom->createElement('turno', $vacinacao->turno_id));
|
||||
$vacinacoes->appendChild($dom->createElement('numProntuario', $vacinacao->paciente->prontuario));
|
||||
|
||||
if (Cns::isValid($vacinacao->paciente->cidadao->cns)) {
|
||||
$vacinacoes->appendChild($dom->createElement('cnsCidadao', $vacinacao->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($vacinacao->paciente->cidadao->cns)) {
|
||||
$vacinacoes->appendChild($dom->createElement('cpfCidadao', $vacinacao->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$vacinacoes->appendChild($dom->createElement('dtNascimento', strtotime($vacinacao->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$vacinacoes->appendChild($dom->createElement('sexo', self::sexo($vacinacao->paciente->cidadao->sexo->id)));
|
||||
$vacinacoes->appendChild($dom->createElement('localAtendimento', $vacinacao->local_atendimento_id));
|
||||
$vacinacoes->appendChild($dom->createElement('viajante', $vacinacao->viajante ? 'true' : 'false'));
|
||||
|
||||
if (self::handleComunicanteHanseniase($vacinacao)) {
|
||||
$vacinacoes->appendChild($dom->createElement('comunicanteHanseniase', $vacinacao->hanseniase ? 'true' : 'false'));
|
||||
}
|
||||
|
||||
$vacinacoes->appendChild($dom->createElement('gestante', $vacinacao->gestante ? 'true' : 'false'));
|
||||
$vacinacoes->appendChild($dom->createElement('puerpera', $vacinacao->puerpera ? 'true' : 'false'));
|
||||
|
||||
$pacienteItem = PacienteItem::where('vacinacao_paciente_id', $vacinacao->id)->get();
|
||||
|
||||
foreach ($pacienteItem as $item) {
|
||||
|
||||
$vacinas = $dom->createElement('vacinas');
|
||||
$vacinacoes->appendChild($vacinas);
|
||||
$vacinas->appendChild($dom->createElement('imunobiologico', $item->vacina->codigo));
|
||||
if($item->estrategia_id) {
|
||||
$vacinas->appendChild($dom->createElement('estrategiaVacinacao', self::getEstrategia($item->estrategia_id)));
|
||||
}
|
||||
$vacinas->appendChild($dom->createElement('dose', $item->dose->codigo_esus));
|
||||
|
||||
if ($item->entrada && $item->entrada->lote) {
|
||||
|
||||
$vacinas->appendChild($dom->createElement('lote', str_replace(' ', '', $item->entrada->lote) ?? ''));
|
||||
}
|
||||
|
||||
if ($item->produtor){
|
||||
|
||||
$vacinas->appendChild($dom->createElement('fabricante', $item->produtor ? htmlspecialchars($item->produtor->nome) : ''));
|
||||
}
|
||||
|
||||
if (!$item->registro_anterior && $item->grupo && $item->grupo->codigo_esus) {
|
||||
|
||||
$vacinas->appendChild($dom->createElement('grupoAtendimento', $item->grupo->codigo_esus ?? ''));
|
||||
}
|
||||
|
||||
$vacinas->appendChild($dom->createElement('stRegistroAnterior', $item->registro_anterior ? 'true' : 'false'));
|
||||
|
||||
if ($item->registro_anterior) {
|
||||
$vacinas->appendChild($dom->createElement('dataRegistroAnterior', strtotime($item->data) * 1000));
|
||||
}
|
||||
|
||||
if (self::handleVacinaAplicadaExterior($item)) {
|
||||
$vacinas->appendChild($dom->createElement('stAplicadoExterior', $item->aplicado_exterior ? 'true' : 'false'));
|
||||
}
|
||||
}
|
||||
|
||||
$vacinacoes->appendChild($dom->createElement('dataHoraInicialAtendimento', strtotime($fichaVacinacao->data_atendimento) * 1000));
|
||||
$vacinacoes->appendChild($dom->createElement('dataHoraFinalAtendimento', strtotime($fichaVacinacao->data_atendimento) * 1000));
|
||||
}
|
||||
|
||||
return [
|
||||
'ficha_vacinacao_pacientes' => $fichaVacinacaoPacientesPosicoes,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getEstrategia($id) {
|
||||
switch ($id) {
|
||||
case Estrategia::PESQUISA:
|
||||
return EstrategiaVacinacao::PESQUISA;
|
||||
case Estrategia::PRE_EXPOSICAO:
|
||||
return EstrategiaVacinacao::PRE_EXPOSICAO;
|
||||
case Estrategia::POS_EXPOSICAO:
|
||||
return EstrategiaVacinacao::POS_EXPOSICAO;
|
||||
case Estrategia::REEXPOSICAO:
|
||||
return EstrategiaVacinacao::REEXPOSICAO;
|
||||
default:
|
||||
return $id;
|
||||
}
|
||||
}
|
||||
|
||||
private static function handleVacinaAplicadaExterior($item) {
|
||||
|
||||
return $item->registro_anterior && in_array($item->vacina->codigo, VacinaAplicadaExterior::getConstants());
|
||||
}
|
||||
|
||||
private static function handleComunicanteHanseniase($vacinacao) {
|
||||
|
||||
return PacienteItem::where('vacinacao_paciente_id', $vacinacao->id)
|
||||
->whereHas('vacina', function ($query) {
|
||||
$query->where('codigo', Imunobiologico::BCG);
|
||||
})
|
||||
->first();
|
||||
}
|
||||
|
||||
private static function sexo($sexo_id) {
|
||||
$sexo = null;
|
||||
|
||||
if ($sexo_id === Sexo::MASCULINO) {
|
||||
$sexo = ExportacaoSexo::MASCULINO;
|
||||
}
|
||||
else if ($sexo_id === Sexo::FEMININO) {
|
||||
$sexo = ExportacaoSexo::FEMININO;
|
||||
}
|
||||
else if ($sexo_id === Sexo::INDETERMINADO) {
|
||||
$sexo = ExportacaoSexo::INDETERMINADO;
|
||||
}
|
||||
else {
|
||||
$sexo = ExportacaoSexo::IGNORADO;
|
||||
}
|
||||
|
||||
return $sexo;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user