This commit is contained in:
1223
api/app/Services/AtencaoBasica/Exportacao/ExportacaoService.php
Normal file
1223
api/app/Services/AtencaoBasica/Exportacao/ExportacaoService.php
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,566 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
|
||||
use App\Enums\AtencaoBasica\AtendimentoIndividual\DoencaTransmissivel;
|
||||
use App\Enums\AtencaoBasica\AtendimentoIndividual\Rastreamento;
|
||||
use App\Enums\AtencaoBasica\TipoAtendimento;
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Enums\Geral\CiapCondicaoAvaliada;
|
||||
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliar;
|
||||
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarAtendimento;
|
||||
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarAtendimentoIvcf;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\Geral\Ciap;
|
||||
use App\Models\Sigtap\Cid;
|
||||
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 FichaAtendimentoDomiciliarService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasAtendimentoDomiciliar($mes_ano) as $fichaAtendimentoDomiciliar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaAtendimentoDomiciliar, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'AD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
if (file_exists($xmlPath)) {
|
||||
unlink($xmlPath);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasAtendimentoDomiciliar($mesAnoInicial, false) as $fichaAtendimentoDomiciliar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaAtendimentoDomiciliar);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaAtendimentoDomiciliar->data,
|
||||
'usuario_id' => $fichaAtendimentoDomiciliar->usuario->id,
|
||||
'ocupacao_id' => $fichaAtendimentoDomiciliar->ocupacao->id,
|
||||
'equipe_id' => $fichaAtendimentoDomiciliar->equipe->id,
|
||||
'atendimento_domiciliar_id' => $fichaAtendimentoDomiciliar->id,
|
||||
'atendimento_domiciliar_atendimentos' => $dadosExportacao['atendimento_domiciliar_atendimentos'],
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'AD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasAtendimentoDomiciliar($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return AtendimentoDomiciliar::whereNull('exportacao_id')
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data', substr($mes_ano, 2))
|
||||
->whereMonth('data', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data', substr($mes_ano, 2))
|
||||
->whereMonth('data', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaAtendimentoDomiciliar, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$atendimentoDomiciliarAtendimentosPosicoes = collect();
|
||||
|
||||
$uuid = ExportacaoService::getUuid($fichaAtendimentoDomiciliar->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/fichaatendimentodomiciliarmaster');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::ATENDIMENTO_DOMICILIAR));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaAtendimentoDomiciliar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaAtendimentoDomiciliar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaAtendimentoDomiciliar->equipe->area->numero_ine){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaAtendimentoDomiciliar->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaAtendimentoDomiciliarMasterTransport = $dom->createElement('ns4:fichaAtendimentoDomiciliarMasterTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaAtendimentoDomiciliarMasterTransport);
|
||||
|
||||
$fichaAtendimentoDomiciliarMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
$fichaAtendimentoDomiciliarMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaAtendimentoDomiciliarMasterTransport->appendChild($headerTransport);
|
||||
|
||||
$lotacaoFormPrincipal = $dom->createElement('lotacaoFormPrincipal');
|
||||
$headerTransport->appendChild($lotacaoFormPrincipal);
|
||||
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('profissionalCNS', $fichaAtendimentoDomiciliar->usuario->cidadao->cns ?? ''));
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('cboCodigo_2002', $fichaAtendimentoDomiciliar->ocupacao->codigo ));
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('cnes', $fichaAtendimentoDomiciliar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaAtendimentoDomiciliar->equipe->area->numero_ine){
|
||||
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('ine', $fichaAtendimentoDomiciliar->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
if($fichaAtendimentoDomiciliar->usuario_auxiliar_id){
|
||||
|
||||
$lotacaoFormAtendimentoCompartilhado = $dom->createElement('lotacaoFormAtendimentoCompartilhado');
|
||||
$headerTransport->appendChild($lotacaoFormAtendimentoCompartilhado);
|
||||
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('profissionalCNS', $fichaAtendimentoDomiciliar->usuarioAuxiliar->cidadao->cns ?? ''));
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('cboCodigo_2002', $fichaAtendimentoDomiciliar->ocupacaoAuxiliar->codigo ));
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('cnes', $fichaAtendimentoDomiciliar->equipeAuxiliar->unidade->cnes));
|
||||
|
||||
if($fichaAtendimentoDomiciliar->equipeAuxiliar->area->numero_ine){
|
||||
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('ine', $fichaAtendimentoDomiciliar->equipeAuxiliar->area->numero_ine));
|
||||
}
|
||||
}
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaAtendimentoDomiciliar->data) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAtendimentoDomiciliar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
$atendimentos = AtendimentoDomiciliarAtendimento::where('atendimento_domiciliar_id', $fichaAtendimentoDomiciliar->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentos as $i => $atendimento) {
|
||||
|
||||
$atendimentoDomiciliarAtendimentosPosicoes->push([
|
||||
'posicao' => $i + 1,
|
||||
'id' => $atendimento->id,
|
||||
]);
|
||||
|
||||
$atendimentosDomiciliares = $dom->createElement('atendimentosDomiciliares');
|
||||
$fichaAtendimentoDomiciliarMasterTransport->appendChild($atendimentosDomiciliares);
|
||||
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('turno', $atendimento->turno_id));
|
||||
|
||||
if (Cns::isValid($atendimento->paciente->cidadao->cns)) {
|
||||
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('cnsCidadao', $atendimento->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($atendimento->paciente->cidadao->cns)) {
|
||||
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('cpfCidadao', $atendimento->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('dataNascimento', strtotime($atendimento->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('sexo', self::sexo($atendimento->paciente->cidadao->sexo->id)));
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('localAtendimento', $atendimento->local_atendimento_id));
|
||||
|
||||
if($atendimento->tipoAtendimento->id != TipoAtendimento::VISITA_DOMICILIAR_POS_OBITO){
|
||||
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('atencaoDomiciliarModalidade', $atendimento->modalidade->codigo_esus));
|
||||
}
|
||||
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('tipoAtendimento', $atendimento->tipoAtendimento->codigo_esus));
|
||||
|
||||
if (count($atendimento->condicoes) > 0) {
|
||||
|
||||
foreach ($atendimento->condicoes as $condicoes) {
|
||||
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('condicoesAvaliadas', $condicoes->condicao->codigo));
|
||||
}
|
||||
}
|
||||
|
||||
self::getCondicaoAvaliada($dom, $atendimento, $atendimentosDomiciliares);
|
||||
self::getIvcf($dom, $atendimento, $atendimentosDomiciliares);
|
||||
|
||||
if (count($atendimento->procedimentos) > 0) {
|
||||
|
||||
foreach ($atendimento->procedimentos as $procedimento) {
|
||||
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('procedimentos', $procedimento->codigo_procedimento));
|
||||
}
|
||||
}
|
||||
|
||||
if($atendimento->conduta_desfecho_id){
|
||||
|
||||
$atendimentosDomiciliares->appendChild($dom->createElement('condutaDesfecho', $atendimento->condutaDesfecho->codigo));
|
||||
}
|
||||
}
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaAtendimentoDomiciliar->uuid_ficha = $uuid;
|
||||
$fichaAtendimentoDomiciliar->exportacao_id = $exportacao->id;
|
||||
$fichaAtendimentoDomiciliar->data_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaAtendimentoDomiciliar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaAtendimentoDomiciliar->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
'atendimento_domiciliar_atendimentos' => $atendimentoDomiciliarAtendimentosPosicoes,
|
||||
];
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
private static function getCondicaoAvaliada(&$dom, $atendimento, &$atendimentosDomiciliares){
|
||||
|
||||
$atendimentosCondicaoAvaliada = DB::table('atencao_basica_atendimento_domiciliar_atend_condicao_avaliada')
|
||||
->select([
|
||||
'atencao_basica_cadastro_condicao_avaliada.id',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_condicao_avaliada',
|
||||
'atencao_basica_cadastro_condicao_avaliada.id',
|
||||
'atencao_basica_atendimento_domiciliar_atend_condicao_avaliada.condicao_avaliada_id'
|
||||
)
|
||||
->where('atencao_basica_atendimento_domiciliar_atend_condicao_avaliada.atendimento_domiciliar_atendimento_id', $atendimento->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosCondicaoAvaliada as $condicaoAvaliada) {
|
||||
|
||||
$ciap = Ciap::where('id', self::getCiapFromCondicaoAvaliada($condicaoAvaliada->id))->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosDomiciliares->appendChild($problemaCondicaoAvaliada);
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
|
||||
$atendimentosDoencaTransmissivel = DB::table('atencao_basica_atendimento_domiciliar_atend_doenca_transmissivel')
|
||||
->select([
|
||||
'atencao_basica_cadastro_doenca_transmissivel.id',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_doenca_transmissivel',
|
||||
'atencao_basica_cadastro_doenca_transmissivel.id',
|
||||
'atencao_basica_atendimento_domiciliar_atend_doenca_transmissivel.doenca_transmissivel_id'
|
||||
)
|
||||
->where('atencao_basica_atendimento_domiciliar_atend_doenca_transmissivel.atendimento_domiciliar_atendimento_id', $atendimento->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosDoencaTransmissivel as $doenca) {
|
||||
|
||||
$ciap = Ciap::where('id', self::getCiapFromDoencaTransmissivel($doenca->id))->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
$doencaTransmissivel = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosDomiciliares->appendChild($doencaTransmissivel);
|
||||
$doencaTransmissivel->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$doencaTransmissivel->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
|
||||
$atendimentosRastreamento = DB::table('atencao_basica_atendimento_domiciliar_atend_rastreamento')
|
||||
->select([
|
||||
'atencao_basica_cadastro_rastreamento.id',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_rastreamento',
|
||||
'atencao_basica_cadastro_rastreamento.id',
|
||||
'atencao_basica_atendimento_domiciliar_atend_rastreamento.rastreamento_id'
|
||||
)
|
||||
->where('atencao_basica_atendimento_domiciliar_atend_rastreamento.atendimento_domiciliar_atendimento_id', $atendimento->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosRastreamento as $doenca) {
|
||||
|
||||
$ciap = Ciap::where('id', self::getCiapFromRastreamento($doenca->id))->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
$doencaTransmissivel = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosDomiciliares->appendChild($doencaTransmissivel);
|
||||
$doencaTransmissivel->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$doencaTransmissivel->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
|
||||
$atendimentosCondicaoAvaliada = DB::table('atencao_basica_atendimento_domiciliar_atend_problema_condicao')
|
||||
->select([
|
||||
'atencao_basica_atendimento_domiciliar_atend_problema_condicao.ciap_id',
|
||||
'atencao_basica_atendimento_domiciliar_atend_problema_condicao.cid_id',
|
||||
])
|
||||
->where('atencao_basica_atendimento_domiciliar_atend_problema_condicao.atendimento_domiciliar_atendimento_id', $atendimento->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosCondicaoAvaliada as $condicaoAvaliada) {
|
||||
|
||||
if ($condicaoAvaliada->ciap_id) {
|
||||
|
||||
$ciap = Ciap::where('id', $condicaoAvaliada->ciap_id)->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosDomiciliares->appendChild($problemaCondicaoAvaliada);
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
|
||||
if ($condicaoAvaliada->cid_id) {
|
||||
|
||||
$cid = Cid::where('id', $condicaoAvaliada->cid_id)->first() ?? null;
|
||||
|
||||
if ($cid) {
|
||||
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosDomiciliares->appendChild($problemaCondicaoAvaliada);
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('cid10', $cid->codigo));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($atendimento->codigo_cid){
|
||||
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosDomiciliares->appendChild($problemaCondicaoAvaliada);
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('cid10', $atendimento->codigo_cid));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
|
||||
if($atendimento->codigo_ciap){
|
||||
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosDomiciliares->appendChild($problemaCondicaoAvaliada);
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $atendimento->codigo_ciap));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));;
|
||||
}
|
||||
}
|
||||
|
||||
private static function getCiapFromCondicaoAvaliada($condicaoAvaliada)
|
||||
{
|
||||
$map = [
|
||||
CondicaoAvaliada::ASMA => CiapCondicaoAvaliada::ASMA,
|
||||
CondicaoAvaliada::DESNUTRICAO => CiapCondicaoAvaliada::DESNUTRICAO,
|
||||
CondicaoAvaliada::DIABETES => CiapCondicaoAvaliada::DIABETES,
|
||||
CondicaoAvaliada::DPOC => CiapCondicaoAvaliada::DPOC,
|
||||
CondicaoAvaliada::HIPERTENSAO_ARTERIAL => CiapCondicaoAvaliada::HIPERTENSAO_ARTERIAL,
|
||||
CondicaoAvaliada::OBESIDADE => CiapCondicaoAvaliada::OBESIDADE,
|
||||
CondicaoAvaliada::PRE_NATAL => CiapCondicaoAvaliada::PRE_NATAL,
|
||||
CondicaoAvaliada::PUERICULTURA => CiapCondicaoAvaliada::PUERICULTURA,
|
||||
CondicaoAvaliada::PUERPERIO_ATE_42_DIAS => CiapCondicaoAvaliada::PUERPERIO,
|
||||
CondicaoAvaliada::REABILITACAO => CiapCondicaoAvaliada::REABILITACAO,
|
||||
CondicaoAvaliada::TABAGISMO => CiapCondicaoAvaliada::TABAGISMO,
|
||||
CondicaoAvaliada::USUARIO_DE_ALCOOL => CiapCondicaoAvaliada::USUARIO_DE_ALCOOL,
|
||||
CondicaoAvaliada::USUARIO_DE_OUTRAS_DROGAS => CiapCondicaoAvaliada::USUARIO_DE_OUTRAS_DROGAS,
|
||||
];
|
||||
|
||||
return $map[$condicaoAvaliada] ?? null;
|
||||
}
|
||||
|
||||
private static function getCiapFromDoencaTransmissivel($condicaoAvaliada)
|
||||
{
|
||||
$map = [
|
||||
DoencaTransmissivel::DENGUE => CiapCondicaoAvaliada::DENGUE,
|
||||
DoencaTransmissivel::DST => CiapCondicaoAvaliada::DST,
|
||||
DoencaTransmissivel::HANSENIASE => CiapCondicaoAvaliada::HANSENIASE,
|
||||
DoencaTransmissivel::TUBERCULOSE => CiapCondicaoAvaliada::TUBERCULOSE,
|
||||
];
|
||||
|
||||
return $map[$condicaoAvaliada] ?? null;
|
||||
}
|
||||
|
||||
private static function getCiapFromRastreamento($condicaoAvaliada)
|
||||
{
|
||||
$map = [
|
||||
Rastreamento::RISCO_CARDIOVASCULAR => CiapCondicaoAvaliada::RASTREAMENTO_DE_RISCO_CARDIOVASCULAR,
|
||||
];
|
||||
|
||||
return $map[$condicaoAvaliada] ?? null;
|
||||
}
|
||||
|
||||
private static function getIvcf(&$dom, $atendimento, &$atendimentosDomiciliares)
|
||||
{
|
||||
$atendimentoDomiciliarAtendimentoIvcf = AtendimentoDomiciliarAtendimentoIvcf::where('atendimento_domiciliar_atendimento_id', $atendimento->id)->first();
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf) {
|
||||
$pacienteIdade = $atendimentoDomiciliarAtendimentoIvcf->atendimentoDomiciliarAtendimento->paciente->cidadao->idade['anos'] ?? null;
|
||||
|
||||
$resultado = null;
|
||||
$hasSgIdade = true;
|
||||
$hasSgPercepcaoSaude = false;
|
||||
$hasSgAvdInstrumental = false;
|
||||
$hasSgAvdBasica = false;
|
||||
$hasSgCognicao = false;
|
||||
$hasSgHumor = false;
|
||||
$hasSgAlcancePreensaoPinca = false;
|
||||
$hasSgCapAerobicaMuscular = false;
|
||||
$hasSgMarcha = false;
|
||||
$hasSgContinencia = false;
|
||||
$hasSgVisao = false;
|
||||
$hasSgAudicao = false;
|
||||
$hasSgComorbidade = false;
|
||||
$dataResultado = strtotime($atendimentoDomiciliarAtendimentoIvcf->updated_at) * 1000;
|
||||
|
||||
if ($pacienteIdade >= 75 && $pacienteIdade <= 84) {
|
||||
$resultado += 1;
|
||||
}
|
||||
else if ($pacienteIdade >= 85) {
|
||||
$resultado += 3;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->estado_saude_geral === 'regular_ou_ruim') {
|
||||
$resultado += 1;
|
||||
$hasSgPercepcaoSaude = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->limitacao_compras || $atendimentoDomiciliarAtendimentoIvcf->limitacao_gestao_financeira || $atendimentoDomiciliarAtendimentoIvcf->limitacao_tarefas_domesticas) {
|
||||
$resultado += 4;
|
||||
$hasSgAvdInstrumental = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->banho_independencia) {
|
||||
$resultado += 6;
|
||||
$hasSgAvdBasica = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->relato_esquecimento_por_terceiros) {
|
||||
$resultado += 1;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->esquecimento_piorando) {
|
||||
$resultado += 1;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->esquecimento_impacta_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->humor_tristeza_desanimo) {
|
||||
$resultado += 2;
|
||||
$hasSgHumor = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->perda_interesse_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgHumor = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->limitacao_elevar_bracos) {
|
||||
$resultado += 1;
|
||||
$hasSgAlcancePreensaoPinca = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->limitacao_motricidade_fina) {
|
||||
$resultado += 1;
|
||||
$hasSgAlcancePreensaoPinca = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->perda_peso_nao_intencional || $atendimentoDomiciliarAtendimentoIvcf->imc_abaixo_22 || $atendimentoDomiciliarAtendimentoIvcf->panturrilha_abaixo_31 || $atendimentoDomiciliarAtendimentoIvcf->marcha_lenta_4m_maior_5s) {
|
||||
$resultado += 2;
|
||||
$hasSgCapAerobicaMuscular = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->dificuldade_caminhar_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgMarcha = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->quedas_recorrentes) {
|
||||
$resultado += 2;
|
||||
$hasSgMarcha = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->incontinencia) {
|
||||
$resultado += 2;
|
||||
$hasSgContinencia = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->problema_visao_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgVisao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->problema_audicao_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgAudicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoDomiciliarAtendimentoIvcf->doencas_cronicas_multiplas || $atendimentoDomiciliarAtendimentoIvcf->polifarmacia_5_ou_mais_medicamentos || $atendimentoDomiciliarAtendimentoIvcf->internacao_ultimos_6_meses) {
|
||||
$resultado += 4;
|
||||
$hasSgComorbidade = true;
|
||||
}
|
||||
|
||||
$ivcf = $dom->createElement('ivcf');
|
||||
$atendimentosDomiciliares->appendChild($ivcf);
|
||||
|
||||
$ivcf->appendChild($dom->createElement('resultado', $resultado));
|
||||
$ivcf->appendChild($dom->createElement('hasSgIdade', $hasSgIdade ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgPercepcaoSaude', $hasSgPercepcaoSaude ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAvdInstrumental', $hasSgAvdInstrumental ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAvdBasica', $hasSgAvdBasica ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgCognicao', $hasSgCognicao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgHumor', $hasSgHumor ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAlcancePreensaoPinca', $hasSgAlcancePreensaoPinca ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgCapAerobicaMuscular', $hasSgCapAerobicaMuscular ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgMarcha', $hasSgMarcha ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgContinencia', $hasSgContinencia ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgVisao', $hasSgVisao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAudicao', $hasSgAudicao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgComorbidade', $hasSgComorbidade ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('dataResultado', $dataResultado));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,920 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\Ambulatorio\SituacaoCodigoEsus;
|
||||
use App\Enums\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
|
||||
use App\Enums\AtencaoBasica\AtendimentoIndividual\Conduta as AtendimentoIndividualConduta;
|
||||
use App\Enums\AtencaoBasica\AtendimentoIndividual\DoencaTransmissivel;
|
||||
use App\Enums\AtencaoBasica\AtendimentoIndividual\Rastreamento;
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Enums\Geral\CiapCondicaoAvaliada;
|
||||
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividual;
|
||||
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividualIvcf;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\Geral\Ciap;
|
||||
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 FichaAtendimentoIndividualService extends Service
|
||||
{
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasProfissional($mes_ano) as $fichaProfissional) {
|
||||
|
||||
$iteracoes = self::getIteracoesCount($fichaProfissional);
|
||||
|
||||
for ($i = 0; $i < $iteracoes; $i++) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaProfissional, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'AI_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasProfissional($mesAnoInicial, false) as $fichaProfissional) {
|
||||
|
||||
$iteracoes = self::getIteracoesCount($fichaProfissional);
|
||||
|
||||
for ($i = 0; $i < $iteracoes; $i++) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaProfissional);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaProfissional->data_usuario_responsavel,
|
||||
'usuario_id' => $fichaProfissional->usuario->id,
|
||||
'ocupacao_id' => $fichaProfissional->ocupacao->id,
|
||||
'equipe_id' => $fichaProfissional->equipe->id,
|
||||
'atendimentos_individuais' => $dadosExportacao['atendimentos_individuais'],
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'AI_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasProfissional($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return AtendimentoIndividual::whereNull('exportacao_id')
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->groupBy([
|
||||
'usuario_id',
|
||||
'equipe_id',
|
||||
'usuario_ocupacao_id',
|
||||
'data_usuario_responsavel'
|
||||
])
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getIteracoesCount($fichaProfissional)
|
||||
{
|
||||
$count = AtendimentoIndividual::where('data_usuario_responsavel', $fichaProfissional->data_usuario_responsavel)
|
||||
->where('usuario_id', $fichaProfissional->usuario_id)
|
||||
->where('equipe_id', $fichaProfissional->equipe_id)
|
||||
->where('usuario_ocupacao_id', $fichaProfissional->usuario_ocupacao_id)
|
||||
->whereNull('exportacao_id')
|
||||
->count();
|
||||
|
||||
return ceil($count / 99);
|
||||
}
|
||||
|
||||
public static function getDadosExportacao($fichaProfissional, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$atendimentosIndividuaisPosicoes = collect();
|
||||
|
||||
$uuid = ExportacaoService::getUuid($fichaProfissional->equipe->unidade->cnes);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$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/fichaatendimentoindividualmaster');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::ATENDIMENTO_INDIVIDUAL));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaProfissional->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaProfissional->equipe->unidade->cnes));
|
||||
|
||||
if($fichaProfissional->equipe->area->numero_ine){
|
||||
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaProfissional->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaAtendimentoIndividualMasterTransport = $dom->createElement('ns4:fichaAtendimentoIndividualMasterTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaAtendimentoIndividualMasterTransport);
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaAtendimentoIndividualMasterTransport->appendChild($headerTransport);
|
||||
|
||||
$lotacaoFormPrincipal = $dom->createElement('lotacaoFormPrincipal');
|
||||
$headerTransport->appendChild($lotacaoFormPrincipal);
|
||||
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('profissionalCNS', $fichaProfissional->usuario->cidadao->cns ?? ''));
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('cboCodigo_2002', $fichaProfissional->ocupacao->codigo ));
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('cnes', $fichaProfissional->equipe->unidade->cnes));
|
||||
|
||||
if($fichaProfissional->equipe->area->numero_ine){
|
||||
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('ine', $fichaProfissional->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
if($fichaProfissional->usuario_auxiliar_id){
|
||||
|
||||
$lotacaoFormAtendimentoCompartilhado = $dom->createElement('lotacaoFormAtendimentoCompartilhado');
|
||||
$headerTransport->appendChild($lotacaoFormAtendimentoCompartilhado);
|
||||
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('profissionalCNS', $fichaProfissional->usuarioAuxiliar->cidadao->cns ?? ''));
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('cboCodigo_2002', $fichaProfissional->usuarioAuxiliarOcupacao->codigo ?? ''));
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('cnes', $fichaProfissional->usuarioAuxiliarEquipe->unidade->cnes));
|
||||
|
||||
if($fichaProfissional->usuarioAuxiliarEquipe->area->numero_ine){
|
||||
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('ine', $fichaProfissional->usuarioAuxiliarEquipe->area->numero_ine));
|
||||
}
|
||||
}
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaProfissional->data_usuario_responsavel) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaProfissional->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
$fichasAtendimentoIndividual = AtendimentoIndividual::where('data_usuario_responsavel', $fichaProfissional->data_usuario_responsavel)
|
||||
->where('usuario_id', $fichaProfissional->usuario_id)
|
||||
->where('equipe_id', $fichaProfissional->equipe_id)
|
||||
->where('usuario_ocupacao_id', $fichaProfissional->usuario_ocupacao_id)
|
||||
->whereNull('exportacao_id')
|
||||
->take(99)
|
||||
->get();
|
||||
|
||||
foreach ($fichasAtendimentoIndividual as $i => $fichaAtendimentoIndividual) {
|
||||
|
||||
if(!$fichaAtendimentoIndividual->paciente){
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$atendimentosIndividuaisPosicoes->push([
|
||||
'posicao' => $i + 1,
|
||||
'id' => $fichaAtendimentoIndividual->id,
|
||||
]);
|
||||
|
||||
$atendimentosIndividuais = $dom->createElement('atendimentosIndividuais');
|
||||
$fichaAtendimentoIndividualMasterTransport->appendChild($atendimentosIndividuais);
|
||||
|
||||
if($fichaAtendimentoIndividual->paciente->prontuario){
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('numeroProntuario', $fichaAtendimentoIndividual->paciente->prontuario));
|
||||
}
|
||||
|
||||
if (Cns::isValid($fichaAtendimentoIndividual->paciente->cidadao->cns)) {
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('cnsCidadao', $fichaAtendimentoIndividual->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($fichaAtendimentoIndividual->paciente->cidadao->cns)) {
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('cpfCidadao', $fichaAtendimentoIndividual->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('dataNascimento', strtotime($fichaAtendimentoIndividual->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('localDeAtendimento', $fichaAtendimentoIndividual->local_atendimento_id));
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('sexo', self::sexo($fichaAtendimentoIndividual->paciente->cidadao->sexo->id)));
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('turno', $fichaAtendimentoIndividual->turno_id));
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('tipoAtendimento', $fichaAtendimentoIndividual->tipoAtendimento->codigo_esus));
|
||||
|
||||
self::getMedicoes($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
|
||||
|
||||
if($fichaAtendimentoIndividual->aleitamento_materno_id){
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('aleitamentoMaterno', $fichaAtendimentoIndividual->aleitamentoMaterno->codigo_esus));
|
||||
}
|
||||
|
||||
if($fichaAtendimentoIndividual->paciente && $fichaAtendimentoIndividual->paciente->cidadao->sexo->id === Sexo::FEMININO){
|
||||
|
||||
if($fichaAtendimentoIndividual->data_ultima_menstruacao){
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('dumDaGestante', strtotime($fichaAtendimentoIndividual->data_ultima_menstruacao) * 1000));
|
||||
}
|
||||
|
||||
if($fichaAtendimentoIndividual->idade_gestacional_semanas){
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('idadeGestacional', $fichaAtendimentoIndividual->idade_gestacional_semanas));
|
||||
}
|
||||
}
|
||||
|
||||
if($fichaAtendimentoIndividual->modalidade_atencao_domiciliar_id){
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('atencaoDomiciliarModalidade', $fichaAtendimentoIndividual->modalidadeAtencaoDomiciliar->codigo_esus));
|
||||
}
|
||||
|
||||
self::getExame($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
|
||||
|
||||
if($fichaAtendimentoIndividual->vacinacao){
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('vacinaEmDia', $fichaAtendimentoIndividual->vacinacao ? 'true' : 'false'));
|
||||
}
|
||||
|
||||
if($fichaAtendimentoIndividual->observacao){
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('ficouEmObservacao', $fichaAtendimentoIndividual->observacao ? 'true' : 'false'));
|
||||
}
|
||||
|
||||
self::getEmultis($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
|
||||
self::getConduta($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
|
||||
|
||||
if($fichaAtendimentoIndividual->paciente && $fichaAtendimentoIndividual->paciente->cidadao->sexo->id === Sexo::FEMININO){
|
||||
|
||||
if($fichaAtendimentoIndividual->gravidez_planejada){
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('stGravidezPlanejada', $fichaAtendimentoIndividual->gravidez_planejada ? 'true' : 'false'));
|
||||
}
|
||||
|
||||
if($fichaAtendimentoIndividual->gestacao_previa){
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('nuGestasPrevias', $fichaAtendimentoIndividual->gestacao_previa));
|
||||
}
|
||||
|
||||
if($fichaAtendimentoIndividual->parto){
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('nuPartos', $fichaAtendimentoIndividual->parto));
|
||||
}
|
||||
}
|
||||
|
||||
if($fichaAtendimentoIndividual->racionalidade_saude_id){
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('racionalidadeSaude', $fichaAtendimentoIndividual->racionalidadeSaude->codigo_esus));
|
||||
}
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('dataHoraInicialAtendimento', strtotime($fichaAtendimentoIndividual->created_at) * 1000));
|
||||
$timestamp = strtotime($fichaAtendimentoIndividual->created_at);
|
||||
$timestamp += 5 * 60;
|
||||
$timestampMillis = $timestamp * 1000;
|
||||
$dataHoraFinalAtendimento = $dom->createElement('dataHoraFinalAtendimento', $timestampMillis);
|
||||
$atendimentosIndividuais->appendChild($dataHoraFinalAtendimento);
|
||||
|
||||
self::getCondicaoAvaliada($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
|
||||
self::getSolicitacoesOci($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
|
||||
self::getIvcf($dom, $fichaAtendimentoIndividual, $atendimentosIndividuais);
|
||||
|
||||
$fichaAtendimentoIndividual->uuid_ficha = $uuid;
|
||||
$fichaAtendimentoIndividual->exportacao_id = $exportacao->id;
|
||||
$fichaAtendimentoIndividual->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaAtendimentoIndividual->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
|
||||
retry(3, function() use ($fichaAtendimentoIndividual) {
|
||||
$fichaAtendimentoIndividual->save();
|
||||
}, 200);
|
||||
}
|
||||
|
||||
$fichaAtendimentoIndividualMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
$fichaAtendimentoIndividualMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
'atendimentos_individuais' => $atendimentosIndividuaisPosicoes,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getMedicoes(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais){
|
||||
|
||||
$medicoesNecessarias = [
|
||||
'circunferencia_abdominal',
|
||||
'perimetro_panturrilha',
|
||||
'pressao_arterial',
|
||||
'frequencia_respiratoria',
|
||||
'frequencia_cardiaca',
|
||||
'temperatura',
|
||||
'saturacao_o2',
|
||||
'glicemia',
|
||||
'momento_coleta_id',
|
||||
'peso',
|
||||
'altura',
|
||||
'perimetro_cefalico'
|
||||
];
|
||||
|
||||
$existeMedicao = false;
|
||||
foreach ($medicoesNecessarias as $campo) {
|
||||
if (!empty($fichaAtendimentoIndividual->$campo)) {
|
||||
$existeMedicao = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($existeMedicao) {
|
||||
$medicoes = $dom->createElement('medicoes');
|
||||
$atendimentosIndividuais->appendChild($medicoes);
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->circunferencia_abdominal)) {
|
||||
$medicoes->appendChild($dom->createElement('circunferenciaAbdominal', $fichaAtendimentoIndividual->circunferencia_abdominal));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->perimetro_panturrilha)) {
|
||||
$medicoes->appendChild($dom->createElement('perimetroPanturrilha', $fichaAtendimentoIndividual->perimetro_panturrilha));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->pressao_arterial)) {
|
||||
$pressao = explode('/', $fichaAtendimentoIndividual->pressao_arterial);
|
||||
|
||||
if (count($pressao) === 2) {
|
||||
$medicoes->appendChild($dom->createElement('pressaoArterialSistolica', $pressao[0]));
|
||||
$medicoes->appendChild($dom->createElement('pressaoArterialDiastolica', $pressao[1]));
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->frequencia_respiratoria)) {
|
||||
$medicoes->appendChild($dom->createElement('frequenciaRespiratoria', $fichaAtendimentoIndividual->frequencia_respiratoria));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->frequencia_cardiaca)) {
|
||||
$medicoes->appendChild($dom->createElement('frequenciaCardiaca', $fichaAtendimentoIndividual->frequencia_cardiaca));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->temperatura)) {
|
||||
$medicoes->appendChild($dom->createElement('temperatura', $fichaAtendimentoIndividual->temperatura));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->saturacao_o2)) {
|
||||
$medicoes->appendChild($dom->createElement('saturacaoO2', $fichaAtendimentoIndividual->saturacao_o2));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->glicemia)) {
|
||||
$medicoes->appendChild($dom->createElement('glicemiaCapilar', $fichaAtendimentoIndividual->glicemia));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->momento_coleta_id)) {
|
||||
$medicoes->appendChild($dom->createElement('tipoGlicemiaCapilar', $fichaAtendimentoIndividual->momentoColeta->codigo_esus));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->peso)) {
|
||||
$medicoes->appendChild($dom->createElement('peso', $fichaAtendimentoIndividual->peso));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->altura)) {
|
||||
$medicoes->appendChild($dom->createElement('altura', $fichaAtendimentoIndividual->altura));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->perimetro_cefalico)) {
|
||||
$medicoes->appendChild($dom->createElement('perimetroCefalico', $fichaAtendimentoIndividual->perimetro_cefalico));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static function getCondicaoAvaliada(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais){
|
||||
|
||||
$atendimentosCondicaoAvaliada = DB::table('atencao_basica_atendimento_individual_condicao_avaliada')
|
||||
->select([
|
||||
'atencao_basica_cadastro_condicao_avaliada.id',
|
||||
'atencao_basica_cadastro_condicao_avaliada.codigo_esus',
|
||||
'atencao_basica_cadastro_condicao_avaliada.ativo',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_condicao_avaliada',
|
||||
'atencao_basica_cadastro_condicao_avaliada.id',
|
||||
'atencao_basica_atendimento_individual_condicao_avaliada.condicao_avaliada_id'
|
||||
)
|
||||
->where('atencao_basica_atendimento_individual_condicao_avaliada.atendimento_individual_id', $fichaAtendimentoIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosCondicaoAvaliada as $condicaoAvaliada) {
|
||||
|
||||
if ($condicaoAvaliada->ativo === 1) {
|
||||
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosIndividuais->appendChild($problemaCondicaoAvaliada);
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $condicaoAvaliada->codigo_esus));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
else {
|
||||
|
||||
$ciap = Ciap::where('id', self::getCiapFromCondicaoAvaliada($condicaoAvaliada->id))->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosIndividuais->appendChild($problemaCondicaoAvaliada);
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$atendimentosDoencaTransmissivel = DB::table('atencao_basica_atendimento_individual_doenca_transmissivel')
|
||||
->select([
|
||||
'atencao_basica_cadastro_doenca_transmissivel.id',
|
||||
'atencao_basica_cadastro_doenca_transmissivel.codigo_esus',
|
||||
'atencao_basica_cadastro_doenca_transmissivel.ativo',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_doenca_transmissivel',
|
||||
'atencao_basica_cadastro_doenca_transmissivel.id',
|
||||
'atencao_basica_atendimento_individual_doenca_transmissivel.doenca_transmissivel_id'
|
||||
)
|
||||
->where('atencao_basica_atendimento_individual_doenca_transmissivel.atendimento_individual_id', $fichaAtendimentoIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosDoencaTransmissivel as $doencaTransmisivel) {
|
||||
|
||||
if ($doencaTransmisivel->ativo === 1) {
|
||||
|
||||
$problemaDoencaTransmisivel = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosIndividuais->appendChild($problemaDoencaTransmisivel);
|
||||
$problemaDoencaTransmisivel->appendChild($dom->createElement('ciap', $doencaTransmisivel->codigo_esus));
|
||||
$problemaDoencaTransmisivel->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
else {
|
||||
|
||||
$ciap = Ciap::where('id', self::getCiapFromDoencaTransmissivel($doencaTransmisivel->id))->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
|
||||
$problemaDoencaTransmisivel = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosIndividuais->appendChild($problemaDoencaTransmisivel);
|
||||
$problemaDoencaTransmisivel->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$problemaDoencaTransmisivel->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$atendimentosRastreamentos = DB::table('atencao_basica_atendimento_individual_rastreamento')
|
||||
->select([
|
||||
'atencao_basica_cadastro_rastreamento.id',
|
||||
'atencao_basica_cadastro_rastreamento.codigo_esus',
|
||||
'atencao_basica_cadastro_rastreamento.ativo',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_rastreamento',
|
||||
'atencao_basica_cadastro_rastreamento.id',
|
||||
'atencao_basica_atendimento_individual_rastreamento.rastreamento_id'
|
||||
)
|
||||
->where('atencao_basica_atendimento_individual_rastreamento.atendimento_individual_id', $fichaAtendimentoIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosRastreamentos as $rastreamento) {
|
||||
|
||||
if ($rastreamento->ativo === 1) {
|
||||
|
||||
$problemaRastreamento = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosIndividuais->appendChild($problemaRastreamento);
|
||||
$problemaRastreamento->appendChild($dom->createElement('ciap', $rastreamento->codigo_esus));
|
||||
$problemaRastreamento->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
else {
|
||||
|
||||
$ciap = Ciap::where('id', self::getCiapFromRastreamento($rastreamento->id))->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
|
||||
$problemaRastreamento = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosIndividuais->appendChild($problemaRastreamento);
|
||||
$problemaRastreamento->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$problemaRastreamento->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DB::table('atencao_basica_atendimento_individual_problema_condicao')
|
||||
->select([
|
||||
DB::raw('COALESCE(uuid_inicial_problema_condicao, uuid_evolucao) AS uuid_inicial_problema_condicao'),
|
||||
'uuid_evolucao',
|
||||
'sequencial_evolucao',
|
||||
'geral_ciap.codigo AS ciap_codigo',
|
||||
'cid.codigo AS cid_codigo',
|
||||
'ambulatorio_problema_condicao_situacao.codigo_esus AS situacao_codigo',
|
||||
'inicio',
|
||||
'fim',
|
||||
])
|
||||
->leftJoin('ambulatorio_problema_condicao_situacao', 'ambulatorio_problema_condicao_situacao.id', 'atencao_basica_atendimento_individual_problema_condicao.situacao_id')
|
||||
->leftJoin('geral_ciap', 'geral_ciap.id', 'atencao_basica_atendimento_individual_problema_condicao.ciap_id')
|
||||
->leftJoin('sigtap.cid', 'cid.id', 'atencao_basica_atendimento_individual_problema_condicao.cid_id')
|
||||
->where('atendimento_individual_id', $fichaAtendimentoIndividual->id)
|
||||
->get()
|
||||
->each(function ($problemaCondicao) use ($dom, &$atendimentosIndividuais) {
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosIndividuais->appendChild($problemaCondicaoAvaliada);
|
||||
|
||||
if (!is_null($problemaCondicao->situacao_codigo)) {
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('uuidProblema', $problemaCondicao->uuid_inicial_problema_condicao));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('uuidEvolucaoProblema', $problemaCondicao->uuid_evolucao));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('coSequencialEvolucao', $problemaCondicao->sequencial_evolucao));
|
||||
}
|
||||
|
||||
if (!is_null($problemaCondicao->ciap_codigo)) {
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $problemaCondicao->ciap_codigo));
|
||||
}
|
||||
|
||||
if (!is_null($problemaCondicao->cid_codigo)) {
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('cid10', $problemaCondicao->cid_codigo));
|
||||
}
|
||||
|
||||
if (!is_null($problemaCondicao->situacao_codigo)) {
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('situacao', $problemaCondicao->situacao_codigo));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('dataInicioProblema', strtotime($problemaCondicao->inicio) * 1000));
|
||||
|
||||
if ($problemaCondicao->situacao_codigo === SituacaoCodigoEsus::LATENTE || $problemaCondicao->situacao_codigo === SituacaoCodigoEsus::RESOLVIDO) {
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('dataFimProblema', strtotime($problemaCondicao->fim) * 1000));
|
||||
}
|
||||
}
|
||||
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
});
|
||||
}
|
||||
|
||||
private static function getCiapFromCondicaoAvaliada($condicaoAvaliada)
|
||||
{
|
||||
$map = [
|
||||
CondicaoAvaliada::ASMA => CiapCondicaoAvaliada::ASMA,
|
||||
CondicaoAvaliada::DESNUTRICAO => CiapCondicaoAvaliada::DESNUTRICAO,
|
||||
CondicaoAvaliada::DIABETES => CiapCondicaoAvaliada::DIABETES,
|
||||
CondicaoAvaliada::DPOC => CiapCondicaoAvaliada::DPOC,
|
||||
CondicaoAvaliada::HIPERTENSAO_ARTERIAL => CiapCondicaoAvaliada::HIPERTENSAO_ARTERIAL,
|
||||
CondicaoAvaliada::OBESIDADE => CiapCondicaoAvaliada::OBESIDADE,
|
||||
CondicaoAvaliada::PRE_NATAL => CiapCondicaoAvaliada::PRE_NATAL,
|
||||
CondicaoAvaliada::PUERICULTURA => CiapCondicaoAvaliada::PUERICULTURA,
|
||||
CondicaoAvaliada::PUERPERIO_ATE_42_DIAS => CiapCondicaoAvaliada::PUERPERIO,
|
||||
CondicaoAvaliada::REABILITACAO => CiapCondicaoAvaliada::REABILITACAO,
|
||||
CondicaoAvaliada::TABAGISMO => CiapCondicaoAvaliada::TABAGISMO,
|
||||
CondicaoAvaliada::USUARIO_DE_ALCOOL => CiapCondicaoAvaliada::USUARIO_DE_ALCOOL,
|
||||
CondicaoAvaliada::USUARIO_DE_OUTRAS_DROGAS => CiapCondicaoAvaliada::USUARIO_DE_OUTRAS_DROGAS,
|
||||
];
|
||||
|
||||
return $map[$condicaoAvaliada] ?? null;
|
||||
}
|
||||
|
||||
private static function getCiapFromDoencaTransmissivel($doencaTransmissivel)
|
||||
{
|
||||
$map = [
|
||||
DoencaTransmissivel::DENGUE => CiapCondicaoAvaliada::DENGUE,
|
||||
DoencaTransmissivel::DST => CiapCondicaoAvaliada::DST,
|
||||
DoencaTransmissivel::HANSENIASE => CiapCondicaoAvaliada::HANSENIASE,
|
||||
DoencaTransmissivel::TUBERCULOSE => CiapCondicaoAvaliada::TUBERCULOSE,
|
||||
];
|
||||
|
||||
return $map[$doencaTransmissivel] ?? null;
|
||||
}
|
||||
|
||||
private static function getCiapFromRastreamento($rastreamento)
|
||||
{
|
||||
$map = [
|
||||
Rastreamento::RISCO_CARDIOVASCULAR => CiapCondicaoAvaliada::RASTREAMENTO_DE_RISCO_CARDIOVASCULAR,
|
||||
];
|
||||
|
||||
return $map[$rastreamento] ?? null;
|
||||
}
|
||||
|
||||
private static function getSolicitacoesOci(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais)
|
||||
{
|
||||
$atendimentoIndividualProcedimentos = DB::table('atencao_basica_procedimento_atendimento_procedimento')
|
||||
->select(['procedimento.codigo'])
|
||||
->join('sigtap.procedimento', 'procedimento.id', 'atencao_basica_procedimento_atendimento_procedimento.procedimento_id')
|
||||
->join('atencao_basica_procedimento_atendimento', 'atencao_basica_procedimento_atendimento.id', 'atencao_basica_procedimento_atendimento_procedimento.procedimento_atendimento_id')
|
||||
->where('atencao_basica_procedimento_atendimento.atendimento_individual_id', $fichaAtendimentoIndividual->id)
|
||||
->where('procedimento.codigo', 'LIKE', '09%')
|
||||
->get();
|
||||
|
||||
foreach ($atendimentoIndividualProcedimentos as $procedimento) {
|
||||
$solicitacoesOci = $dom->createElement('solicitacoesOci');
|
||||
$atendimentosIndividuais->appendChild($solicitacoesOci);
|
||||
$solicitacoesOci->appendChild($dom->createElement('codigoSigtap', $procedimento->codigo));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getOutroCiap($ciap_primario_id){
|
||||
|
||||
$ciap_primario_id = DB::table('geral_ciap')
|
||||
->select(
|
||||
'geral_ciap.codigo',
|
||||
)
|
||||
->where('geral_ciap.id', $ciap_primario_id)
|
||||
->first();
|
||||
|
||||
return $ciap_primario_id->codigo;
|
||||
}
|
||||
|
||||
private static function getExame(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais){
|
||||
|
||||
$atendimentosExame = DB::table('atencao_basica_atendimento_individual_exame_solicitado_avaliado')
|
||||
->select([
|
||||
'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_esus',
|
||||
'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_procedimento',
|
||||
'atencao_basica_atendimento_individual_exame_solicitado_avaliado.solicitado',
|
||||
'atencao_basica_atendimento_individual_exame_solicitado_avaliado.avaliado',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_exame_solicitado_avaliado',
|
||||
'atencao_basica_cadastro_exame_solicitado_avaliado.id',
|
||||
'atencao_basica_atendimento_individual_exame_solicitado_avaliado.exame_solicitado_avaliado_id'
|
||||
)
|
||||
->where('atencao_basica_atendimento_individual_exame_solicitado_avaliado.atendimento_individual_id', $fichaAtendimentoIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosExame as $examesSolicitadosAvaliados) {
|
||||
|
||||
if($examesSolicitadosAvaliados->codigo_esus){
|
||||
$codigoExameSolicitado = $examesSolicitadosAvaliados->codigo_esus;
|
||||
}else{
|
||||
$codigoExameSolicitado = $examesSolicitadosAvaliados->codigo_procedimento;
|
||||
}
|
||||
|
||||
if($codigoExameSolicitado){
|
||||
|
||||
$exame = $dom->createElement('exame');
|
||||
$atendimentosIndividuais->appendChild($exame);
|
||||
|
||||
$exame->appendChild($dom->createElement('codigoExame', $codigoExameSolicitado));
|
||||
|
||||
if($examesSolicitadosAvaliados->avaliado === 1){
|
||||
|
||||
$exame->appendChild($dom->createElement('solicitadoAvaliado', "A"));
|
||||
}
|
||||
if($examesSolicitadosAvaliados->solicitado === 1){
|
||||
|
||||
$exame->appendChild($dom->createElement('solicitadoAvaliado', "S"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$codigoProcedimento = $atendimentosExame->pluck('codigo_procedimento')->toArray();
|
||||
|
||||
$atendimentosOutrosExame = DB::table('atencao_basica_atendimento_individual_outro_exame')
|
||||
->select([
|
||||
'parametrizacao_exame.codigo',
|
||||
'atencao_basica_atendimento_individual_outro_exame.solicitado',
|
||||
'atencao_basica_atendimento_individual_outro_exame.avaliado',
|
||||
])
|
||||
->join('parametrizacao_exame', 'parametrizacao_exame.id', 'atencao_basica_atendimento_individual_outro_exame.exame_id')
|
||||
->where('atencao_basica_atendimento_individual_outro_exame.atendimento_individual_id', $fichaAtendimentoIndividual->id)
|
||||
->whereNotIn('parametrizacao_exame.codigo', $codigoProcedimento)
|
||||
->distinct()
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosOutrosExame as $outrosExamesSolicitadosAvaliados) {
|
||||
|
||||
if($outrosExamesSolicitadosAvaliados->codigo){
|
||||
|
||||
$exame = $dom->createElement('exame');
|
||||
$atendimentosIndividuais->appendChild($exame);
|
||||
$exame->appendChild($dom->createElement('codigoExame', $outrosExamesSolicitadosAvaliados->codigo));
|
||||
|
||||
if($outrosExamesSolicitadosAvaliados->avaliado){
|
||||
|
||||
$exame->appendChild($dom->createElement('solicitadoAvaliado', "A"));
|
||||
}
|
||||
|
||||
if($outrosExamesSolicitadosAvaliados->solicitado){
|
||||
|
||||
$exame->appendChild($dom->createElement('solicitadoAvaliado', "S"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static function getConduta(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais){
|
||||
|
||||
$atendimentosConduta = DB::table('atencao_basica_atendimento_individual_conduta')
|
||||
->select([
|
||||
'atencao_basica_cadastro_conduta.codigo_esus',
|
||||
])
|
||||
->join('atencao_basica_cadastro_conduta', 'atencao_basica_cadastro_conduta.id', 'atencao_basica_atendimento_individual_conduta.conduta_id')
|
||||
->where('atencao_basica_atendimento_individual_conduta.atendimento_individual_id', $fichaAtendimentoIndividual->id)
|
||||
->whereNotIn('atencao_basica_cadastro_conduta.id', [
|
||||
AtendimentoIndividualConduta::AGENDAMENTO_PARA_NASF,
|
||||
AtendimentoIndividualConduta::TRATAMENTO_CONCLUIDO,
|
||||
])
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosConduta as $conduta) {
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('condutas', $conduta->codigo_esus));
|
||||
}
|
||||
|
||||
$atendimentosEcaminhamento = DB::table('atencao_basica_atendimento_individual_encaminhamento')
|
||||
->select([
|
||||
'atencao_basica_cadastro_encaminhamento.codigo_esus',
|
||||
])
|
||||
->join('atencao_basica_cadastro_encaminhamento', 'atencao_basica_cadastro_encaminhamento.id', 'atencao_basica_atendimento_individual_encaminhamento.encaminhamento_id')
|
||||
->where('atencao_basica_atendimento_individual_encaminhamento.atendimento_individual_id', $fichaAtendimentoIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosEcaminhamento as $encaminhamento) {
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('condutas', $encaminhamento->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getEmultis(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais){
|
||||
|
||||
$atendimentosEmultis = DB::table('atencao_basica_atendimento_individual_nasf')
|
||||
->select([
|
||||
'atencao_basica_cadastro_nasf.codigo_esus',
|
||||
])
|
||||
->join('atencao_basica_cadastro_nasf', 'atencao_basica_cadastro_nasf.id', 'atencao_basica_atendimento_individual_nasf.nasf_id')
|
||||
->where('atencao_basica_atendimento_individual_nasf.atendimento_individual_id', $fichaAtendimentoIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosEmultis as $emulti) {
|
||||
|
||||
$atendimentosIndividuais->appendChild($dom->createElement('emultis', $emulti->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
private static function getIvcf(&$dom, $fichaAtendimentoIndividual, &$atendimentosIndividuais)
|
||||
{
|
||||
$atendimentoIndividualIvcf = AtendimentoIndividualIvcf::where('atendimento_individual_id', $fichaAtendimentoIndividual->id)->first();
|
||||
|
||||
if ($atendimentoIndividualIvcf) {
|
||||
$pacienteIdade = $atendimentoIndividualIvcf->atendimentoIndividual->paciente->cidadao->idade['anos'] ?? null;
|
||||
|
||||
$resultado = null;
|
||||
$hasSgIdade = true;
|
||||
$hasSgPercepcaoSaude = false;
|
||||
$hasSgAvdInstrumental = false;
|
||||
$hasSgAvdBasica = false;
|
||||
$hasSgCognicao = false;
|
||||
$hasSgHumor = false;
|
||||
$hasSgAlcancePreensaoPinca = false;
|
||||
$hasSgCapAerobicaMuscular = false;
|
||||
$hasSgMarcha = false;
|
||||
$hasSgContinencia = false;
|
||||
$hasSgVisao = false;
|
||||
$hasSgAudicao = false;
|
||||
$hasSgComorbidade = false;
|
||||
$dataResultado = strtotime($atendimentoIndividualIvcf->updated_at) * 1000;
|
||||
|
||||
if ($pacienteIdade >= 75 && $pacienteIdade <= 84) {
|
||||
$resultado += 1;
|
||||
}
|
||||
else if ($pacienteIdade >= 85) {
|
||||
$resultado += 3;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->estado_saude_geral === 'regular_ou_ruim') {
|
||||
$resultado += 1;
|
||||
$hasSgPercepcaoSaude = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->limitacao_compras || $atendimentoIndividualIvcf->limitacao_gestao_financeira || $atendimentoIndividualIvcf->limitacao_tarefas_domesticas) {
|
||||
$resultado += 4;
|
||||
$hasSgAvdInstrumental = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->banho_independencia) {
|
||||
$resultado += 6;
|
||||
$hasSgAvdBasica = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->relato_esquecimento_por_terceiros) {
|
||||
$resultado += 1;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->esquecimento_piorando) {
|
||||
$resultado += 1;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->esquecimento_impacta_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->humor_tristeza_desanimo) {
|
||||
$resultado += 2;
|
||||
$hasSgHumor = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->perda_interesse_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgHumor = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->limitacao_elevar_bracos) {
|
||||
$resultado += 1;
|
||||
$hasSgAlcancePreensaoPinca = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->limitacao_motricidade_fina) {
|
||||
$resultado += 1;
|
||||
$hasSgAlcancePreensaoPinca = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->perda_peso_nao_intencional || $atendimentoIndividualIvcf->imc_abaixo_22 || $atendimentoIndividualIvcf->panturrilha_abaixo_31 || $atendimentoIndividualIvcf->marcha_lenta_4m_maior_5s) {
|
||||
$resultado += 2;
|
||||
$hasSgCapAerobicaMuscular = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->dificuldade_caminhar_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgMarcha = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->quedas_recorrentes) {
|
||||
$resultado += 2;
|
||||
$hasSgMarcha = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->incontinencia) {
|
||||
$resultado += 2;
|
||||
$hasSgContinencia = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->problema_visao_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgVisao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->problema_audicao_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgAudicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoIndividualIvcf->doencas_cronicas_multiplas || $atendimentoIndividualIvcf->polifarmacia_5_ou_mais_medicamentos || $atendimentoIndividualIvcf->internacao_ultimos_6_meses) {
|
||||
$resultado += 4;
|
||||
$hasSgComorbidade = true;
|
||||
}
|
||||
|
||||
$ivcf = $dom->createElement('ivcf');
|
||||
$atendimentosIndividuais->appendChild($ivcf);
|
||||
|
||||
$ivcf->appendChild($dom->createElement('resultado', $resultado));
|
||||
$ivcf->appendChild($dom->createElement('hasSgIdade', $hasSgIdade ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgPercepcaoSaude', $hasSgPercepcaoSaude ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAvdInstrumental', $hasSgAvdInstrumental ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAvdBasica', $hasSgAvdBasica ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgCognicao', $hasSgCognicao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgHumor', $hasSgHumor ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAlcancePreensaoPinca', $hasSgAlcancePreensaoPinca ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgCapAerobicaMuscular', $hasSgCapAerobicaMuscular ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgMarcha', $hasSgMarcha ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgContinencia', $hasSgContinencia ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgVisao', $hasSgVisao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAudicao', $hasSgAudicao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgComorbidade', $hasSgComorbidade ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('dataResultado', $dataResultado));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,919 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
|
||||
use App\Enums\AtencaoBasica\AtendimentoIndividual\DoencaTransmissivel;
|
||||
use App\Enums\AtencaoBasica\AtendimentoIndividual\Rastreamento;
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Enums\Geral\CiapCondicaoAvaliada;
|
||||
use App\Enums\Sigtap\Procedimento as ProcedimentoEnum;
|
||||
use App\Models\AtencaoBasica\AtendimentoOdontologico\AtendimentoOdontologico;
|
||||
use App\Models\AtencaoBasica\AtendimentoOdontologico\AtendimentoOdontologicoIvcf;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\Geral\Ciap;
|
||||
use App\Models\Sigtap\Cid;
|
||||
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 FichaAtendimentoOdontologicoService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasProfissional($mes_ano) as $fichaProfissional) {
|
||||
|
||||
$iteracoes = self::getIteracoesCount($fichaProfissional);
|
||||
|
||||
for ($i = 0; $i < $iteracoes; $i++) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaProfissional, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
if ($dadosExportacao === null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$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, 'AO_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasProfissional($mesAnoInicial, false) as $fichaProfissional) {
|
||||
|
||||
$iteracoes = self::getIteracoesCount($fichaProfissional);
|
||||
|
||||
for ($i = 0; $i < $iteracoes; $i++) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaProfissional);
|
||||
|
||||
if ($dadosExportacao === null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaProfissional->data_atendimento,
|
||||
'usuario_id' => $fichaProfissional->usuario->id,
|
||||
'ocupacao_id' => $fichaProfissional->ocupacao->id,
|
||||
'equipe_id' => $fichaProfissional->equipe->id,
|
||||
'atendimentos_odontologicos' => $dadosExportacao['atendimentos_odontologicos'],
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'AO_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasProfissional($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return AtendimentoOdontologico::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));
|
||||
});
|
||||
})
|
||||
)
|
||||
->groupBy([
|
||||
'usuario_id',
|
||||
'equipe_id',
|
||||
'ocupacao_id',
|
||||
'data_atendimento',
|
||||
])
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getIteracoesCount($fichaProfissional, $mes_ano = null)
|
||||
{
|
||||
$count = AtendimentoOdontologico::when($mes_ano, fn ($q) => $q
|
||||
->whereYear('data_atendimento', substr($mes_ano, 2))
|
||||
->whereMonth('data_atendimento', substr($mes_ano, 0, 2))
|
||||
)
|
||||
->where('usuario_id', $fichaProfissional->usuario_id)
|
||||
->where('equipe_id', $fichaProfissional->equipe_id)
|
||||
->where('ocupacao_id', $fichaProfissional->ocupacao_id)
|
||||
->whereNull('exportacao_id')
|
||||
->count();
|
||||
|
||||
return ceil($count / 99);
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaProfissional, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$atendimentosOdontologicosPosicoes = collect();
|
||||
|
||||
$uuid = ExportacaoService::getUuid($fichaProfissional->equipe->unidade->cnes);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$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/fichaatendimentoodontologicomaster');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::ATENDIMENTO_ODONTOLOGICO));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaProfissional->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaProfissional->equipe->unidade->cnes));
|
||||
|
||||
if($fichaProfissional->equipe->area->numero_ine){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaProfissional->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaAtendimentoOdontologicoMasterTransport = $dom->createElement('ns4:fichaAtendimentoOdontologicoMasterTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaAtendimentoOdontologicoMasterTransport);
|
||||
|
||||
$fichaAtendimentoOdontologicoMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
$fichaAtendimentoOdontologicoMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
|
||||
$fichasAtendimentoOdontologico = AtendimentoOdontologico::whereNull('exportacao_id')
|
||||
->where('usuario_id', $fichaProfissional->usuario_id)
|
||||
->where('equipe_id', $fichaProfissional->equipe_id)
|
||||
->where('ocupacao_id', $fichaProfissional->ocupacao_id)
|
||||
->where('data_atendimento', $fichaProfissional->data_atendimento)
|
||||
->take(99)
|
||||
->get();
|
||||
|
||||
if ($fichasAtendimentoOdontologico->isEmpty()) {
|
||||
$exportacao->delete();
|
||||
return null;
|
||||
}
|
||||
|
||||
foreach ($fichasAtendimentoOdontologico as $i => $fichaAtendimentoOdontologico) {
|
||||
|
||||
$atendimentosOdontologicosPosicoes->push([
|
||||
'posicao' => $i + 1,
|
||||
'id' => $fichaAtendimentoOdontologico->id,
|
||||
]);
|
||||
|
||||
$atendimentosOdontologicos = $dom->createElement('atendimentosOdontologicos');
|
||||
$fichaAtendimentoOdontologicoMasterTransport->appendChild($atendimentosOdontologicos);
|
||||
|
||||
if($fichaAtendimentoOdontologico->paciente->prontuario){
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('numProntuario', $fichaAtendimentoOdontologico->paciente->prontuario));
|
||||
}
|
||||
|
||||
if (Cns::isValid($fichaAtendimentoOdontologico->paciente->cidadao->cns)) {
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('cnsCidadao', $fichaAtendimentoOdontologico->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($fichaAtendimentoOdontologico->paciente->cidadao->cns)) {
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('cpfCidadao', $fichaAtendimentoOdontologico->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('dtNascimento', strtotime($fichaAtendimentoOdontologico->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('localAtendimento', $fichaAtendimentoOdontologico->local_atendimento_id));
|
||||
|
||||
if($fichaAtendimentoOdontologico->paciente->cidadao->sexo->id === Sexo::FEMININO){
|
||||
|
||||
if($fichaAtendimentoOdontologico->gestante){
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('gestante', $fichaAtendimentoOdontologico->gestante ? 'true' : 'false'));
|
||||
}
|
||||
}
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('necessidadesEspeciais', $fichaAtendimentoOdontologico->necessidades_especiais ? 'true' : 'false'));
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('tipoAtendimento', $fichaAtendimentoOdontologico->tipoAtendimento->codigo_esus));
|
||||
|
||||
if (count($fichaAtendimentoOdontologico->condutaEncaminhamento) > 0) {
|
||||
|
||||
foreach ($fichaAtendimentoOdontologico->condutaEncaminhamento as $condutaEncaminhamento) {
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('tiposEncamOdonto', $condutaEncaminhamento->conduta_encaminhamento_id));
|
||||
}
|
||||
}
|
||||
|
||||
if (count($fichaAtendimentoOdontologico->fornecimento) > 0) {
|
||||
|
||||
foreach ($fichaAtendimentoOdontologico->fornecimento as $fornecimento) {
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('tiposFornecimOdonto', $fornecimento->fornecimento_id));
|
||||
}
|
||||
}
|
||||
|
||||
if (count($fichaAtendimentoOdontologico->vigilancia) > 0) {
|
||||
|
||||
foreach ($fichaAtendimentoOdontologico->vigilancia as $vigilancia) {
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('tiposVigilanciaSaudeBucal', $vigilancia->vigilancia_bucal_id));
|
||||
}
|
||||
}
|
||||
|
||||
if ($fichaAtendimentoOdontologico->tipoConsulta) {
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('tiposConsultaOdonto', $fichaAtendimentoOdontologico->tipoConsulta->codigo_esus));
|
||||
}
|
||||
|
||||
$procedimentos = $fichaAtendimentoOdontologico->procedimento()
|
||||
->select('codigo_procedimento', 'quantidade')
|
||||
->where('codigo_procedimento', 'NOT LIKE', '09%')
|
||||
->get();
|
||||
|
||||
$procedimentosOci = $fichaAtendimentoOdontologico->procedimento()
|
||||
->select('codigo_procedimento')
|
||||
->where('codigo_procedimento', 'LIKE', '09%')
|
||||
->get();
|
||||
|
||||
if ($procedimentos->count() > 0) {
|
||||
$listaDeProcedimentosEsus = [
|
||||
ProcedimentoEnum::RADIOGRAFIA_OCLUSAL,
|
||||
ProcedimentoEnum::COLOCACAO_DE_PLACA_DE_MORDIDA,
|
||||
ProcedimentoEnum::MANUTENCAO_CONSERTO_DE_APARELHO_ORTODONTICO_ORTOPEDICO,
|
||||
ProcedimentoEnum::MOLDAGEM_DENTO_GENGIVAL_COM_FINALIDADE_ORTODONTICA,
|
||||
ProcedimentoEnum::EXERESE_DE_CISTO_ODONTOGENICO_E_NAO_ODONTOGENICO,
|
||||
ProcedimentoEnum::TRATAMENTO_CIRURGICO_DE_FISTULA_INTRA_EXTRAORAL,
|
||||
ProcedimentoEnum::CORRECAO_DE_BRIDAS_MUSCULARES,
|
||||
ProcedimentoEnum::CORRECAO_DE_IRREGULARIDADES_DE_REBORDO_ALVEOLAR,
|
||||
ProcedimentoEnum::REMOCAO_DE_TORUS_E_EXOSTOSES,
|
||||
ProcedimentoEnum::CONTENCAO_DE_DENTES_POR_SPLINTAGEM,
|
||||
ProcedimentoEnum::REDUCAO_DE_LUXACAO_TEMPORO_MANDIBULAR,
|
||||
ProcedimentoEnum::RETIRADA_DE_MATERIAL_DE_SINTESE_OSSEA_DENTARIA,
|
||||
ProcedimentoEnum::MANTENEDOR_DE_ESPACO,
|
||||
ProcedimentoEnum::PLACA_OCLUSAL,
|
||||
ProcedimentoEnum::PLANO_INCLINADO,
|
||||
ProcedimentoEnum::PROTESE_PARCIAL_MANDIBULAR_REMOVIVEL,
|
||||
ProcedimentoEnum::PROTESE_PARCIAL_MAXILAR_REMOVIVEL,
|
||||
ProcedimentoEnum::PROTESE_TEMPORARIA,
|
||||
ProcedimentoEnum::PROTESE_TOTAL_MANDIBULAR,
|
||||
ProcedimentoEnum::PROTESE_TOTAL_MAXILAR,
|
||||
ProcedimentoEnum::APARELHO_FIXO_BILATERAL_PARA_FECHAMENTO_DE_DIASTEMA,
|
||||
ProcedimentoEnum::APARELHO_ORTODONTICO_FIXO,
|
||||
ProcedimentoEnum::APARELHO_ORTOPEDICO_E_ORTODONTICO_REMOVIVEL,
|
||||
ProcedimentoEnum::APARELHO_ORTOPEDICO_FIXO,
|
||||
ProcedimentoEnum::APARELHO_P_BLOQUEIO_MAXILO_MANDIBULAR,
|
||||
ProcedimentoEnum::APLICACAO_DE_CARIOSTATICO_POR_DENTE,
|
||||
ProcedimentoEnum::APLICACAO_DE_SELANTE_POR_DENTE,
|
||||
ProcedimentoEnum::SELAMENTO_PROVISORIO_DE_CAVIDADE_DENTARIA,
|
||||
ProcedimentoEnum::RADIOGRAFIA_INTERPROXIMAL_BITE_WING,
|
||||
ProcedimentoEnum::RADIOGRAFIA_PERIAPICAL,
|
||||
ProcedimentoEnum::CAPEAMENTO_PULPAR,
|
||||
ProcedimentoEnum::RESTAURACAO_DE_DENTE_PERMANENTE_ANTERIOR_COM_RESINA_COMPOSTA,
|
||||
ProcedimentoEnum::TRATAMENTO_INICIAL_DO_DENTE_TRAUMATIZADO,
|
||||
ProcedimentoEnum::TRATAMENTO_RESTAURADOR_ATRAUMATICO_TRA_ART,
|
||||
ProcedimentoEnum::RESTAURACAO_DE_DENTE_DECIDUO_POSTERIOR_COM_RESINA_COMPOSTA,
|
||||
ProcedimentoEnum::RESTAURACAO_DE_DENTE_DECIDUO_POSTERIOR_COM_AMALGAMA,
|
||||
ProcedimentoEnum::RESTAURACAO_DE_DENTE_DECIDUO_POSTERIOR_COM_IONOMERO_DE_VIDRO,
|
||||
ProcedimentoEnum::RESTAURACAO_DE_DENTE_DECIDUO_ANTERIOR_COM_RESINA_COMPOSTA,
|
||||
ProcedimentoEnum::RESTAURACAO_DE_DENTE_PERMANENTE_POSTERIOR_COM_RESINA_COMPOSTA,
|
||||
ProcedimentoEnum::RESTAURACAO_DE_DENTE_PERMANENTE_POSTERIOR_COM_AMALGAMA,
|
||||
ProcedimentoEnum::ACESSO_A_POLPA_DENTARIA_E_MEDICACAO_POR_DENTE,
|
||||
ProcedimentoEnum::CURATIVO_DE_DEMORA_C_OU_S_PREPARO_BIOMECANICO,
|
||||
ProcedimentoEnum::TRATAMENTO_ENDODONTICO_DE_DENTE_DECIDUO,
|
||||
ProcedimentoEnum::TRATAMENTO_ENDODONTICO_DE_DENTE_PERMANENTE_BIRRADICULAR,
|
||||
ProcedimentoEnum::TRATAMENTO_ENDODONTICO_DE_DENTE_PERMANENTE_COM_TRES_OU_MAIS_RAIZES,
|
||||
ProcedimentoEnum::TRATAMENTO_ENDODONTICO_DE_DENTE_PERMANENTE_UNIRRADICULAR,
|
||||
ProcedimentoEnum::PULPOTOMIA_DENTARIA,
|
||||
ProcedimentoEnum::RETRATAMENTO_ENDODONTICO_EM_DENTE_PERMANENTE_BI_RADICULAR,
|
||||
ProcedimentoEnum::RETRATAMENTO_ENDODONTICO_EM_DENTE_PERMANENTE_COM_3_OU_MAIS_RAIZES,
|
||||
ProcedimentoEnum::RETRATAMENTO_ENDODONTICO_EM_DENTE_PERMANENTE_UNI_RADICULAR,
|
||||
ProcedimentoEnum::SELAMENTO_DE_PERFURACAO_RADICULAR,
|
||||
ProcedimentoEnum::MOLDAGEM_DENTO_GENGIVAL_P_CONSTRUCAO_DE_PROTESE_DENTARIA,
|
||||
ProcedimentoEnum::REEMBASAMENTO_E_CONSERTO_DE_PROTESE_DENTARIA,
|
||||
ProcedimentoEnum::CIMENTACAO_DE_PROTESE_DENTARIA,
|
||||
ProcedimentoEnum::ADAPTACAO_DE_PROTESE_DENTARIA,
|
||||
ProcedimentoEnum::AJUSTE_OCLUSAL,
|
||||
ProcedimentoEnum::INSTALACAO_DE_PROTESE_DENTARIA,
|
||||
ProcedimentoEnum::APICECTOMIA_COM_OU_SEM_OBTURACAO_RETROGRADA,
|
||||
ProcedimentoEnum::CURETAGEM_PERIAPICAL,
|
||||
ProcedimentoEnum::EXODONTIA_DE_DENTE_DECIDUO,
|
||||
ProcedimentoEnum::EXODONTIA_DE_DENTE_PERMANENTE,
|
||||
ProcedimentoEnum::ODONTOSECCAO_RADILECTOMIA_TUNELIZACAO,
|
||||
ProcedimentoEnum::REIMPLANTE_E_TRANSPLANTE_DENTAL_POR_ELEMENTO,
|
||||
ProcedimentoEnum::REMOCAO_DE_DENTE_RETIDO_INCLUSO_IMPACTADO,
|
||||
ProcedimentoEnum::TRATAMENTO_CIRURGICO_PARA_TRACIONAMENTO_DENTAL,
|
||||
ProcedimentoEnum::TRATAMENTO_DE_ALVEOLITE,
|
||||
ProcedimentoEnum::ULOTOMIA_ULECTOMIA,
|
||||
ProcedimentoEnum::COROA_PROVISORIA,
|
||||
ProcedimentoEnum::PROTESES_CORONARIAS_INTRA_RADICULARES_FIXAS_ADESIVAS_POR_ELEMENTO,
|
||||
ProcedimentoEnum::COROA_DE_ACO_E_POLICARBOXILATO,
|
||||
ProcedimentoEnum::PROTESE_DENTARIA_SOBRE_IMPLANTE,
|
||||
ProcedimentoEnum::RASPAGEM_ALISAMENTO_SUBGENGIVAIS_POR_SEXTANTE,
|
||||
ProcedimentoEnum::RASPAGEM_CORONO_RADICULAR_POR_SEXTANTE,
|
||||
ProcedimentoEnum::RASPAGEM_ALISAMENTO_E_POLIMENTO_SUPRAGENGIVAIS_POR_SEXTANTE,
|
||||
ProcedimentoEnum::APROFUNDAMENTO_DE_VESTIBULO_ORAL_POR_SEXTANTE,
|
||||
ProcedimentoEnum::GENGIVECTOMIA_POR_SEXTANTE,
|
||||
ProcedimentoEnum::EXODONTIA_MULTIPLA_COM_ALVEOLOPLASTIA_POR_SEXTANTE,
|
||||
ProcedimentoEnum::GENGIVOPLASTIA_POR_SEXTANTE,
|
||||
ProcedimentoEnum::TRATAMENTO_CIRURGICO_PERIODONTAL_POR_SEXTANTE,
|
||||
];
|
||||
|
||||
$procedimentosComQuantidadeLimitada = [
|
||||
ProcedimentoEnum::PRIMEIRA_CONSULTA_ODONTOLOGICA_PROGRAMATICA,
|
||||
ProcedimentoEnum::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_PRIMARIA_EXCETO_MEDICO,
|
||||
ProcedimentoEnum::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_ESPECIALIZADA_EXCETO_MEDICO,
|
||||
ProcedimentoEnum::ATENDIMENTO_DE_URGENCIA_EM_ATENCAO_ESPECIALIZADA,
|
||||
ProcedimentoEnum::ATENDIMENTO_DE_URGENCIA_EM_ATENCAO_PRIMARIA,
|
||||
ProcedimentoEnum::RETIRADA_DE_PONTOS_DE_CIRURGIAS_POR_PACIENTE,
|
||||
ProcedimentoEnum::PROFILAXIA_REMOCAO_DA_PLACA_BACTERIANA,
|
||||
ProcedimentoEnum::ORIENTACAO_DE_HIGIENE_BUCAL,
|
||||
ProcedimentoEnum::APLICACAO_TOPICA_DE_FLUOR_INDIVIDUAL_POR_SESSAO,
|
||||
ProcedimentoEnum::DRENAGEM_DE_ABSCESSO_DA_BOCA_E_ANEXOS,
|
||||
];
|
||||
|
||||
$procedimentosComLimiteDeSeis = [
|
||||
ProcedimentoEnum::RASPAGEM_ALISAMENTO_SUBGENGIVAIS_POR_SEXTANTE,
|
||||
ProcedimentoEnum::RASPAGEM_CORONO_RADICULAR_POR_SEXTANTE,
|
||||
ProcedimentoEnum::RASPAGEM_ALISAMENTO_E_POLIMENTO_SUPRAGENGIVAIS_POR_SEXTANTE,
|
||||
ProcedimentoEnum::APROFUNDAMENTO_DE_VESTÍBULO_ORAL_POR_SEXTANTE,
|
||||
ProcedimentoEnum::GENGIVECTOMIA_POR_SEXTANTE,
|
||||
ProcedimentoEnum::EXODONTIA_MÚLTIPLA_COM_ALVEOLOPLASTIA_POR_SEXTANTE,
|
||||
ProcedimentoEnum::GENGIVOPLASTIA_POR_SEXTANTE,
|
||||
ProcedimentoEnum::TRATAMENTO_CIRÚRGICO_PERIODONTAL_POR_SEXTANTE,
|
||||
];
|
||||
|
||||
$procedimentosAgrupados = [];
|
||||
|
||||
foreach ($procedimentos as $procedimento) {
|
||||
$codigo = $procedimento->codigo_procedimento;
|
||||
$quantidade = $procedimento->quantidade;
|
||||
|
||||
if (in_array($codigo, $procedimentosComQuantidadeLimitada) || !in_array($codigo, $listaDeProcedimentosEsus)) {
|
||||
|
||||
$procedimentosAgrupados[$codigo] = 1;
|
||||
} elseif (in_array($codigo, $procedimentosComLimiteDeSeis)) {
|
||||
if (isset($procedimentosAgrupados[$codigo])) {
|
||||
$procedimentosAgrupados[$codigo] += $quantidade;
|
||||
} else {
|
||||
$procedimentosAgrupados[$codigo] = $quantidade;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
if (isset($procedimentosAgrupados[$codigo])) {
|
||||
$procedimentosAgrupados[$codigo] += $quantidade;
|
||||
} else {
|
||||
$procedimentosAgrupados[$codigo] = $quantidade;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($procedimentosAgrupados as $codigo => &$quantidade) {
|
||||
if (in_array($codigo, $procedimentosComLimiteDeSeis)) {
|
||||
$quantidade = (int) ceil($quantidade / 6);
|
||||
}
|
||||
}
|
||||
|
||||
unset($quantidade);
|
||||
|
||||
foreach ($procedimentosAgrupados as $codigo => $quantidade) {
|
||||
$procedimentosRealizados = $dom->createElement('procedimentosRealizados');
|
||||
$atendimentosOdontologicos->appendChild($procedimentosRealizados);
|
||||
$procedimentosRealizados->appendChild($dom->createElement('coMsProcedimento', $codigo));
|
||||
$procedimentosRealizados->appendChild($dom->createElement('quantidade', $quantidade));
|
||||
}
|
||||
}
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('turno', $fichaAtendimentoOdontologico->turno_id));
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('sexo', self::sexo($fichaAtendimentoOdontologico->paciente->cidadao->sexo->id)));
|
||||
|
||||
self::getExames($dom, $fichaAtendimentoOdontologico, $atendimentosOdontologicos);
|
||||
self::getIvcf($dom, $fichaAtendimentoOdontologico, $atendimentosOdontologicos);
|
||||
|
||||
$atendimentosOdontologicos->appendChild($dom->createElement('dataHoraInicialAtendimento', strtotime($fichaAtendimentoOdontologico->created_at) * 1000));
|
||||
$timestamp = strtotime($fichaAtendimentoOdontologico->created_at);
|
||||
$timestamp += 5 * 60;
|
||||
$timestampMillis = $timestamp * 1000;
|
||||
$dataHoraFinalAtendimento = $dom->createElement('dataHoraFinalAtendimento', $timestampMillis);
|
||||
$atendimentosOdontologicos->appendChild($dataHoraFinalAtendimento);
|
||||
|
||||
self::getMedicoes($dom, $fichaAtendimentoOdontologico, $atendimentosOdontologicos);
|
||||
self::getCondicaoAvaliada($dom, $fichaAtendimentoOdontologico, $atendimentosOdontologicos);
|
||||
|
||||
if ($procedimentosOci->count() > 0) {
|
||||
foreach ($procedimentosOci as $procedimento) {
|
||||
$solicitacoesOci = $dom->createElement('solicitacoesOci');
|
||||
$atendimentosOdontologicos->appendChild($solicitacoesOci);
|
||||
$solicitacoesOci->appendChild($dom->createElement('codigoSigtap', $procedimento->codigo_procedimento));
|
||||
}
|
||||
}
|
||||
|
||||
$fichaAtendimentoOdontologico->uuid_ficha = $uuid;
|
||||
$fichaAtendimentoOdontologico->exportacao_id = $exportacao->id;
|
||||
$fichaAtendimentoOdontologico->data_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaAtendimentoOdontologico->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaAtendimentoOdontologico->save();
|
||||
}
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaAtendimentoOdontologicoMasterTransport->appendChild($headerTransport);
|
||||
|
||||
$lotacaoFormPrincipal = $dom->createElement('lotacaoFormPrincipal');
|
||||
$headerTransport->appendChild($lotacaoFormPrincipal);
|
||||
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('profissionalCNS', $fichaProfissional->usuario->cidadao->cns ?? ''));
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('cboCodigo_2002', $fichaProfissional->ocupacao->codigo ));
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('cnes', $fichaProfissional->equipe->unidade->cnes));
|
||||
|
||||
if($fichaProfissional->equipe->area->numero_ine){
|
||||
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('ine', $fichaProfissional->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
if($fichaProfissional->usuario_auxiliar_id){
|
||||
|
||||
$lotacaoFormAtendimentoCompartilhado = $dom->createElement('lotacaoFormAtendimentoCompartilhado');
|
||||
$headerTransport->appendChild($lotacaoFormAtendimentoCompartilhado);
|
||||
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('profissionalCNS', $fichaProfissional->usuarioAuxiliar->cidadao->cns ?? ''));
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('cboCodigo_2002', $fichaProfissional->usuarioAuxiliarOcupacao->codigo ));
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild($dom->createElement('cnes', $fichaProfissional->usuarioAuxiliarEquipe->unidade->cnes ?? ''));
|
||||
|
||||
if (
|
||||
$fichaProfissional->usuarioAuxiliarEquipe &&
|
||||
$fichaProfissional->usuarioAuxiliarEquipe->area &&
|
||||
$fichaProfissional->usuarioAuxiliarEquipe->area->numero_ine
|
||||
) {
|
||||
$lotacaoFormAtendimentoCompartilhado->appendChild(
|
||||
$dom->createElement('ine', $fichaProfissional->usuarioAuxiliarEquipe->area->numero_ine)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaProfissional->data_atendimento) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaProfissional->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
'atendimentos_odontologicos' => $atendimentosOdontologicosPosicoes,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getMedicoes(&$dom, $fichaAtendimentoOdontologico, &$atendimentosOdontologicos){
|
||||
|
||||
$medicoesNecessarias = [
|
||||
'circunferencia_abdominal',
|
||||
'perimetro_panturrilha',
|
||||
'pressao_arterial',
|
||||
'frequencia_respiratoria',
|
||||
'frequencia_cardiaca',
|
||||
'temperatura',
|
||||
'saturacao_o2',
|
||||
'glicemia',
|
||||
'momento_coleta_id',
|
||||
'peso',
|
||||
'altura',
|
||||
'perimetro_cefalico'
|
||||
];
|
||||
|
||||
$existeMedicao = false;
|
||||
foreach ($medicoesNecessarias as $campo) {
|
||||
if (!empty($fichaAtendimentoOdontologico->$campo)) {
|
||||
$existeMedicao = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($existeMedicao) {
|
||||
$medicoes = $dom->createElement('medicoes');
|
||||
$atendimentosOdontologicos->appendChild($medicoes);
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->circunferencia_abdominal)) {
|
||||
$medicoes->appendChild($dom->createElement('circunferenciaAbdominal', $fichaAtendimentoOdontologico->circunferencia_abdominal));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->perimetro_panturrilha)) {
|
||||
$medicoes->appendChild($dom->createElement('perimetroPanturrilha', $fichaAtendimentoOdontologico->perimetro_panturrilha));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->pressao_arterial)) {
|
||||
$pressao = explode('/', $fichaAtendimentoOdontologico->pressao_arterial);
|
||||
|
||||
if (count($pressao) === 2) {
|
||||
$medicoes->appendChild($dom->createElement('pressaoArterialSistolica', $pressao[0]));
|
||||
$medicoes->appendChild($dom->createElement('pressaoArterialDiastolica', $pressao[1]));
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->frequencia_respiratoria)) {
|
||||
$medicoes->appendChild($dom->createElement('frequenciaRespiratoria', $fichaAtendimentoOdontologico->frequencia_respiratoria));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->frequencia_cardiaca)) {
|
||||
$medicoes->appendChild($dom->createElement('frequenciaCardiaca', $fichaAtendimentoOdontologico->frequencia_cardiaca));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->temperatura)) {
|
||||
$medicoes->appendChild($dom->createElement('temperatura', $fichaAtendimentoOdontologico->temperatura));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->saturacao_o2)) {
|
||||
$medicoes->appendChild($dom->createElement('saturacaoO2', $fichaAtendimentoOdontologico->saturacao_o2));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->glicemia)) {
|
||||
$medicoes->appendChild($dom->createElement('glicemiaCapilar', $fichaAtendimentoOdontologico->glicemia));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->momento_coleta_id)) {
|
||||
$medicoes->appendChild($dom->createElement('tipoGlicemiaCapilar', $fichaAtendimentoOdontologico->momentoColeta->codigo_esus));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->peso)) {
|
||||
$medicoes->appendChild($dom->createElement('peso', $fichaAtendimentoOdontologico->peso));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->altura)) {
|
||||
$medicoes->appendChild($dom->createElement('altura', $fichaAtendimentoOdontologico->altura));
|
||||
}
|
||||
|
||||
if (!empty($fichaAtendimentoOdontologico->perimetro_cefalico)) {
|
||||
$medicoes->appendChild($dom->createElement('perimetroCefalico', $fichaAtendimentoOdontologico->perimetro_cefalico));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static function getCondicaoAvaliada(&$dom, $fichaAtendimentoOdontologico, &$atendimentosOdontologicos){
|
||||
|
||||
$ciapsAdicionados = [];
|
||||
|
||||
$atendimentosCondicaoAvaliada = DB::table('atencao_basica_atendimento_odontologico_condicao_avaliada')
|
||||
->select([
|
||||
'atencao_basica_cadastro_condicao_avaliada.id',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_condicao_avaliada',
|
||||
'atencao_basica_cadastro_condicao_avaliada.id',
|
||||
'atencao_basica_atendimento_odontologico_condicao_avaliada.condicao_avaliada_id'
|
||||
)
|
||||
->where('atencao_basica_atendimento_odontologico_condicao_avaliada.atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosCondicaoAvaliada as $condicaoAvaliada) {
|
||||
|
||||
$ciap = Ciap::where('id', self::getCiapFromCondicaoAvaliada($condicaoAvaliada->id))->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
$ciapsAdicionados[] = $ciap->id; // ou $ciap->codigo, dependendo do que você quer evitar duplicar
|
||||
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosOdontologicos->appendChild($problemaCondicaoAvaliada);
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
|
||||
$atendimentosDoencaTransmissivel = DB::table('atencao_basica_atendimento_odontologico_doenca_transmissivel')
|
||||
->select([
|
||||
'atencao_basica_cadastro_doenca_transmissivel.id',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_doenca_transmissivel',
|
||||
'atencao_basica_cadastro_doenca_transmissivel.id',
|
||||
'atencao_basica_atendimento_odontologico_doenca_transmissivel.doenca_transmissivel_id'
|
||||
)
|
||||
->where('atencao_basica_atendimento_odontologico_doenca_transmissivel.atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosDoencaTransmissivel as $doenca) {
|
||||
|
||||
$ciap = Ciap::where('id', self::getCiapFromDoencaTransmissivel($doenca->id))->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
$doencaTransmissivel = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosOdontologicos->appendChild($doencaTransmissivel);
|
||||
$doencaTransmissivel->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$doencaTransmissivel->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
|
||||
$atendimentosRastreamento = DB::table('atencao_basica_atendimento_odontologico_rastreamento')
|
||||
->select([
|
||||
'atencao_basica_cadastro_rastreamento.id',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_rastreamento',
|
||||
'atencao_basica_cadastro_rastreamento.id',
|
||||
'atencao_basica_atendimento_odontologico_rastreamento.rastreamento_id'
|
||||
)
|
||||
->where('atencao_basica_atendimento_odontologico_rastreamento.atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosRastreamento as $doenca) {
|
||||
|
||||
$ciap = Ciap::where('id', self::getCiapFromRastreamento($doenca->id))->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
$doencaTransmissivel = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosOdontologicos->appendChild($doencaTransmissivel);
|
||||
$doencaTransmissivel->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$doencaTransmissivel->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
|
||||
$atendimentosCondicaoAvaliada = DB::table('atencao_basica_atendimento_odontologico_problema_condicao')
|
||||
->select([
|
||||
'atencao_basica_atendimento_odontologico_problema_condicao.ciap_id',
|
||||
'atencao_basica_atendimento_odontologico_problema_condicao.cid_id',
|
||||
])
|
||||
->where('atencao_basica_atendimento_odontologico_problema_condicao.atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentosCondicaoAvaliada as $condicaoAvaliada) {
|
||||
|
||||
if ($condicaoAvaliada->ciap_id && !in_array($condicaoAvaliada->ciap_id, $ciapsAdicionados)) {
|
||||
|
||||
$ciap = Ciap::where('id', $condicaoAvaliada->ciap_id)->first() ?? null;
|
||||
|
||||
if ($ciap) {
|
||||
$ciapsAdicionados[] = $ciap->id;
|
||||
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosOdontologicos->appendChild($problemaCondicaoAvaliada);
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('ciap', $ciap->codigo));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
|
||||
if ($condicaoAvaliada->cid_id) {
|
||||
|
||||
$cid = Cid::where('id', $condicaoAvaliada->cid_id)->first() ?? null;
|
||||
|
||||
if ($cid) {
|
||||
|
||||
$problemaCondicaoAvaliada = $dom->createElement('problemasCondicoes');
|
||||
$atendimentosOdontologicos->appendChild($problemaCondicaoAvaliada);
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('cid10', $cid->codigo));
|
||||
$problemaCondicaoAvaliada->appendChild($dom->createElement('isAvaliado', 'true'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static function getExames(&$dom, $fichaAtendimentoOdontologico, &$atendimentosOdontologicos)
|
||||
{
|
||||
$exames = DB::table('atencao_basica_atendimento_odontologico_exame')
|
||||
->select([
|
||||
'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_esus',
|
||||
'atencao_basica_cadastro_exame_solicitado_avaliado.codigo_procedimento',
|
||||
'atencao_basica_atendimento_odontologico_exame.solicitado',
|
||||
'atencao_basica_atendimento_odontologico_exame.avaliado',
|
||||
])
|
||||
->join('atencao_basica_cadastro_exame_solicitado_avaliado', 'atencao_basica_cadastro_exame_solicitado_avaliado.id', 'atencao_basica_atendimento_odontologico_exame.exame_id')
|
||||
->where('atencao_basica_atendimento_odontologico_exame.atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)
|
||||
->limit(1)
|
||||
->get();
|
||||
|
||||
foreach ($exames as $value) {
|
||||
$codigoExame = null;
|
||||
|
||||
if ($value->codigo_procedimento && $value->codigo_procedimento !== '') {
|
||||
$codigoExame = $value->codigo_procedimento;
|
||||
} else {
|
||||
$codigoExame = $value->codigo_esus;
|
||||
}
|
||||
|
||||
$exame = $dom->createElement('exame');
|
||||
$atendimentosOdontologicos->appendChild($exame);
|
||||
$exame->appendChild($dom->createElement('codigoExame', $codigoExame));
|
||||
|
||||
if ($value->solicitado) {
|
||||
$exame->appendChild($dom->createElement('solicitadoAvaliado', 'S'));
|
||||
}
|
||||
|
||||
if ($value->avaliado) {
|
||||
$exame->appendChild($dom->createElement('solicitadoAvaliado', 'A'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static function getCiapFromCondicaoAvaliada($condicaoAvaliada)
|
||||
{
|
||||
$map = [
|
||||
CondicaoAvaliada::ASMA => CiapCondicaoAvaliada::ASMA,
|
||||
CondicaoAvaliada::DESNUTRICAO => CiapCondicaoAvaliada::DESNUTRICAO,
|
||||
CondicaoAvaliada::DIABETES => CiapCondicaoAvaliada::DIABETES,
|
||||
CondicaoAvaliada::DPOC => CiapCondicaoAvaliada::DPOC,
|
||||
CondicaoAvaliada::HIPERTENSAO_ARTERIAL => CiapCondicaoAvaliada::HIPERTENSAO_ARTERIAL,
|
||||
CondicaoAvaliada::OBESIDADE => CiapCondicaoAvaliada::OBESIDADE,
|
||||
CondicaoAvaliada::PRE_NATAL => CiapCondicaoAvaliada::PRE_NATAL,
|
||||
CondicaoAvaliada::PUERICULTURA => CiapCondicaoAvaliada::PUERICULTURA,
|
||||
CondicaoAvaliada::PUERPERIO_ATE_42_DIAS => CiapCondicaoAvaliada::PUERPERIO,
|
||||
CondicaoAvaliada::REABILITACAO => CiapCondicaoAvaliada::REABILITACAO,
|
||||
CondicaoAvaliada::TABAGISMO => CiapCondicaoAvaliada::TABAGISMO,
|
||||
CondicaoAvaliada::USUARIO_DE_ALCOOL => CiapCondicaoAvaliada::USUARIO_DE_ALCOOL,
|
||||
CondicaoAvaliada::USUARIO_DE_OUTRAS_DROGAS => CiapCondicaoAvaliada::USUARIO_DE_OUTRAS_DROGAS,
|
||||
];
|
||||
|
||||
return $map[$condicaoAvaliada] ?? null;
|
||||
}
|
||||
|
||||
private static function getCiapFromDoencaTransmissivel($condicaoAvaliada)
|
||||
{
|
||||
$map = [
|
||||
DoencaTransmissivel::DENGUE => CiapCondicaoAvaliada::DENGUE,
|
||||
DoencaTransmissivel::DST => CiapCondicaoAvaliada::DST,
|
||||
DoencaTransmissivel::HANSENIASE => CiapCondicaoAvaliada::HANSENIASE,
|
||||
DoencaTransmissivel::TUBERCULOSE => CiapCondicaoAvaliada::TUBERCULOSE,
|
||||
];
|
||||
|
||||
return $map[$condicaoAvaliada] ?? null;
|
||||
}
|
||||
|
||||
private static function getCiapFromRastreamento($condicaoAvaliada)
|
||||
{
|
||||
$map = [
|
||||
Rastreamento::RISCO_CARDIOVASCULAR => CiapCondicaoAvaliada::RASTREAMENTO_DE_RISCO_CARDIOVASCULAR,
|
||||
];
|
||||
|
||||
return $map[$condicaoAvaliada] ?? null;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
private static function getIvcf(&$dom, $fichaAtendimentoOdontologico, &$atendimentosOdontologicos)
|
||||
{
|
||||
$atendimentoOdontologicoIvcf = AtendimentoOdontologicoIvcf::where('atendimento_odontologico_id', $fichaAtendimentoOdontologico->id)->first();
|
||||
|
||||
if ($atendimentoOdontologicoIvcf) {
|
||||
$pacienteIdade = $atendimentoOdontologicoIvcf->atendimentoOdontologico->paciente->cidadao->idade['anos'] ?? null;
|
||||
|
||||
$resultado = null;
|
||||
$hasSgIdade = true;
|
||||
$hasSgPercepcaoSaude = false;
|
||||
$hasSgAvdInstrumental = false;
|
||||
$hasSgAvdBasica = false;
|
||||
$hasSgCognicao = false;
|
||||
$hasSgHumor = false;
|
||||
$hasSgAlcancePreensaoPinca = false;
|
||||
$hasSgCapAerobicaMuscular = false;
|
||||
$hasSgMarcha = false;
|
||||
$hasSgContinencia = false;
|
||||
$hasSgVisao = false;
|
||||
$hasSgAudicao = false;
|
||||
$hasSgComorbidade = false;
|
||||
$dataResultado = strtotime($atendimentoOdontologicoIvcf->updated_at) * 1000;
|
||||
|
||||
if ($pacienteIdade >= 75 && $pacienteIdade <= 84) {
|
||||
$resultado += 1;
|
||||
}
|
||||
else if ($pacienteIdade >= 85) {
|
||||
$resultado += 3;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->estado_saude_geral === 'regular_ou_ruim') {
|
||||
$resultado += 1;
|
||||
$hasSgPercepcaoSaude = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->limitacao_compras || $atendimentoOdontologicoIvcf->limitacao_gestao_financeira || $atendimentoOdontologicoIvcf->limitacao_tarefas_domesticas) {
|
||||
$resultado += 4;
|
||||
$hasSgAvdInstrumental = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->banho_independencia) {
|
||||
$resultado += 6;
|
||||
$hasSgAvdBasica = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->relato_esquecimento_por_terceiros) {
|
||||
$resultado += 1;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->esquecimento_piorando) {
|
||||
$resultado += 1;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->esquecimento_impacta_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->humor_tristeza_desanimo) {
|
||||
$resultado += 2;
|
||||
$hasSgHumor = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->perda_interesse_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgHumor = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->limitacao_elevar_bracos) {
|
||||
$resultado += 1;
|
||||
$hasSgAlcancePreensaoPinca = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->limitacao_motricidade_fina) {
|
||||
$resultado += 1;
|
||||
$hasSgAlcancePreensaoPinca = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->perda_peso_nao_intencional || $atendimentoOdontologicoIvcf->imc_abaixo_22 || $atendimentoOdontologicoIvcf->panturrilha_abaixo_31 || $atendimentoOdontologicoIvcf->marcha_lenta_4m_maior_5s) {
|
||||
$resultado += 2;
|
||||
$hasSgCapAerobicaMuscular = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->dificuldade_caminhar_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgMarcha = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->quedas_recorrentes) {
|
||||
$resultado += 2;
|
||||
$hasSgMarcha = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->incontinencia) {
|
||||
$resultado += 2;
|
||||
$hasSgContinencia = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->problema_visao_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgVisao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->problema_audicao_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgAudicao = true;
|
||||
}
|
||||
|
||||
if ($atendimentoOdontologicoIvcf->doencas_cronicas_multiplas || $atendimentoOdontologicoIvcf->polifarmacia_5_ou_mais_medicamentos || $atendimentoOdontologicoIvcf->internacao_ultimos_6_meses) {
|
||||
$resultado += 4;
|
||||
$hasSgComorbidade = true;
|
||||
}
|
||||
|
||||
$ivcf = $dom->createElement('ivcf');
|
||||
$atendimentosOdontologicos->appendChild($ivcf);
|
||||
|
||||
$ivcf->appendChild($dom->createElement('resultado', $resultado));
|
||||
$ivcf->appendChild($dom->createElement('hasSgIdade', $hasSgIdade ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgPercepcaoSaude', $hasSgPercepcaoSaude ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAvdInstrumental', $hasSgAvdInstrumental ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAvdBasica', $hasSgAvdBasica ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgCognicao', $hasSgCognicao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgHumor', $hasSgHumor ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAlcancePreensaoPinca', $hasSgAlcancePreensaoPinca ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgCapAerobicaMuscular', $hasSgCapAerobicaMuscular ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgMarcha', $hasSgMarcha ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgContinencia', $hasSgContinencia ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgVisao', $hasSgVisao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAudicao', $hasSgAudicao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgComorbidade', $hasSgComorbidade ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('dataResultado', $dataResultado));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,352 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\AtividadeColetiva\PraticasEmSaude;
|
||||
use App\Enums\AtencaoBasica\AtividadeColetiva\Pse;
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Models\AtencaoBasica\AtividadeColetiva\AtividadeColetiva;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
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 FichaAtividadeColetivaService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasAtividade($mes_ano) as $fichaAtividade) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaAtividade, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'AC_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasAtividade($mesAnoInicial, false) as $fichaAtividade) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaAtividade);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaAtividade->data_usuario_responsavel,
|
||||
'usuario_id' => $fichaAtividade->usuario->id,
|
||||
'ocupacao_id' => $fichaAtividade->ocupacao->id,
|
||||
'equipe_id' => $fichaAtividade->equipe->id,
|
||||
'atividade_coletiva_id' => $fichaAtividade->id,
|
||||
'atividade_coletiva_participantes' => $dadosExportacao['atividade_coletiva_participantes'],
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'AC_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasAtividade($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return AtividadeColetiva::whereNull('exportacao_id')
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaAtividade, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$atividadeColetivaParticipantesPosicoes = collect();
|
||||
|
||||
$uuid = ExportacaoService::getUuid($fichaAtividade->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/fichaatividadecoletiva');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::ATIVIDADE_COLETIVA));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaAtividade->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaAtividade->equipe->unidade->cnes));
|
||||
|
||||
|
||||
if ($fichaAtividade->equipe->area->numero_ine) {
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaAtividade->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaAtividadeColetivaTransport = $dom->createElement('ns4:fichaAtividadeColetivaTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaAtividadeColetivaTransport);
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
|
||||
if ($fichaAtividade->inep == null) {
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('outraLocalidade', $fichaAtividade->local_atividade));
|
||||
}
|
||||
|
||||
if ($fichaAtividade->inep != null) {
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('inep', $fichaAtividade->inep));
|
||||
}
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('numParticipantes', $fichaAtividade->total_participantes));
|
||||
|
||||
if($fichaAtividade->avaliacoes_alteradas != null){
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('numAvaliacoesAlteradas', $fichaAtividade->avaliacoes_alteradas));
|
||||
}
|
||||
|
||||
if ($fichaAtividade->pse_id == Pse::SAUDE) {
|
||||
|
||||
$profissionais = $dom->createElement('profissionais');
|
||||
$fichaAtividadeColetivaTransport->appendChild($profissionais);
|
||||
$profissionais->appendChild($dom->createElement('cnsProfissional', $fichaAtividade->usuario->cidadao->cns ?? ''));
|
||||
$profissionais->appendChild($dom->createElement('codigoCbo2002', $fichaAtividade->ocupacao->codigo ?? ''));
|
||||
|
||||
self::getProfissionais($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
|
||||
}
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('atividadeTipo', $fichaAtividade->atividadeTipo->id ?? ''));
|
||||
|
||||
if ($fichaAtividade->pse_id != Pse::EDUCACAO && $fichaAtividade->atividadeTipo->id <= 3) {
|
||||
|
||||
self::getTemasReuniao($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
|
||||
}
|
||||
|
||||
self::getPublicoAlvo($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
|
||||
|
||||
foreach ($fichaAtividade->participantes as $i => $participante) {
|
||||
|
||||
$atividadeColetivaParticipantesPosicoes->push([
|
||||
'posicao' => $i + 1,
|
||||
'id' => $participante->id,
|
||||
]);
|
||||
|
||||
$participantes = $dom->createElement('participantes');
|
||||
$fichaAtividadeColetivaTransport->appendChild($participantes);
|
||||
|
||||
if (Cns::isValid($participante->paciente()->withTrashed()->first()->cidadao->cns)) {
|
||||
$participantes->appendChild($dom->createElement('cnsParticipante', $participante->paciente()->withTrashed()->first()->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($participante->paciente()->withTrashed()->first()->cidadao->cns)) {
|
||||
$participantes->appendChild($dom->createElement('cpfParticipante', $participante->paciente()->withTrashed()->first()->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$participantes->appendChild($dom->createElement('dataNascimento', strtotime($participante->paciente()->withTrashed()->first()->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$participantes->appendChild($dom->createElement('avaliacaoAlterada', $participante->avaliacao_alterada ? 'true' : 'false'));
|
||||
|
||||
if($participante->peso != null){
|
||||
|
||||
$participantes->appendChild($dom->createElement('peso', $participante->peso));
|
||||
}
|
||||
|
||||
if($participante->altura != null){
|
||||
|
||||
$participantes->appendChild($dom->createElement('altura', $participante->altura));
|
||||
}
|
||||
|
||||
$ids = [
|
||||
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_1,
|
||||
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_2,
|
||||
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_3,
|
||||
PraticasEmSaude::PROGRAMA_NACIONAL_DE_CONTROLE_DO_TABAGISMO_4
|
||||
];
|
||||
|
||||
$existe = array_intersect( $fichaAtividade->saudePratica->all(), $ids);
|
||||
|
||||
if (!empty($existe)) {
|
||||
|
||||
$participantes->appendChild($dom->createElement('cessouHabitoFumar', $participante->parou_de_fumar ? 'true' : 'false'));
|
||||
$participantes->appendChild($dom->createElement('abandonouGrupo', $participante->abandonou_grupo ? 'true' : 'false'));
|
||||
}
|
||||
|
||||
$participantes->appendChild($dom->createElement('sexo', self::sexo($participante->paciente->cidadao->sexo->id ?? null)));
|
||||
}
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('tbCdsOrigem', '3'));
|
||||
|
||||
if ($fichaAtividade->inep == null && $fichaAtividade->local_atividade == null) {
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('cnesLocalAtividade', $fichaAtividade->cnes));
|
||||
|
||||
}
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('turno', $fichaAtividade->turno_id));
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('pseEducacao', $fichaAtividade->pse_id == Pse::EDUCACAO ? 'true' : 'false'));
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('pseSaude', $fichaAtividade->pse_id == Pse::SAUDE ? 'true' : 'false'));
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaAtividadeColetivaTransport->appendChild($headerTransport);
|
||||
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaAtividade->usuario->cidadao->cns ?? ''));
|
||||
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaAtividade->ocupacao->codigo));
|
||||
$headerTransport->appendChild($dom->createElement('cnes', $fichaAtividade->equipe->unidade->cnes));
|
||||
|
||||
if ($fichaAtividade->equipe->area->numero_ine) {
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('ine', $fichaAtividade->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaAtividade->data_usuario_responsavel) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAtividade->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
self::getTemasSaude($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
|
||||
self::getPraticasSaude($dom, $fichaAtividade, $fichaAtividadeColetivaTransport);
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaAtividade->uuid_ficha = $uuid;
|
||||
$fichaAtividade->exportacao_id = $exportacao->id;
|
||||
$fichaAtividade->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaAtividade->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaAtividade->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
'atividade_coletiva_participantes' => $atividadeColetivaParticipantesPosicoes,
|
||||
];
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
private static function getPublicoAlvo(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
|
||||
|
||||
$publicoAlvo = DB::table('atencao_basica_atividade_coletiva_publico_alvo')
|
||||
->select([
|
||||
'atencao_basica_atividade_coletiva_publico_alvo.publico_alvo_id',
|
||||
])
|
||||
->where('atencao_basica_atividade_coletiva_publico_alvo.atividade_coletiva_id', $fichaAtividade->id)
|
||||
->get();
|
||||
|
||||
foreach ($publicoAlvo as $publico) {
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('publicoAlvo', $publico->publico_alvo_id));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getTemasReuniao(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
|
||||
|
||||
$temasReuniao = DB::table('atencao_basica_atividade_coletiva_reuniao_tema')
|
||||
->select([
|
||||
'atencao_basica_atividade_coletiva_reuniao_tema.reuniao_tema_id',
|
||||
])
|
||||
->where('atencao_basica_atividade_coletiva_reuniao_tema.atividade_coletiva_id', $fichaAtividade->id)
|
||||
->get();
|
||||
|
||||
foreach ($temasReuniao as $tema) {
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('temasParaReuniao', $tema->reuniao_tema_id));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getTemasSaude(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
|
||||
|
||||
$temasSaude = DB::table('atencao_basica_atividade_coletiva_saude_tema')
|
||||
->select([
|
||||
'atencao_basica_atividade_coletiva_saude_tema.saude_tema_id',
|
||||
])
|
||||
->where('atencao_basica_atividade_coletiva_saude_tema.atividade_coletiva_id', $fichaAtividade->id)
|
||||
->get();
|
||||
|
||||
foreach ($temasSaude as $tema) {
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('temasParaSaude', $tema->saude_tema_id));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getPraticasSaude(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
|
||||
|
||||
$praticasSaude = DB::table('atencao_basica_atividade_coletiva_saude_pratica')
|
||||
->select([
|
||||
'atencao_basica_atividade_coletiva_saude_pratica.saude_pratica_id',
|
||||
])
|
||||
->where('atencao_basica_atividade_coletiva_saude_pratica.atividade_coletiva_id', $fichaAtividade->id)
|
||||
->get();
|
||||
|
||||
foreach ($praticasSaude as $pratica) {
|
||||
|
||||
$fichaAtividadeColetivaTransport->appendChild($dom->createElement('praticasEmSaude', $pratica->saude_pratica_id));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getProfissionais(&$dom, $fichaAtividade, &$fichaAtividadeColetivaTransport){
|
||||
|
||||
$profissionais = DB::table('atencao_basica_atividade_coletiva_profissional')
|
||||
->select([
|
||||
'cadastro_cidadao.cns',
|
||||
'sigtap.ocupacao.codigo',
|
||||
])
|
||||
->join('sigtap.ocupacao', 'sigtap.ocupacao.id', 'atencao_basica_atividade_coletiva_profissional.usuario_ocupacao_id')
|
||||
->join('cadastro_usuario', 'cadastro_usuario.id', 'atencao_basica_atividade_coletiva_profissional.usuario_id')
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
||||
->where('atencao_basica_atividade_coletiva_profissional.atividade_coletiva_id', $fichaAtividade->id)
|
||||
->get();
|
||||
|
||||
foreach ($profissionais as $profissional) {
|
||||
|
||||
$profissionais = $dom->createElement('profissionais');
|
||||
$fichaAtividadeColetivaTransport->appendChild($profissionais);
|
||||
$profissionais->appendChild($dom->createElement('cnsProfissional', $profissional->cns));
|
||||
$profissionais->appendChild($dom->createElement('codigoCbo2002', $profissional->codigo));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\Avaliacao\Conclusao;
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Nacionalidade;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\RacaCor;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Models\AtencaoBasica\Avaliacao\Avaliacao;
|
||||
use App\Models\AtencaoBasica\Avaliacao\Justificativa;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\Sigtap\Cid;
|
||||
use App\Rules\Cns;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use DOMDocument;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use ZipArchive;
|
||||
|
||||
class FichaAvaliacaoElegibilidadeService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasAvaliacao($mes_ano) as $fichaAvaliacao) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaAvaliacao, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'FA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasAvaliacao($mesAnoInicial, false) as $fichaAvaliacao) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaAvaliacao);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaAvaliacao->data,
|
||||
'usuario_id' => $fichaAvaliacao->usuario->id,
|
||||
'ocupacao_id' => $fichaAvaliacao->ocupacao->id,
|
||||
'equipe_id' => $fichaAvaliacao->equipe->id,
|
||||
'avaliacao_id' => $fichaAvaliacao->id,
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'FA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasAvaliacao($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return Avaliacao::whereNull('exportacao_id')
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data', substr($mes_ano, 2))
|
||||
->whereMonth('data', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data', substr($mes_ano, 2))
|
||||
->whereMonth('data', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaAvaliacao, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$desconheceNomeMae = $fichaAvaliacao->paciente->cidadao->nome_mae == null ? 'true' : 'false';
|
||||
$desconheceNomePai = $fichaAvaliacao->paciente->cidadao->nome_pai == null ? 'true' : 'false';
|
||||
$semNumero = (isset($fichaAvaliacao->paciente->cidadao->domicilio->endereco->sem_numero) && $fichaAvaliacao->paciente->cidadao->domicilio->endereco->sem_numero) ? 'true' : 'false';
|
||||
|
||||
$telefone = $fichaAvaliacao->paciente->cidadao->telefones
|
||||
->filter(fn ($t) => Str::length($t->numero) === 11)->first()->numero ?? null;
|
||||
|
||||
$uuid = ExportacaoService::getUuid($fichaAvaliacao->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/fichaavaliacaoelegibilidade');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::AVALIACAO_ELEGIBILIDADE_ADMISSAO));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaAvaliacao->equipe->infraestrutura->endereco->logradouro->municipio->ibge ?? null));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaAvaliacao->equipe->unidade->cnes));
|
||||
|
||||
if($fichaAvaliacao->equipe->area->numero_ine){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaAvaliacao->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport = $dom->createElement('ns4:fichaAvaliacaoElegibilidadeTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaAvaliacaoElegibilidadeTransport);
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($headerTransport);
|
||||
|
||||
$lotacaoFormPrincipal = $dom->createElement('lotacaoFormPrincipal');
|
||||
$headerTransport->appendChild($lotacaoFormPrincipal);
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('profissionalCNS', $fichaAvaliacao->usuario->cidadao->cns ?? ''));
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('cboCodigo_2002', $fichaAvaliacao->ocupacao->codigo));
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('cnes', $fichaAvaliacao->equipe->unidade->cnes));
|
||||
|
||||
if($fichaAvaliacao->equipe->area->numero_ine){
|
||||
|
||||
$lotacaoFormPrincipal->appendChild($dom->createElement('ine', $fichaAvaliacao->equipe->area->numero_ine));
|
||||
}
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaAvaliacao->data) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAvaliacao->equipe->infraestrutura->endereco->logradouro->municipio->ibge ?? null));
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('turno', $fichaAvaliacao->turno_id));
|
||||
|
||||
if (Cns::isValid($fichaAvaliacao->paciente->cidadao->cns)) {
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cnsCidadao', $fichaAvaliacao->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($fichaAvaliacao->paciente->cidadao->cns)) {
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cpfCidadao', $fichaAvaliacao->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$racaCorEsus = $fichaAvaliacao->paciente->cidadao->racaCor && $fichaAvaliacao->paciente->cidadao->racaCor->id
|
||||
? ($fichaAvaliacao->paciente->cidadao->racaCor->id != RacaCor::SEM_INFORMACAO
|
||||
? $fichaAvaliacao->paciente->cidadao->racaCor->codigo_esus : NULL)
|
||||
: NULL;
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('dataNascimentoCidadao', strtotime($fichaAvaliacao->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('sexoCidadao', self::sexo($fichaAvaliacao->paciente->cidadao->sexo->id)));
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomeCidadao', $fichaAvaliacao->paciente->cidadao->nome));
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('racaCorCidadao', $racaCorEsus));
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomeSocialCidadao', $fichaAvaliacao->paciente->cidadao->nome_social));
|
||||
|
||||
if ($desconheceNomeMae == 'false') {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomeMaeCidadao', $fichaAvaliacao->paciente->cidadao->nome_mae));
|
||||
}
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('desconheceNomeMae', $desconheceNomeMae));
|
||||
|
||||
if ($fichaAvaliacao->paciente->cidadao->municipioNascimento && $fichaAvaliacao->paciente->cidadao->municipioNascimento->ibge) {
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('codigoIbgeMunicipioNascimento', $fichaAvaliacao->paciente->cidadao->municipioNascimento->ibge));
|
||||
}
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nacionalidadeCidadao', $fichaAvaliacao->paciente->cidadao->nacionalidade->codigo_esus));
|
||||
|
||||
if ($fichaAvaliacao->paciente->email !== null) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('emailCidadao', $fichaAvaliacao->paciente->email));
|
||||
}
|
||||
|
||||
if ($fichaAvaliacao->paciente->cidadao->carteiraTrabalho &&
|
||||
$fichaAvaliacao->paciente->cidadao->carteiraTrabalho->nis_pis_pasep) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('numeroNisPisPasep', $fichaAvaliacao->paciente->cidadao->carteiraTrabalho->nis_pis_pasep));
|
||||
}
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cuidadorCidadao', $fichaAvaliacao->cuidador->id));
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('atencaoDomiciliarProcedencia', $fichaAvaliacao->procedencia->id));
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('atencaoDomiciliarModalidade', $fichaAvaliacao->conclusao->id));
|
||||
|
||||
self::getCondicoesAvaliadas($dom, $fichaAvaliacao, $fichaAvaliacaoElegibilidadeTransport);
|
||||
|
||||
if ($fichaAvaliacao->cid_primario) {
|
||||
|
||||
$cid = Cid::find($fichaAvaliacao->cid_primario);
|
||||
|
||||
if ($cid) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cid10Principal', $cid->codigo));
|
||||
}
|
||||
}
|
||||
|
||||
if($fichaAvaliacao->cid_secundario){
|
||||
|
||||
$cid = Cid::find($fichaAvaliacao->cid_secundario);
|
||||
|
||||
if ($cid) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cid10SecundarioUm', $cid->codigo));
|
||||
}
|
||||
}
|
||||
|
||||
if ($fichaAvaliacao->cid_terciario){
|
||||
|
||||
$cid = Cid::find($fichaAvaliacao->cid_terciario);
|
||||
|
||||
if ($cid) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cid10SecundarioDois', $cid->codigo));
|
||||
}
|
||||
}
|
||||
|
||||
if ($fichaAvaliacao->conclusao->id == Conclusao::INELEGIVEL) {
|
||||
|
||||
$conclusao = Justificativa::where('avaliacao_id', $fichaAvaliacao->id)->first();
|
||||
|
||||
if ($conclusao) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('conclusaoDestinoInelegivel', $conclusao->justificativa->codigo));
|
||||
}
|
||||
} else {
|
||||
|
||||
$conclusao = Justificativa::where('avaliacao_id', $fichaAvaliacao->id)->first();
|
||||
|
||||
if ($conclusao) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('conclusaoDestinoElegivel', $conclusao->justificativa->codigo));
|
||||
}
|
||||
}
|
||||
|
||||
$endereco = $dom->createElement('endereco');
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($endereco);
|
||||
$endereco->appendChild($dom->createElement('bairro', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->bairro->nome ?? null));
|
||||
$endereco->appendChild($dom->createElement('cep', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->cep ?? null));
|
||||
$endereco->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->municipio->ibge ?? null));
|
||||
|
||||
if ($fichaAvaliacao->paciente->cidadao->domicilio->endereco->complemento ?? false) {
|
||||
|
||||
$endereco->appendChild($dom->createElement('complemento', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->complemento));
|
||||
}
|
||||
|
||||
$endereco->appendChild($dom->createElement('nomeLogradouro', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->nome ?? null));
|
||||
|
||||
if($semNumero == 'false'){
|
||||
|
||||
$endereco->appendChild($dom->createElement('numero', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->numero ?? null));
|
||||
}
|
||||
|
||||
$endereco->appendChild($dom->createElement('numeroDneUf', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->municipio->estado->codigo ?? null));
|
||||
$endereco->appendChild($dom->createElement('telefoneContato', $telefone ?? null));
|
||||
$endereco->appendChild($dom->createElement('tipoLogradouroNumeroDne', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->logradouro->tipo->codigo ?? null));
|
||||
$endereco->appendChild($dom->createElement('stSemNumero', $semNumero));
|
||||
|
||||
if ($fichaAvaliacao->paciente->cidadao->domicilio->endereco->referencia ?? false) {
|
||||
|
||||
$endereco->appendChild($dom->createElement('pontoReferencia', $fichaAvaliacao->paciente->cidadao->domicilio->endereco->referencia));
|
||||
}
|
||||
|
||||
if ($desconheceNomePai == 'false') {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('nomePaiCidadao', $fichaAvaliacao->paciente->cidadao->nome_pai));
|
||||
}
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('desconheceNomePai', $desconheceNomePai));
|
||||
|
||||
if ($fichaAvaliacao->paciente->cidadao->nacionalidade->id == Nacionalidade::NATURALIZADO_BRASILEIRO) {
|
||||
|
||||
if ($fichaAvaliacao->paciente->cidadao->data_naturalizacao) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('dtNaturalizacao', strtotime($fichaAvaliacao->paciente->cidadao->data_naturalizacao->format('Y-m-d')) * 1000));
|
||||
}
|
||||
|
||||
if ($fichaAvaliacao->paciente->cidadao->portaria_naturalizacao) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('portariaNaturalizacao', $fichaAvaliacao->paciente->cidadao->portaria_naturalizacao));
|
||||
}
|
||||
|
||||
if ($fichaAvaliacao->paciente->cidadao->estrangeiroEntradaBrasil->data_entrada) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('dtEntradaBrasil', strtotime($fichaAvaliacao->paciente->cidadao->estrangeiroEntradaBrasil->data_entrada->format('Y-m-d')) * 1000));
|
||||
}
|
||||
}
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('paisNascimento', $fichaAvaliacao->paciente->cidadao->paisNascimento->codigo_esus));
|
||||
|
||||
if ($fichaAvaliacao->paciente->cidadao->racaCor->id === RacaCor::INDIGENA) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('etnia', $fichaAvaliacao->paciente->cidadao->etniaIndigena->codigo_cadsus));
|
||||
}
|
||||
|
||||
if (Cns::isValid($fichaAvaliacao->cns_cuidador)) {
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cnsCuidador', $fichaAvaliacao->cns_cuidador ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($fichaAvaliacao->cns_cuidador)) {
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('cpfCuidador', $fichaAvaliacao->cpf_cuidador ?? ''));
|
||||
}
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaAvaliacao->uuid_ficha = $uuid;
|
||||
$fichaAvaliacao->exportacao_id = $exportacao->id;
|
||||
$fichaAvaliacao->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaAvaliacao->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaAvaliacao->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
];
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
private static function getCondicoesAvaliadas(&$dom, $fichaAvaliacao, &$fichaAvaliacaoElegibilidadeTransport){
|
||||
|
||||
$condicoesAvaliadas = DB::table('atencao_basica_avaliacao_condicao')
|
||||
->select([
|
||||
'atencao_basica_avaliacao_condicao.condicao_id',
|
||||
])
|
||||
->where('atencao_basica_avaliacao_condicao.avaliacao_id', $fichaAvaliacao->id)
|
||||
->get();
|
||||
|
||||
foreach ($condicoesAvaliadas as $condicaoAvaliada) {
|
||||
|
||||
$fichaAvaliacaoElegibilidadeTransport->appendChild($dom->createElement('condicoesAvaliadas', $condicaoAvaliada->condicao_id));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,494 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\CadastroDomiciliar\ImovelTipo;
|
||||
use App\Enums\AtencaoBasica\CadastroDomiciliar\Zona;
|
||||
use App\Enums\AtencaoBasica\Exportacao\SalarioMinimo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Models\AtencaoBasica\CadastroDomiciliar\CadastroDomiciliar;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Rules\Cns;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use DOMDocument;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use ZipArchive;
|
||||
|
||||
class FichaCadastroDomiciliarService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasCadastroDomiciliar($mes_ano) as $fichaCadastroDomiciliar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaCadastroDomiciliar, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'CD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasCadastroDomiciliar($mesAnoInicial, false) as $fichaCadastroDomiciliar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaCadastroDomiciliar);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaCadastroDomiciliar->data_usuario_responsavel,
|
||||
'usuario_id' => $fichaCadastroDomiciliar->usuario->id,
|
||||
'ocupacao_id' => $fichaCadastroDomiciliar->ocupacao->id,
|
||||
'equipe_id' => $fichaCadastroDomiciliar->equipe->id,
|
||||
'cadastro_domiciliar_id' => $fichaCadastroDomiciliar->id,
|
||||
'pacientes' => $dadosExportacao['pacientes'],
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'CD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasCadastroDomiciliar($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return CadastroDomiciliar::whereNull('exportacao_id')
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaCadastroDomiciliar, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$pacientesPosicoes = collect();
|
||||
|
||||
$uuid = ExportacaoService::getUuid($fichaCadastroDomiciliar->equipe->unidade->cnes);
|
||||
|
||||
$instituicaoOutrosProfissionais = $fichaCadastroDomiciliar->instituicao_outros_profissionais ? 'true' : 'false';
|
||||
$possuiAnimais = $fichaCadastroDomiciliar->possui_animais ? 'true' : 'false';
|
||||
$recusaCadastro = $fichaCadastroDomiciliar->recusa_cadastro ? 'true' : 'false';
|
||||
$foraArea = $fichaCadastroDomiciliar->fora_area ? 'true' : 'false';
|
||||
$energiaEletrica = $fichaCadastroDomiciliar->energia_eletrica ? 'true' : 'false';
|
||||
$fichaAtualizada = $fichaCadastroDomiciliar->uuid_ficha != null ? 'true' : 'false';
|
||||
$semNumero = $fichaCadastroDomiciliar->domicilio->endereco->sem_numero ? 'true' : 'false';
|
||||
|
||||
$cidadao = $fichaCadastroDomiciliar->domicilio->cidadaos()->first();
|
||||
|
||||
if ($cidadao) {
|
||||
|
||||
$telefone = $cidadao->telefones->filter(fn ($t) => Str::length($t->numero) === 11)->first()->numero ?? null;
|
||||
}
|
||||
|
||||
$residentes = self::getResidentes($fichaCadastroDomiciliar->domicilio_id);
|
||||
|
||||
$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/cadastrodomiciliar');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::CADASTRO_DOMICILIAR));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaCadastroDomiciliar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaCadastroDomiciliar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaCadastroDomiciliar->equipe->area->numero_ine){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaCadastroDomiciliar->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$cadastroDomiciliarTransport = $dom->createElement('ns4:cadastroDomiciliarTransport');
|
||||
$dadoTransporteTransportXml->appendChild($cadastroDomiciliarTransport);
|
||||
|
||||
if ($recusaCadastro == 'false') {
|
||||
|
||||
if ($possuiAnimais == 'true' && optional($fichaCadastroDomiciliar->imovelTipo)->codigo_esus == ImovelTipo::DOMICILIO) {
|
||||
|
||||
self::getAnimais($dom, $fichaCadastroDomiciliar, $cadastroDomiciliarTransport);
|
||||
}
|
||||
|
||||
$codigoImovel = $fichaCadastroDomiciliar->imovelTipo->codigo_esus ?? null;
|
||||
|
||||
if (self::handleTipoImovelPermitido($codigoImovel)) {
|
||||
|
||||
$condicaoMoradia = $dom->createElement('condicaoMoradia');
|
||||
$cadastroDomiciliarTransport->appendChild($condicaoMoradia);
|
||||
|
||||
if ($fichaCadastroDomiciliar->abastecimento) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('abastecimentoAgua', $fichaCadastroDomiciliar->abastecimento->codigo_esus));
|
||||
}
|
||||
if (self::handleTipoImovelPermitidoRural($codigoImovel)
|
||||
&& (($fichaCadastroDomiciliar->domicilioZona->codigo_esus ?? null) == Zona::RURAL)
|
||||
) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('areaProducaoRural', $fichaCadastroDomiciliar->situacaoRural->codigo_esus ?? null));
|
||||
}
|
||||
|
||||
if ($fichaCadastroDomiciliar->destinoLixo) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('destinoLixo', $fichaCadastroDomiciliar->destinoLixo->codigo_esus));
|
||||
}
|
||||
|
||||
if ($fichaCadastroDomiciliar->formaEscoamento) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('formaEscoamentoBanheiro', $fichaCadastroDomiciliar->formaEscoamento->codigo_esus));
|
||||
}
|
||||
|
||||
if ($fichaCadastroDomiciliar->domicilioZona) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('localizacao', $fichaCadastroDomiciliar->domicilioZona->codigo_esus));
|
||||
}
|
||||
|
||||
if (self::handleTipoImovelPermitidoRural($codigoImovel)) {
|
||||
|
||||
if ($fichaCadastroDomiciliar->materialPredominante) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('materialPredominanteParedesExtDomicilio', $fichaCadastroDomiciliar->materialPredominante->codigo_esus));
|
||||
}
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('nuComodos', $fichaCadastroDomiciliar->quantidade_comodos));
|
||||
}
|
||||
|
||||
if ($residentes->sum('total_residentes') > 0) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('nuMoradores',$residentes->sum('total_residentes')));
|
||||
}
|
||||
|
||||
if (self::handleTipoImovelPermitidoRural($codigoImovel)) {
|
||||
|
||||
if ($fichaCadastroDomiciliar->SituacaoDomicilio) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('situacaoMoradiaPosseTerra', $fichaCadastroDomiciliar->SituacaoDomicilio->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('stDisponibilidadeEnergiaEletrica', $energiaEletrica));
|
||||
|
||||
if (self::handleTipoImovelPermitidoRural($codigoImovel)) {
|
||||
|
||||
if ($fichaCadastroDomiciliar->domicilioTipoAcesso) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('tipoAcessoDomicilio', $fichaCadastroDomiciliar->domicilioTipoAcesso->codigo_esus));
|
||||
}
|
||||
|
||||
if ($fichaCadastroDomiciliar->domicilioTipo) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('tipoDomicilio', $fichaCadastroDomiciliar->domicilioTipo->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
if ($fichaCadastroDomiciliar->tratamento) {
|
||||
|
||||
$condicaoMoradia->appendChild($dom->createElement('aguaConsumoDomicilio', $fichaCadastroDomiciliar->tratamento->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('tipoEndereco', 3));
|
||||
|
||||
$enderecoLocalPermanencia = $dom->createElement('enderecoLocalPermanencia');
|
||||
$cadastroDomiciliarTransport->appendChild($enderecoLocalPermanencia);
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('bairro', $fichaCadastroDomiciliar->domicilio->endereco->logradouro->bairro->nome));
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('cep', $fichaCadastroDomiciliar->domicilio->endereco->logradouro->cep));
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaCadastroDomiciliar->domicilio->endereco->logradouro->municipio->ibge));
|
||||
|
||||
if ($fichaCadastroDomiciliar->domicilio->endereco->complemento) {
|
||||
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('complemento', $fichaCadastroDomiciliar->domicilio->endereco->complemento));
|
||||
}
|
||||
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('nomeLogradouro', $fichaCadastroDomiciliar->domicilio->endereco->logradouro->nome));
|
||||
|
||||
if($semNumero == 'false'){
|
||||
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('numero', $fichaCadastroDomiciliar->domicilio->endereco->numero));
|
||||
}
|
||||
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('numeroDneUf', str_pad($fichaCadastroDomiciliar->domicilio->endereco->logradouro->municipio->estado->codigo,2 ,'0', STR_PAD_LEFT)));
|
||||
if (isset($telefone)) {
|
||||
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('telefoneContato', $telefone));
|
||||
}
|
||||
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('tipoLogradouroNumeroDne', $fichaCadastroDomiciliar->domicilio->endereco->logradouro->tipo->codigo));
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('stSemNumero', $semNumero));
|
||||
|
||||
if ($fichaCadastroDomiciliar->domicilio->endereco->referencia) {
|
||||
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('pontoReferencia', $fichaCadastroDomiciliar->domicilio->endereco->referencia));
|
||||
}
|
||||
|
||||
if ($foraArea == 'false' && $fichaCadastroDomiciliar->microarea) {
|
||||
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('microArea', str_pad($fichaCadastroDomiciliar->microarea->descricao, 2, '0', STR_PAD_LEFT)));
|
||||
}
|
||||
|
||||
$enderecoLocalPermanencia->appendChild($dom->createElement('stForaArea', $foraArea));
|
||||
}
|
||||
|
||||
if ($fichaCadastroDomiciliar->domicilio->endereco->latitude) {
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('latitude', $fichaCadastroDomiciliar->domicilio->endereco->latitude));
|
||||
}
|
||||
|
||||
if ($fichaCadastroDomiciliar->domicilio->endereco->longitude) {
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('longitude', $fichaCadastroDomiciliar->domicilio->endereco->longitude));
|
||||
}
|
||||
|
||||
if ($recusaCadastro == 'false' && $fichaCadastroDomiciliar->imovelTipo && $fichaCadastroDomiciliar->imovelTipo->codigo_esus == ImovelTipo::DOMICILIO) {
|
||||
|
||||
foreach ($residentes as $i => $residente) {
|
||||
|
||||
$pacientesPosicoes->push([
|
||||
'posicao' => $i + 1,
|
||||
'id' => $residente->paciente_id,
|
||||
]);
|
||||
|
||||
$familias = $dom->createElement('familias');
|
||||
$cadastroDomiciliarTransport->appendChild($familias);
|
||||
|
||||
$familias->appendChild($dom->createElement('dataNascimentoResponsavel', strtotime($residente->data_nascimento) * 1000));
|
||||
|
||||
if (Cns::isValid($residente->cns)) {
|
||||
|
||||
$familias->appendChild($dom->createElement('numeroCnsResponsavel', $residente->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($residente->cns)) {
|
||||
|
||||
$familias->appendChild($dom->createElement('cpfResponsavel', $residente->cpf ?? ''));
|
||||
}
|
||||
|
||||
$familias->appendChild($dom->createElement('numeroMembrosFamilia', $residente->total_residentes));
|
||||
|
||||
$familias->appendChild($dom->createElement('numeroProntuario', $residente->prontuario));
|
||||
|
||||
if ($residente->total_renda && $residente->salario_minimo) {
|
||||
|
||||
$familias->appendChild($dom->createElement('rendaFamiliar', self::getRendaMensal($residente)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('fichaAtualizada', $fichaAtualizada));
|
||||
|
||||
if ($recusaCadastro == 'false' && $possuiAnimais == 'true' && $fichaCadastroDomiciliar->quantidade_animais
|
||||
&& $fichaCadastroDomiciliar->imovelTipo->codigo_esus == ImovelTipo::DOMICILIO) {
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('quantosAnimaisNoDomicilio', $fichaCadastroDomiciliar->quantidade_animais));
|
||||
}
|
||||
|
||||
if ($recusaCadastro == 'false' && $fichaCadastroDomiciliar->imovelTipo && $fichaCadastroDomiciliar->imovelTipo->codigo_esus == ImovelTipo::DOMICILIO) {
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('stAnimaisNoDomicilio', $possuiAnimais));
|
||||
}
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('statusTermoRecusa', $recusaCadastro));
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('uuid', $uuid));
|
||||
|
||||
if ($fichaAtualizada == 'true') {
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('uuidFichaOriginadora', $fichaCadastroDomiciliar->uuid_ficha));
|
||||
} else {
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('uuidFichaOriginadora', $uuid));
|
||||
}
|
||||
|
||||
$codigoEsus = $fichaCadastroDomiciliar->imovelTipo->codigo_esus ?? null;
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('tipoDeImovel', $codigoEsus ?? ''));
|
||||
|
||||
if ($recusaCadastro == 'false' && $codigoEsus !== null && self::handleTipoImovelPermanencia($codigoEsus)) {
|
||||
|
||||
$instituicaoPermanencia = $dom->createElement('instituicaoPermanencia');
|
||||
$cadastroDomiciliarTransport->appendChild($instituicaoPermanencia);
|
||||
|
||||
$instituicaoPermanencia->appendChild($dom->createElement('nomeInstituicaoPermanencia', $fichaCadastroDomiciliar->instituicao_nome));
|
||||
|
||||
$instituicaoPermanencia->appendChild($dom->createElement('stOutrosProfissionaisVinculados', $instituicaoOutrosProfissionais));
|
||||
|
||||
$instituicaoPermanencia->appendChild($dom->createElement('nomeResponsavelTecnico', $fichaCadastroDomiciliar->instituicao_nome_responsavel_tecnico));
|
||||
|
||||
$instituicaoPermanencia->appendChild($dom->createElement('cnsResponsavelTecnico', $fichaCadastroDomiciliar->instituicao_cns_responsavel_tecnico));
|
||||
|
||||
$instituicaoPermanencia->appendChild($dom->createElement('cargoInstituicao', $fichaCadastroDomiciliar->instituicao_cargo_responsavel_tecnico));
|
||||
|
||||
$instituicaoPermanencia->appendChild($dom->createElement('telefoneResponsavelTecnico', $fichaCadastroDomiciliar->instituicao_telefone_responsavel_tecnico));
|
||||
}
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$cadastroDomiciliarTransport->appendChild($headerTransport);
|
||||
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaCadastroDomiciliar->usuario->cidadao->cns ?? ''));
|
||||
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaCadastroDomiciliar->ocupacao->codigo));
|
||||
$headerTransport->appendChild($dom->createElement('cnes', $fichaCadastroDomiciliar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaCadastroDomiciliar->equipe->area->numero_ine){
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('ine', $fichaCadastroDomiciliar->equipe->area->numero_ine));
|
||||
}
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaCadastroDomiciliar->data_usuario_responsavel) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaCadastroDomiciliar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaCadastroDomiciliar->uuid_ficha = $uuid;
|
||||
$fichaCadastroDomiciliar->exportacao_id = $exportacao->id;
|
||||
$fichaCadastroDomiciliar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaCadastroDomiciliar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaCadastroDomiciliar->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
'pacientes' => $pacientesPosicoes,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getResidentes($id)
|
||||
{
|
||||
return DB::table('cadastro_cidadao')
|
||||
->select([
|
||||
'cadastro_paciente.id AS paciente_id',
|
||||
'atencao_basica_cadastro_individual.responsavel AS responsavel',
|
||||
'atencao_basica_cadastro_individual.responsavel_cidadao_id AS responsavel_cidadao_id',
|
||||
'cadastro_cidadao.data_nascimento',
|
||||
'cadastro_cidadao.cns',
|
||||
'cadastro_cidadao.cpf',
|
||||
'atencao_basica_cadastro_individual.renda_mensal as renda_responsavel',
|
||||
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
|
||||
DB::raw('(
|
||||
SELECT COUNT(*) + 1
|
||||
FROM atencao_basica_cadastro_individual
|
||||
WHERE responsavel_cidadao_id = cadastro_cidadao.id
|
||||
) AS total_residentes'),
|
||||
DB::raw('(
|
||||
SELECT salario_minimo
|
||||
FROM atencao_basica_parametrizacao_outros
|
||||
) AS salario_minimo'),
|
||||
DB::raw('(atencao_basica_cadastro_individual.renda_mensal + COALESCE((
|
||||
SELECT SUM(ci.renda_mensal)
|
||||
FROM atencao_basica_cadastro_individual as ci
|
||||
WHERE ci.responsavel_cidadao_id = cadastro_cidadao.id
|
||||
), 0)) AS total_renda')
|
||||
])
|
||||
->join('cadastro_paciente', 'cadastro_paciente.cidadao_id', 'cadastro_cidadao.id')
|
||||
->leftJoin('atencao_basica_cadastro_individual', 'atencao_basica_cadastro_individual.paciente_id', 'cadastro_paciente.id')
|
||||
->where('cadastro_cidadao.domicilio_id', $id)
|
||||
->where('atencao_basica_cadastro_individual.responsavel', true)
|
||||
->whereNotExists(function ($query) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('cadastro_obito')
|
||||
->whereColumn('cadastro_obito.cidadao_id', 'cadastro_cidadao.id');
|
||||
})
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getAnimais(&$dom, $fichaCadastroDomiciliar, &$cadastroDomiciliarTransport){
|
||||
|
||||
$animais = DB::table('atencao_basica_cadastro_domiciliar_animal')
|
||||
->select([
|
||||
'atencao_basica_cadastro_animal.codigo_esus',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_animal',
|
||||
'atencao_basica_cadastro_animal.id',
|
||||
'atencao_basica_cadastro_domiciliar_animal.animal_id'
|
||||
)
|
||||
->where('atencao_basica_cadastro_domiciliar_animal.cadastro_domiciliar_id', $fichaCadastroDomiciliar->id)
|
||||
->get();
|
||||
|
||||
foreach ($animais as $animal) {
|
||||
|
||||
$cadastroDomiciliarTransport->appendChild($dom->createElement('animaisNoDomicilio', $animal->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
private static function handleTipoImovelPermitido($tipoImovel) {
|
||||
|
||||
return $tipoImovel == ImovelTipo::DOMICILIO
|
||||
|| $tipoImovel == ImovelTipo::ABRIGO
|
||||
|| $tipoImovel == ImovelTipo::INSTITUICAO_LONGA_PERMANENCIA_IDOSOS
|
||||
|| $tipoImovel == ImovelTipo::UNIDADE_PRISIONAL
|
||||
|| $tipoImovel == ImovelTipo::UNIDADE_MEDIDA_SOCIO_EDUCATIVA
|
||||
|| $tipoImovel == ImovelTipo::DELEGACIA ? true : false;
|
||||
}
|
||||
|
||||
private static function handleTipoImovelPermanencia($tipoImovel) {
|
||||
|
||||
return $tipoImovel == ImovelTipo::ABRIGO
|
||||
|| $tipoImovel == ImovelTipo::INSTITUICAO_LONGA_PERMANENCIA_IDOSOS
|
||||
|| $tipoImovel == ImovelTipo::UNIDADE_PRISIONAL
|
||||
|| $tipoImovel == ImovelTipo::UNIDADE_MEDIDA_SOCIO_EDUCATIVA
|
||||
|| $tipoImovel == ImovelTipo::DELEGACIA ? true : false;
|
||||
}
|
||||
|
||||
private static function handleTipoImovelPermitidoRural($tipoImovel) {
|
||||
|
||||
return $tipoImovel == ImovelTipo::DOMICILIO
|
||||
|| $tipoImovel == ImovelTipo::COMERCIO
|
||||
|| $tipoImovel == ImovelTipo::TERRENO_BALDIO
|
||||
|| $tipoImovel == ImovelTipo::PONTO_ESTRATEGICO
|
||||
|| $tipoImovel == ImovelTipo::ESCOLA
|
||||
|| $tipoImovel == ImovelTipo::CRECHE
|
||||
|| $tipoImovel == ImovelTipo::ESTABELECIMENTO_RELIGIOSO
|
||||
|| $tipoImovel == ImovelTipo::OUTROS ? true : false;
|
||||
}
|
||||
|
||||
private static function getRendaMensal($residente) {
|
||||
|
||||
$renda = $residente->total_renda;
|
||||
$salarioMinimo = $residente->salario_minimo;
|
||||
|
||||
if ($renda <= 0.25 * $salarioMinimo) {
|
||||
return SalarioMinimo::UM_QUARTO_SALARIO_MINIMO;
|
||||
} elseif ($renda <= 0.5 * $salarioMinimo) {
|
||||
return SalarioMinimo::MEIO_SALARIO_MINIMO;
|
||||
} elseif ($renda <= $salarioMinimo) {
|
||||
return SalarioMinimo::UM_QUARTO_SALARIO_MINIMO;
|
||||
} elseif ($renda <= 2 * $salarioMinimo) {
|
||||
return SalarioMinimo::DOIS_SALARIO_MINIMO;
|
||||
} elseif ($renda <= 3 * $salarioMinimo) {
|
||||
return SalarioMinimo::TRES_SALARIO_MINIMO;
|
||||
} elseif ($renda <= 4 * $salarioMinimo) {
|
||||
return SalarioMinimo::QUATRO_SALARIO_MINIMO;
|
||||
} else {
|
||||
return SalarioMinimo::ACIMA_QUATRO_SALARIO_MINIMO;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,701 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\CadastroIndividual\SaidaCidadao;
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Deficiencia;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\FatorRisco;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Nacionalidade;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\RacaCor;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Models\AtencaoBasica\CadastroDomiciliar\CadastroDomiciliar;
|
||||
use App\Models\AtencaoBasica\CadastroIndividual\CadastroIndividual;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Rules\Cns;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use DateTime;
|
||||
use DOMDocument;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use ZipArchive;
|
||||
|
||||
class FichaCadastroIndividualService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasCadastroIndividual($mes_ano) as $fichaCadastroIndividual) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaCadastroIndividual, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'CI_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasCadastroIndividual($mesAnoInicial, false) as $fichaCadastroIndividual) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaCadastroIndividual);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaCadastroIndividual->data_usuario_responsavel,
|
||||
'usuario_id' => optional($fichaCadastroIndividual->usuario)->id,
|
||||
'ocupacao_id' => optional($fichaCadastroIndividual->usuarioOcupacao)->id,
|
||||
'equipe_id' => optional($fichaCadastroIndividual->equipe)->id,
|
||||
'cadastro_individual_id' => $fichaCadastroIndividual->id,
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'CI_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasCadastroIndividual($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return CadastroIndividual::with(['paciente' => function ($query) {
|
||||
$query->withTrashed();
|
||||
}])
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->whereNull('exportacao_id')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaCadastroIndividual, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$internacao = $fichaCadastroIndividual->internacao ? 'true' : 'false';
|
||||
$plantasMedicinais = $fichaCadastroIndividual->plantas_medicinais ? 'true' : 'false';
|
||||
$comunidadeTradicional = $fichaCadastroIndividual->comunidade_tradicional ? 'true' : 'false';
|
||||
$orientacaoSexual = $fichaCadastroIndividual->orientacao_sexual ? 'true' : 'false';
|
||||
$identidadeGenero = $fichaCadastroIndividual->identidade_genero ? 'true' : 'false';
|
||||
$cuidadorTradicional = $fichaCadastroIndividual->frequenta_cuidador_tradicional ? 'true' : 'false';
|
||||
$grupoComunitario = $fichaCadastroIndividual->participa_grupo_comunitario ? 'true' : 'false';
|
||||
$deficiente = $fichaCadastroIndividual->deficiente ? 'true' : 'false';
|
||||
$planoSaude = $fichaCadastroIndividual->plano_saude ? 'true' : 'false';
|
||||
$escola = $fichaCadastroIndividual->frequenta_escola_creche ? 'true' : 'false';
|
||||
$recusaCadastro = $fichaCadastroIndividual->recusa_cadastro ? 'true' : 'false';
|
||||
$gestante = $fichaCadastroIndividual->gestante ? 'true' : 'false';
|
||||
$fumante = $fichaCadastroIndividual->fumante ? 'true' : 'false';
|
||||
$usaAlcool = $fichaCadastroIndividual->usa_alcool ? 'true' : 'false';
|
||||
$outrasDrogas = $fichaCadastroIndividual->outras_drogas ? 'true' : 'false';
|
||||
$hipertensao = $fichaCadastroIndividual->hipertensao ? 'true' : 'false';
|
||||
$diabetes = $fichaCadastroIndividual->diabetes ? 'true' : 'false';
|
||||
$avcDerrame = $fichaCadastroIndividual->avc_derrame ? 'true' : 'false';
|
||||
$infarto = $fichaCadastroIndividual->infarto ? 'true' : 'false';
|
||||
$hanseniase = $fichaCadastroIndividual->hanseniase ? 'true' : 'false';
|
||||
$tuberculose = $fichaCadastroIndividual->tuberculose ? 'true' : 'false';
|
||||
$cancer = $fichaCadastroIndividual->cancer ? 'true' : 'false';
|
||||
$internacao = $fichaCadastroIndividual->internacao ? 'true' : 'false';
|
||||
$doencaCardiaca = $fichaCadastroIndividual->doenca_cardiaca ? 'true' : 'false';
|
||||
$problemasRins = $fichaCadastroIndividual->problemas_rins ? 'true' : 'false';
|
||||
$doencaRespiratoria = $fichaCadastroIndividual->doenca_respiratoria ? 'true' : 'false';
|
||||
$acamado = $fichaCadastroIndividual->acamado ? 'true' : 'false';
|
||||
$domiciliado = $fichaCadastroIndividual->domiciliado ? 'true' : 'false';
|
||||
$praticasIntegrativas = $fichaCadastroIndividual->praticas_integrativas ? 'true' : 'false';
|
||||
$outraInstituicao = $fichaCadastroIndividual->outra_instituicao ? 'true' : 'false';
|
||||
$recebeBeneficio = $fichaCadastroIndividual->recebe_beneficio ? 'true' : 'false';
|
||||
$referenciaFamiliar = $fichaCadastroIndividual->referencia_familiar ? 'true' : 'false';
|
||||
$visitaFamiliar = $fichaCadastroIndividual->visita_familiar ? 'true' : 'false';
|
||||
$responsavel = $fichaCadastroIndividual->responsavel ? 'true' : 'false';
|
||||
$alimentosAcabaram = $fichaCadastroIndividual->alimentos_acabaram === null
|
||||
? null
|
||||
: ($fichaCadastroIndividual->alimentos_acabaram ? 'true' : 'false');
|
||||
$comeuAlgunsAlimentos = $fichaCadastroIndividual->comeu_alguns_alimentos === null
|
||||
? null
|
||||
: ($fichaCadastroIndividual->comeu_alguns_alimentos ? 'true' : 'false');
|
||||
$higienePessoal = $fichaCadastroIndividual->higiene_pessoal ? 'true' : 'false';
|
||||
$tratamentoSaudeMental = $fichaCadastroIndividual->tratamento_saude_mental ? 'true' : 'false';
|
||||
$situacaoRua = $fichaCadastroIndividual->situacao_rua_id != null ? 'true' : 'false';
|
||||
$fichaAtualizada = $fichaCadastroIndividual->uuid_ficha != null ? 'true' : 'false';
|
||||
$desconheceNomePai = $fichaCadastroIndividual->paciente->cidadao->nome_pai == null ? 'true' : 'false';
|
||||
$desconheceNomeMae = $fichaCadastroIndividual->paciente->cidadao->nome_mae == null ? 'true' : 'false';
|
||||
$uuid = ExportacaoService::getUuid($fichaCadastroIndividual->equipe->unidade->cnes ?? '9999999');
|
||||
$telefoneCelular = $fichaCadastroIndividual->paciente->cidadao->telefones
|
||||
->filter(fn ($t) => in_array(Str::length($t->numero), [10,11]))->first()->numero ?? null;
|
||||
$dataNascimento = new DateTime($fichaCadastroIndividual->paciente->cidadao->data_nascimento);
|
||||
$dataResponsavel = new DateTime($fichaCadastroIndividual->data_usuario_responsavel);
|
||||
$idade = $dataNascimento->diff($dataResponsavel)->y;
|
||||
|
||||
$cadastroDomiciliar = CadastroDomiciliar::where('domicilio_id', $fichaCadastroIndividual->paciente->cidadao->domicilio_id)->first();
|
||||
|
||||
if ($cadastroDomiciliar) {
|
||||
|
||||
$foraArea = $cadastroDomiciliar->fora_area ? 'true' : 'false';
|
||||
}
|
||||
|
||||
$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/cadastroindividual');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::CADASTRO_INDIVIDUAL));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaCadastroIndividual->equipe->infraestrutura->endereco->logradouro->municipio->ibge ?? '9999999'));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaCadastroIndividual->equipe->unidade->cnes ?? '9999999'));
|
||||
|
||||
if($fichaCadastroIndividual->equipe->area->numero_ine ?? false){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaCadastroIndividual->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$cadastroIndividualTransport = $dom->createElement('ns4:cadastroIndividualTransport');
|
||||
$dadoTransporteTransportXml->appendChild($cadastroIndividualTransport);
|
||||
|
||||
if ($recusaCadastro == 'false') {
|
||||
|
||||
$condicoesDeSaude = $dom->createElement('condicoesDeSaude');
|
||||
$cadastroIndividualTransport->appendChild($condicoesDeSaude);
|
||||
|
||||
if ($internacao == 'true') {
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('descricaoCausaInternacaoEm12Meses', $fichaCadastroIndividual->internacao_motivo));
|
||||
}
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('descricaoOutraCondicao1', $fichaCadastroIndividual->outras_condicoes_primaria));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('descricaoOutraCondicao2', $fichaCadastroIndividual->outras_condicoes_secundaria));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('descricaoOutraCondicao3', $fichaCadastroIndividual->outras_condicoes_terciaria));
|
||||
|
||||
if ($plantasMedicinais == 'true') {
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('descricaoPlantasMedicinaisUsadas', $fichaCadastroIndividual->plantas_medicinais_quais));
|
||||
}
|
||||
|
||||
if ($doencaCardiaca == 'true') {
|
||||
|
||||
self::getDoencasCardiacas($dom, $fichaCadastroIndividual, $condicoesDeSaude);
|
||||
}
|
||||
|
||||
if ($doencaRespiratoria == 'true') {
|
||||
|
||||
self::getDoencasRespiratoria($dom, $fichaCadastroIndividual, $condicoesDeSaude);
|
||||
}
|
||||
|
||||
if ($problemasRins == 'true') {
|
||||
|
||||
self::getProblemasRins($dom, $fichaCadastroIndividual, $condicoesDeSaude);
|
||||
}
|
||||
|
||||
if ($gestante == 'true' && $fichaCadastroIndividual->maternidade_referencia) {
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('maternidadeDeReferencia', $fichaCadastroIndividual->maternidade_referencia));
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->peso) {
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('situacaoPeso', $fichaCadastroIndividual->peso->codigo_esus));
|
||||
}
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusEhDependenteAlcool', $usaAlcool));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusEhDependenteOutrasDrogas', $outrasDrogas));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusEhFumante', $fumante));
|
||||
|
||||
if(optional($fichaCadastroIndividual->paciente->cidadao->sexo)->id === Sexo::FEMININO && ($idade >= 9 && $idade <= 60)){
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusEhGestante', $gestante));
|
||||
}
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusEstaAcamado', $acamado));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusEstaDomiciliado', $domiciliado));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTemDiabetes', $diabetes));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTemDoencaRespiratoria', $doencaRespiratoria));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTemHanseniase', $hanseniase));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTemHipertensaoArterial', $hipertensao));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTemTeveCancer', $cancer));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTemTeveDoencasRins', $problemasRins));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTemTuberculose', $tuberculose));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTeveAvcDerrame', $avcDerrame));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTeveDoencaCardiaca', $doencaCardiaca));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTeveInfarto', $infarto));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusTeveInternadoEm12Meses', $internacao));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusUsaOutrasPraticasIntegrativasOuComplementares', $praticasIntegrativas));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusUsaPlantaMedicinais', $plantasMedicinais));
|
||||
$condicoesDeSaude->appendChild($dom->createElement('statusDiagnosticoMental', $tratamentoSaudeMental));
|
||||
|
||||
$emSituacaoDeRua = $dom->createElement('emSituacaoDeRua');
|
||||
$cadastroIndividualTransport->appendChild($emSituacaoDeRua);
|
||||
|
||||
if ($situacaoRua == 'true') {
|
||||
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('grauParentescoFamiliarFrequentado', $fichaCadastroIndividual->parentesco));
|
||||
|
||||
self::getHigienePessoal($dom, $fichaCadastroIndividual, $emSituacaoDeRua);
|
||||
self::getOrigemAlimentos($dom, $fichaCadastroIndividual, $emSituacaoDeRua);
|
||||
|
||||
if ($outraInstituicao == 'true') {
|
||||
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('outraInstituicaoQueAcompanha', $fichaCadastroIndividual->outra_instituicao_quais));
|
||||
}
|
||||
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('quantidadeAlimentacoesAoDiaSituacaoRua', $fichaCadastroIndividual->alimentacaoDiaria->codigo_esus));
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('statusAcompanhadoPorOutraInstituicao', $outraInstituicao));
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('statusPossuiReferenciaFamiliar', $referenciaFamiliar));
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('statusRecebeBeneficio', $recebeBeneficio));
|
||||
}
|
||||
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('statusSituacaoRua', $situacaoRua));
|
||||
|
||||
if ($situacaoRua == 'true') {
|
||||
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('statusTemAcessoHigienePessoalSituacaoRua', $higienePessoal));
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('statusVisitaFamiliarFrequentemente', $visitaFamiliar));
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('tempoSituacaoRua', $fichaCadastroIndividual->situacaoRua->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
$cadastroIndividualTransport->appendChild($dom->createElement('fichaAtualizada', $fichaAtualizada));
|
||||
|
||||
$identificacaoUsuarioCidadao = $dom->createElement('identificacaoUsuarioCidadao');
|
||||
$cadastroIndividualTransport->appendChild($identificacaoUsuarioCidadao);
|
||||
|
||||
if ($fichaCadastroIndividual->paciente->cidadao->nome_social) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('nomeSocial', $fichaCadastroIndividual->paciente->cidadao->nome_social));
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->paciente->cidadao->municipioNascimento && $fichaCadastroIndividual->paciente->cidadao->municipioNascimento->ibge) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('codigoIbgeMunicipioNascimento', $fichaCadastroIndividual->paciente->cidadao->municipioNascimento->ibge));
|
||||
}
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('dataNascimentoCidadao', strtotime($fichaCadastroIndividual->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('desconheceNomeMae', $desconheceNomeMae));
|
||||
|
||||
if ($fichaCadastroIndividual->paciente->email !== null) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('emailCidadao', $fichaCadastroIndividual->paciente->email));
|
||||
}
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('nacionalidadeCidadao', $fichaCadastroIndividual->paciente->cidadao->nacionalidade->codigo_esus));
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('nomeCidadao', $fichaCadastroIndividual->paciente->cidadao->nome));
|
||||
|
||||
if ($desconheceNomeMae == 'false') {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('nomeMaeCidadao', $fichaCadastroIndividual->paciente->cidadao->nome_mae));
|
||||
}
|
||||
|
||||
if (Cns::isValid($fichaCadastroIndividual->paciente->cidadao->cns)) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('cnsCidadao', $fichaCadastroIndividual->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($fichaCadastroIndividual->paciente->cidadao->cns)) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('cpfCidadao', $fichaCadastroIndividual->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
if ($telefoneCelular) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('telefoneCelular', $telefoneCelular));
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->paciente->cidadao->carteiraTrabalho &&
|
||||
$fichaCadastroIndividual->paciente->cidadao->carteiraTrabalho->nis_pis_pasep) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('numeroNisPisPasep', $fichaCadastroIndividual->paciente->cidadao->carteiraTrabalho->nis_pis_pasep));
|
||||
}
|
||||
|
||||
$racaCorEsus = $fichaCadastroIndividual->paciente->cidadao->racaCor && $fichaCadastroIndividual->paciente->cidadao->racaCor->id
|
||||
? ($fichaCadastroIndividual->paciente->cidadao->racaCor->id != RacaCor::SEM_INFORMACAO
|
||||
? $fichaCadastroIndividual->paciente->cidadao->racaCor->codigo_esus : NULL)
|
||||
: NULL;
|
||||
|
||||
$paisNascimento = optional(optional(optional($fichaCadastroIndividual->paciente)->cidadao)->paisNascimento)->codigo_esus;
|
||||
|
||||
if ($paisNascimento) {
|
||||
$identificacaoUsuarioCidadao
|
||||
->appendChild($dom->createElement('paisNascimento', $paisNascimento));
|
||||
}
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('racaCorCidadao', $racaCorEsus));
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('sexoCidadao', self::sexo(optional($fichaCadastroIndividual->paciente->cidadao->sexo)->id)));
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('statusEhResponsavel', $responsavel));
|
||||
|
||||
if (optional($fichaCadastroIndividual->paciente->cidadao->racaCor)->id === RacaCor::INDIGENA) {
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('etnia', $fichaCadastroIndividual->paciente->cidadao->etniaIndigena->codigo_cadsus));
|
||||
}
|
||||
|
||||
if ($desconheceNomePai == 'false') {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('nomePaiCidadao', $fichaCadastroIndividual->paciente->cidadao->nome_pai));
|
||||
}
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('desconheceNomePai', $desconheceNomePai));
|
||||
|
||||
if ($fichaCadastroIndividual->paciente->cidadao->nacionalidade->id == Nacionalidade::NATURALIZADO_BRASILEIRO
|
||||
|| $fichaCadastroIndividual->paciente->cidadao->nacionalidade->id == Nacionalidade::ESTRANGEIRO) {
|
||||
|
||||
if ($fichaCadastroIndividual->paciente->cidadao->data_naturalizacao) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('dtNaturalizacao', strtotime($fichaCadastroIndividual->paciente->cidadao->data_naturalizacao->format('Y-m-d')) * 1000));
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->paciente->cidadao->portaria_naturalizacao) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('portariaNaturalizacao', $fichaCadastroIndividual->paciente->cidadao->portaria_naturalizacao));
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->paciente->cidadao->estrangeiroEntradaBrasil) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('dtEntradaBrasil', strtotime($fichaCadastroIndividual->paciente->cidadao->estrangeiroEntradaBrasil->data_entrada->format('Y-m-d')) * 1000));
|
||||
}
|
||||
}
|
||||
|
||||
if ($cadastroDomiciliar) {
|
||||
|
||||
if ($foraArea == 'false' && $cadastroDomiciliar->microarea) {
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('microArea', str_pad($cadastroDomiciliar->microarea->descricao, 2, '0', STR_PAD_LEFT)));
|
||||
}
|
||||
|
||||
$identificacaoUsuarioCidadao->appendChild($dom->createElement('stForaArea', $foraArea));
|
||||
}
|
||||
|
||||
if ($recusaCadastro == 'false') {
|
||||
|
||||
$informacoesSocioDemograficas = $dom->createElement('informacoesSocioDemograficas');
|
||||
$cadastroIndividualTransport->appendChild($informacoesSocioDemograficas);
|
||||
|
||||
self::getDeficiencias($dom, $fichaCadastroIndividual, $informacoesSocioDemograficas);
|
||||
|
||||
if ($fichaCadastroIndividual->curso) {
|
||||
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('grauInstrucaoCidadao', $fichaCadastroIndividual->curso->codigo_esus));
|
||||
}
|
||||
|
||||
if ( $fichaCadastroIndividual->ocupacao) {
|
||||
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('ocupacaoCodigoCbo2002', $fichaCadastroIndividual->ocupacao->codigo));
|
||||
}
|
||||
|
||||
if ($orientacaoSexual == 'true' && $fichaCadastroIndividual->orientacaoSexual) {
|
||||
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('orientacaoSexualCidadao', $fichaCadastroIndividual->orientacaoSexual->codigo_esus));
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->parentescoResponsavel) {
|
||||
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('relacaoParentescoCidadao', $fichaCadastroIndividual->parentescoResponsavel->codigo_esus));
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->situacaoMercadoTrabalho) {
|
||||
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('situacaoMercadoTrabalhoCidadao', $fichaCadastroIndividual->situacaoMercadoTrabalho->codigo_esus));
|
||||
}
|
||||
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('statusDesejaInformarOrientacaoSexual', $orientacaoSexual));
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('statusFrequentaBenzedeira', $cuidadorTradicional));
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('statusFrequentaEscola', $escola));
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('statusMembroPovoComunidadeTradicional', $comunidadeTradicional));
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('statusParticipaGrupoComunitario', $grupoComunitario));
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('statusPossuiPlanoSaudePrivado', $planoSaude));
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('statusTemAlgumaDeficiencia', $deficiente));
|
||||
|
||||
if ($identidadeGenero == 'true' && $fichaCadastroIndividual->paciente->cidadao->identidadeGenero) {
|
||||
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('identidadeGeneroCidadao', $fichaCadastroIndividual->paciente->cidadao->identidadeGenero->codigo_esus));
|
||||
}
|
||||
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('statusDesejaInformarIdentidadeGenero', $identidadeGenero));
|
||||
|
||||
if ($idade <= 9) {
|
||||
|
||||
self::getResponsavelPorCrianca($dom, $fichaCadastroIndividual, $informacoesSocioDemograficas);
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->comunidadeTradicionalQual) {
|
||||
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('coPovoComunidadeTradicional', $fichaCadastroIndividual->comunidadeTradicionalQual->codigo_esus));
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->alimentos_acabaram !== null || $fichaCadastroIndividual->comeu_alguns_alimentos !== null) {
|
||||
|
||||
$informacoesSocioEconomicas = $dom->createElement('informacoesSocioEconomicas');
|
||||
$cadastroIndividualTransport->appendChild($informacoesSocioEconomicas);
|
||||
|
||||
if ($alimentosAcabaram !== null) {
|
||||
|
||||
$informacoesSocioEconomicas->appendChild($dom->createElement('alimentosAcabaramAntesTerDinheiroComprarMais', $alimentosAcabaram));
|
||||
}
|
||||
|
||||
if ($comeuAlgunsAlimentos !== null) {
|
||||
|
||||
$informacoesSocioEconomicas->appendChild($dom->createElement('comeuAlgunsAlimentosQueTinhaDinheiroAcabou', $comeuAlgunsAlimentos));
|
||||
}
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->saidaCidadao) {
|
||||
|
||||
$saidaCidadaoCadastro = $dom->createElement('saidaCidadaoCadastro');
|
||||
$cadastroIndividualTransport->appendChild($saidaCidadaoCadastro);
|
||||
|
||||
if ($fichaCadastroIndividual->saidaCidadao) {
|
||||
|
||||
$saidaCidadaoCadastro->appendChild($dom->createElement('motivoSaidaCidadao', $fichaCadastroIndividual->saidaCidadao->codigo_esus));
|
||||
}
|
||||
|
||||
if ($fichaCadastroIndividual->saidaCidadao->id == SaidaCidadao::OBITO) {
|
||||
|
||||
$dataObito = $fichaCadastroIndividual->paciente->cidadao->obito->obito_em ?? null;
|
||||
$dataObitoMs = $dataObito ? strtotime($dataObito) * 1000 : '';
|
||||
|
||||
$numeroDO = $fichaCadastroIndividual->paciente->cidadao->obito->declaracao ?? '';
|
||||
|
||||
$saidaCidadaoCadastro->appendChild(
|
||||
$dom->createElement('dataObito', $dataObitoMs)
|
||||
);
|
||||
|
||||
$saidaCidadaoCadastro->appendChild(
|
||||
$dom->createElement('numeroDO', $numeroDO)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$cadastroIndividualTransport->appendChild($dom->createElement('statusTermoRecusaCadastroIndividualAtencaoBasica', $recusaCadastro));
|
||||
$cadastroIndividualTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
$cadastroIndividualTransport->appendChild($dom->createElement('uuid', $uuid));
|
||||
|
||||
if ($fichaAtualizada == 'true') {
|
||||
|
||||
$cadastroIndividualTransport->appendChild($dom->createElement('uuidFichaOriginadora', $fichaCadastroIndividual->uuid_ficha));
|
||||
}else{
|
||||
|
||||
$cadastroIndividualTransport->appendChild($dom->createElement('uuidFichaOriginadora', $uuid));
|
||||
}
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$cadastroIndividualTransport->appendChild($headerTransport);
|
||||
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaCadastroIndividual->usuario->cidadao->cns ?? ''));
|
||||
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaCadastroIndividual->usuarioOcupacao->codigo ?? null));
|
||||
$headerTransport->appendChild($dom->createElement('cnes', $fichaCadastroIndividual->equipe->unidade->cnes ?? null));
|
||||
|
||||
if($fichaCadastroIndividual->equipe->area->numero_ine ?? false){
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('ine', $fichaCadastroIndividual->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaCadastroIndividual->data_usuario_responsavel) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaCadastroIndividual->equipe->infraestrutura->endereco->logradouro->municipio->ibge ?? null));
|
||||
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaCadastroIndividual->uuid_ficha = $uuid;
|
||||
$fichaCadastroIndividual->exportacao_id = $exportacao->id;
|
||||
$fichaCadastroIndividual->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaCadastroIndividual->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaCadastroIndividual->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getDoencasCardiacas(&$dom, $fichaCadastroIndividual, &$condicoesDeSaude){
|
||||
|
||||
$doencasCardiaca = DB::table('atencao_basica_cadastro_individual_doenca_cardiaca')
|
||||
->select([
|
||||
'atencao_basica_cadastro_doenca_cardiaca.codigo_esus',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_doenca_cardiaca',
|
||||
'atencao_basica_cadastro_doenca_cardiaca.id',
|
||||
'atencao_basica_cadastro_individual_doenca_cardiaca.doenca_cardiaca_id'
|
||||
)
|
||||
->where('atencao_basica_cadastro_individual_doenca_cardiaca.cadastro_individual_id', $fichaCadastroIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($doencasCardiaca as $doencaCardiaca) {
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('doencaCardiaca', $doencaCardiaca->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getDeficiencias(&$dom, $fichaCadastroIndividual, &$informacoesSocioDemograficas)
|
||||
{
|
||||
$deficiencias = DB::table('atencao_basica_cadastro_individual_deficiencia_base')
|
||||
->select([
|
||||
'cadastro_deficiencia_base.codigo_esus',
|
||||
])
|
||||
->join(
|
||||
'cadastro_deficiencia_base',
|
||||
'cadastro_deficiencia_base.id',
|
||||
'atencao_basica_cadastro_individual_deficiencia_base.deficiencia_base_id'
|
||||
)
|
||||
->where('atencao_basica_cadastro_individual_deficiencia_base.cadastro_individual_id', $fichaCadastroIndividual->id)
|
||||
->get();
|
||||
|
||||
$fatoresRisco = $fichaCadastroIndividual->paciente->cidadao->fatoresRisco->pluck('id');
|
||||
$transtornoEspectroAutista = $fatoresRisco->contains(FatorRisco::TEA);
|
||||
|
||||
if ($transtornoEspectroAutista && !$deficiencias->pluck('codigo_esus')->contains('232')) {
|
||||
$deficiencias->push((object)['codigo_esus' => '232']);
|
||||
}
|
||||
|
||||
foreach ($deficiencias as $deficiencia) {
|
||||
$informacoesSocioDemograficas->appendChild(
|
||||
$dom->createElement('deficienciasCidadao', $deficiencia->codigo_esus)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private static function getResponsavelPorCrianca(&$dom, $fichaCadastroIndividual, &$informacoesSocioDemograficas){
|
||||
|
||||
$acompanhamentos = DB::table('atencao_basica_cadastro_individual_acompanhamento_infantil')
|
||||
->select([
|
||||
'atencao_basica_cadastro_acompanhamento_infantil.codigo_esus',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_acompanhamento_infantil',
|
||||
'atencao_basica_cadastro_acompanhamento_infantil.id',
|
||||
'atencao_basica_cadastro_individual_acompanhamento_infantil.acompanhamento_infantil_id'
|
||||
)
|
||||
->where('atencao_basica_cadastro_individual_acompanhamento_infantil.cadastro_individual_id', $fichaCadastroIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($acompanhamentos as $acompanhamento) {
|
||||
|
||||
$informacoesSocioDemograficas->appendChild($dom->createElement('responsavelPorCrianca', $acompanhamento->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getDoencasRespiratoria(&$dom, $fichaCadastroIndividual, &$condicoesDeSaude){
|
||||
|
||||
$doencasRespiratoria = DB::table('atencao_basica_cadastro_individual_doenca_respiratoria')
|
||||
->select([
|
||||
'atencao_basica_cadastro_doenca_respiratoria.codigo_esus',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_doenca_respiratoria',
|
||||
'atencao_basica_cadastro_doenca_respiratoria.id',
|
||||
'atencao_basica_cadastro_individual_doenca_respiratoria.doenca_respiratoria_id'
|
||||
)
|
||||
->where('atencao_basica_cadastro_individual_doenca_respiratoria.cadastro_individual_id', $fichaCadastroIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($doencasRespiratoria as $doencaRespiratoria) {
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('doencaRespiratoria', $doencaRespiratoria->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getProblemasRins(&$dom, $fichaCadastroIndividual, &$condicoesDeSaude){
|
||||
|
||||
$doencasRins = DB::table('atencao_basica_cadastro_individual_problemas_rins')
|
||||
->select([
|
||||
'atencao_basica_cadastro_problemas_rins.codigo_esus',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_problemas_rins',
|
||||
'atencao_basica_cadastro_problemas_rins.id',
|
||||
'atencao_basica_cadastro_individual_problemas_rins.problemas_rins_id'
|
||||
)
|
||||
->where('atencao_basica_cadastro_individual_problemas_rins.cadastro_individual_id', $fichaCadastroIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($doencasRins as $doencaRins) {
|
||||
|
||||
$condicoesDeSaude->appendChild($dom->createElement('doencaRins', $doencaRins->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getOrigemAlimentos(&$dom, $fichaCadastroIndividual, &$emSituacaoDeRua){
|
||||
|
||||
$origemAlimentos = DB::table('atencao_basica_cadastro_individual_origem_alimentacao')
|
||||
->select([
|
||||
'atencao_basica_cadastro_origem_alimentacao.codigo_esus',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_origem_alimentacao',
|
||||
'atencao_basica_cadastro_origem_alimentacao.id',
|
||||
'atencao_basica_cadastro_individual_origem_alimentacao.origem_alimentacao_id'
|
||||
)
|
||||
->where('atencao_basica_cadastro_individual_origem_alimentacao.cadastro_individual_id', $fichaCadastroIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($origemAlimentos as $origemAlimento) {
|
||||
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('origemAlimentoSituacaoRua', $origemAlimento->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getHigienePessoal(&$dom, $fichaCadastroIndividual, &$emSituacaoDeRua){
|
||||
|
||||
$higienesPessoal = DB::table('atencao_basica_cadastro_individual_higiene_pessoal')
|
||||
->select([
|
||||
'atencao_basica_cadastro_higiene_pessoal.codigo_esus',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_higiene_pessoal',
|
||||
'atencao_basica_cadastro_higiene_pessoal.id',
|
||||
'atencao_basica_cadastro_individual_higiene_pessoal.higiene_pessoal_id'
|
||||
)
|
||||
->where('atencao_basica_cadastro_individual_higiene_pessoal.cadastro_individual_id', $fichaCadastroIndividual->id)
|
||||
->get();
|
||||
|
||||
foreach ($higienesPessoal as $higienePessoal) {
|
||||
|
||||
$emSituacaoDeRua->appendChild($dom->createElement('higienePessoalSituacaoRua', $higienePessoal->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Models\AtencaoBasica\CadastroIndividual\CadastroIndividual;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementar;
|
||||
use App\Rules\Cns;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use DOMDocument;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use ZipArchive;
|
||||
|
||||
class FichaComplementarService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasComplementar($mes_ano) as $fichaComplementar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaComplementar, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'FC_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasComplementar($mesAnoInicial, false) as $fichaComplementar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaComplementar);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaComplementar->data_atendimento,
|
||||
'usuario_id' => $fichaComplementar->usuario->id,
|
||||
'ocupacao_id' => $fichaComplementar->ocupacao->id,
|
||||
'equipe_id' => $fichaComplementar->equipe->id,
|
||||
'ficha_complementar_id' => $fichaComplementar->id,
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'FC_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasComplementar($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return FichaComplementar::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));
|
||||
});
|
||||
})
|
||||
)
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaComplementar, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$uuid = ExportacaoService::getUuid($fichaComplementar->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/fichacomplementarzikamicrocefalia');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::FICHA_COMPLEMENTAR));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaComplementar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaComplementar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaComplementar->equipe->area->numero_ine){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaComplementar->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaComplementarZikaMicrocefaliaTransport = $dom->createElement('ns4:fichaComplementarZikaMicrocefaliaTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaComplementarZikaMicrocefaliaTransport);
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($headerTransport);
|
||||
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaComplementar->usuario->cidadao->cns ?? ''));
|
||||
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaComplementar->ocupacao->codigo));
|
||||
$headerTransport->appendChild($dom->createElement('cnes', $fichaComplementar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaComplementar->equipe->area->numero_ine){
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('ine', $fichaComplementar->equipe->area->numero_ine));
|
||||
}
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaComplementar->data_atendimento) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaComplementar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('turno', $fichaComplementar->turno_id));
|
||||
|
||||
if (Cns::isValid($fichaComplementar->paciente->cidadao->cns)) {
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('cnsCidadao', $fichaComplementar->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($fichaComplementar->paciente->cidadao->cns)) {
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('cpfCidadao', $fichaComplementar->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$responsavelFamiliar = self::responsavelFamiliar($fichaComplementar);
|
||||
|
||||
if ($responsavelFamiliar) {
|
||||
|
||||
if (Cns::isValid($responsavelFamiliar->cns)) {
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('cnsResponsavelFamiliar', $responsavelFamiliar->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($responsavelFamiliar->cns)) {
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('cpfResponsavelFamiliar', $responsavelFamiliar->cpf ?? ''));
|
||||
}
|
||||
}
|
||||
|
||||
if ($fichaComplementar->data_realizacao_teste_olhinho) {
|
||||
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoTesteOlhinho', strtotime($fichaComplementar->data_realizacao_teste_olhinho) * 1000));
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoTesteOlhinho', $fichaComplementar->fichaComplementarTesteOlho->codigo));
|
||||
}
|
||||
|
||||
if ($fichaComplementar->data_realizacao_fundo_olho) {
|
||||
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoExameFundoOlho', strtotime($fichaComplementar->data_realizacao_fundo_olho) * 1000));
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoExameFundoOlho', $fichaComplementar->fichaComplementarFundoOlho->codigo));
|
||||
}
|
||||
|
||||
if ($fichaComplementar->data_realizacao_teste_orelhinha) {
|
||||
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoTesteOrelhinha', strtotime($fichaComplementar->data_realizacao_teste_orelhinha) * 1000));
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoTesteOrelhinha', $fichaComplementar->fichaComplementarTesteOrelha->codigo));
|
||||
}
|
||||
|
||||
if ($fichaComplementar->data_realizacao_us_transfontanela) {
|
||||
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoUSTransfontanela', strtotime($fichaComplementar->data_realizacao_us_transfontanela) * 1000));
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoUsTransfontanela', $fichaComplementar->fichaComplementarUsTransfontanela->codigo));
|
||||
}
|
||||
|
||||
if ($fichaComplementar->data_realizacao_tomografia_computadorizada) {
|
||||
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoTomografiaComputadorizada', strtotime($fichaComplementar->data_realizacao_tomografia_computadorizada) * 1000));
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoTomografiaComputadorizada', $fichaComplementar->fichaComplementarTomografiaComputadorizada->codigo));
|
||||
}
|
||||
|
||||
if ($fichaComplementar->data_realizacao_ressonancia_magnetica) {
|
||||
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('dataRealizacaoRessonanciaMagnetica', strtotime($fichaComplementar->data_realizacao_ressonancia_magnetica) * 1000));
|
||||
$fichaComplementarZikaMicrocefaliaTransport->appendChild($dom->createElement('coResultadoRessonanciaMagnetica', $fichaComplementar->fichaComplementarRessonanciaMagnetica->codigo));
|
||||
}
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaComplementar->uuid_ficha = $uuid;
|
||||
$fichaComplementar->exportacao_id = $exportacao->id;
|
||||
$fichaComplementar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaComplementar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaComplementar->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
];
|
||||
}
|
||||
|
||||
private static function responsavelFamiliar($fichaComplementar) {
|
||||
|
||||
return CadastroIndividual::where('paciente_id', $fichaComplementar->paciente_id)
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'atencao_basica_cadastro_individual.responsavel_cidadao_id')
|
||||
->select('cadastro_cidadao.cns', 'cadastro_cidadao.cpf')
|
||||
->first();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentar;
|
||||
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarPerguntaResposta;
|
||||
use App\Rules\Cns;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use DOMDocument;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use ZipArchive;
|
||||
|
||||
class FichaConsumoAlimentarDeSeisAVinteTresMesesService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasConsumoAlimentar($mes_ano) as $fichaConsumoAlimentar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasConsumoAlimentar($mesAnoInicial, false) as $fichaConsumoAlimentar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaConsumoAlimentar->data_atendimento,
|
||||
'usuario_id' => $fichaConsumoAlimentar->usuario->id,
|
||||
'ocupacao_id' => $fichaConsumoAlimentar->ocupacao->id,
|
||||
'equipe_id' => $fichaConsumoAlimentar->equipe->id,
|
||||
'consumo_alimentar_id' => $fichaConsumoAlimentar->id,
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasConsumoAlimentar($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return MarcadorConsumoAlimentar::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));
|
||||
});
|
||||
})
|
||||
)
|
||||
->with('paciente.cidadao')
|
||||
->whereHas('paciente.cidadao', function ($query) {
|
||||
$query->whereRaw('TIMESTAMPDIFF(
|
||||
MONTH, cadastro_cidadao.data_nascimento, atencao_basica_consumo_alimentar.data_atendimento
|
||||
) >= 6 AND TIMESTAMPDIFF(
|
||||
MONTH, cadastro_cidadao.data_nascimento, atencao_basica_consumo_alimentar.data_atendimento
|
||||
) <= 23');
|
||||
})
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaConsumoAlimentar, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$uuid = ExportacaoService::getUuid($fichaConsumoAlimentar->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/fichaconsumoalimentar');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::MARCADORES_DE_CONSUMO_ALIMENTAR));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaConsumoAlimentar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaConsumoAlimentar->equipe->area->numero_ine){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaConsumoAlimentar->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaConsumoAlimentarTransport = $dom->createElement('ns4:fichaConsumoAlimentarTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaConsumoAlimentarTransport);
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaConsumoAlimentarTransport->appendChild($headerTransport);
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaConsumoAlimentar->usuario->cidadao->cns ?? ''));
|
||||
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaConsumoAlimentar->ocupacao->codigo ));
|
||||
$headerTransport->appendChild($dom->createElement('cnes', $fichaConsumoAlimentar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaConsumoAlimentar->equipe->area->numero_ine){
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('ine', $fichaConsumoAlimentar->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaConsumoAlimentar->data_atendimento) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
if (Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cnsCidadao', $fichaConsumoAlimentar->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cpfCidadao', $fichaConsumoAlimentar->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('dataNascimento', strtotime($fichaConsumoAlimentar->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('sexo', self::sexo($fichaConsumoAlimentar->paciente->cidadao->sexo->id)));
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('localAtendimento', $fichaConsumoAlimentar->local_atendimento_id));
|
||||
|
||||
|
||||
$perguntasRespostas = MarcadorConsumoAlimentarPerguntaResposta::where(
|
||||
'marcador_consumo_alimentar_id',
|
||||
$fichaConsumoAlimentar->id
|
||||
)->get();
|
||||
|
||||
foreach ($perguntasRespostas as $perguntaResposta) {
|
||||
|
||||
$perguntas = $dom->createElement('perguntasQuestionarioCriancasDeSeisVinteTresMeses');
|
||||
$fichaConsumoAlimentarTransport->appendChild($perguntas);
|
||||
|
||||
$perguntas->appendChild($dom->createElement('pergunta', $perguntaResposta->pergunta->descricao_esus));
|
||||
$perguntas->appendChild($dom->createElement('respostaUnicaEscolha', $perguntaResposta->resposta->descricao_esus));
|
||||
}
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaConsumoAlimentar->uuid_ficha = $uuid;
|
||||
$fichaConsumoAlimentar->exportacao_id = $exportacao->id;
|
||||
$fichaConsumoAlimentar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaConsumoAlimentar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaConsumoAlimentar->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
];
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentar;
|
||||
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarPerguntaResposta;
|
||||
use App\Rules\Cns;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use DOMDocument;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use ZipArchive;
|
||||
|
||||
class FichaConsumoAlimentarMaisDoisAnosService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasConsumoAlimentar($mes_ano) as $fichaConsumoAlimentar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasConsumoAlimentar($mesAnoInicial, false) as $fichaConsumoAlimentar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaConsumoAlimentar->data_atendimento,
|
||||
'usuario_id' => $fichaConsumoAlimentar->usuario->id,
|
||||
'ocupacao_id' => $fichaConsumoAlimentar->ocupacao->id,
|
||||
'equipe_id' => $fichaConsumoAlimentar->equipe->id,
|
||||
'consumo_alimentar_id' => $fichaConsumoAlimentar->id,
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasConsumoAlimentar($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return MarcadorConsumoAlimentar::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));
|
||||
});
|
||||
})
|
||||
)
|
||||
->with('paciente.cidadao')
|
||||
->whereHas('paciente.cidadao', function ($query) {
|
||||
$query->whereRaw('TIMESTAMPDIFF(YEAR, cadastro_cidadao.data_nascimento, atencao_basica_consumo_alimentar.data_atendimento) >= 2');
|
||||
})
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaConsumoAlimentar, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$uuid = ExportacaoService::getUuid($fichaConsumoAlimentar->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/fichaconsumoalimentar');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::MARCADORES_DE_CONSUMO_ALIMENTAR));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaConsumoAlimentar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaConsumoAlimentar->equipe->area->numero_ine){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaConsumoAlimentar->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaConsumoAlimentarTransport = $dom->createElement('ns4:fichaConsumoAlimentarTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaConsumoAlimentarTransport);
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaConsumoAlimentarTransport->appendChild($headerTransport);
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaConsumoAlimentar->usuario->cidadao->cns ?? ''));
|
||||
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaConsumoAlimentar->ocupacao->codigo ));
|
||||
$headerTransport->appendChild($dom->createElement('cnes', $fichaConsumoAlimentar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaConsumoAlimentar->equipe->area->numero_ine){
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('ine', $fichaConsumoAlimentar->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaConsumoAlimentar->data_atendimento) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
if (Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cnsCidadao', $fichaConsumoAlimentar->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cpfCidadao', $fichaConsumoAlimentar->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('dataNascimento', strtotime($fichaConsumoAlimentar->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('sexo', self::sexo($fichaConsumoAlimentar->paciente->cidadao->sexo->id)));
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('localAtendimento', $fichaConsumoAlimentar->local_atendimento_id));
|
||||
|
||||
$perguntasERespostas = MarcadorConsumoAlimentarPerguntaResposta::where('marcador_consumo_alimentar_id', $fichaConsumoAlimentar->id)
|
||||
->with('pergunta', 'resposta')
|
||||
->get()
|
||||
->groupBy('pergunta_id');
|
||||
|
||||
foreach ($perguntasERespostas as $respostas) {
|
||||
$elementoPerguntas = $dom->createElement('perguntasQuestionarioCriancasComMaisDoisAnos');
|
||||
$fichaConsumoAlimentarTransport->appendChild($elementoPerguntas);
|
||||
$elementoPerguntas->appendChild($dom->createElement('pergunta', $respostas->first()->pergunta->descricao_esus));
|
||||
|
||||
if ($respostas->count() == 1) {
|
||||
$elementoPerguntas->appendChild($dom->createElement('respostaUnicaEscolha', $respostas->first()->resposta->descricao_esus));
|
||||
} else {
|
||||
foreach ($respostas as $resposta) {
|
||||
$elementoPerguntas->appendChild($dom->createElement('respostaMultiplaEscolha', $resposta->resposta->descricao_esus));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaConsumoAlimentar->uuid_ficha = $uuid;
|
||||
$fichaConsumoAlimentar->exportacao_id = $exportacao->id;
|
||||
$fichaConsumoAlimentar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaConsumoAlimentar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaConsumoAlimentar->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
];
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,198 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentar;
|
||||
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarPerguntaResposta;
|
||||
use App\Rules\Cns;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use DOMDocument;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use ZipArchive;
|
||||
|
||||
class FichaConsumoAlimentarMenosSeisMesesService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasConsumoAlimentar($mes_ano) as $fichaConsumoAlimentar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasConsumoAlimentar($mesAnoInicial, false) as $fichaConsumoAlimentar) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaConsumoAlimentar);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaConsumoAlimentar->data_atendimento,
|
||||
'usuario_id' => $fichaConsumoAlimentar->usuario->id,
|
||||
'ocupacao_id' => $fichaConsumoAlimentar->ocupacao->id,
|
||||
'equipe_id' => $fichaConsumoAlimentar->equipe->id,
|
||||
'consumo_alimentar_id' => $fichaConsumoAlimentar->id,
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'CA_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasConsumoAlimentar($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return MarcadorConsumoAlimentar::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));
|
||||
});
|
||||
})
|
||||
)
|
||||
->with('paciente.cidadao')
|
||||
->whereHas('paciente.cidadao', function ($query) {
|
||||
$query->whereRaw('TIMESTAMPDIFF(MONTH, cadastro_cidadao.data_nascimento, atencao_basica_consumo_alimentar.data_atendimento) < 6');
|
||||
})
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaConsumoAlimentar, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$uuid = ExportacaoService::getUuid($fichaConsumoAlimentar->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/fichaconsumoalimentar');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::MARCADORES_DE_CONSUMO_ALIMENTAR));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaConsumoAlimentar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaConsumoAlimentar->equipe->area->numero_ine){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaConsumoAlimentar->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaConsumoAlimentarTransport = $dom->createElement('ns4:fichaConsumoAlimentarTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaConsumoAlimentarTransport);
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaConsumoAlimentarTransport->appendChild($headerTransport);
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaConsumoAlimentar->usuario->cidadao->cns ?? ''));
|
||||
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaConsumoAlimentar->ocupacao->codigo ));
|
||||
$headerTransport->appendChild($dom->createElement('cnes', $fichaConsumoAlimentar->equipe->unidade->cnes));
|
||||
|
||||
if($fichaConsumoAlimentar->equipe->area->numero_ine){
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('ine', $fichaConsumoAlimentar->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaConsumoAlimentar->data_atendimento) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaConsumoAlimentar->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
if (Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cnsCidadao', $fichaConsumoAlimentar->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($fichaConsumoAlimentar->paciente->cidadao->cns)) {
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('cpfCidadao', $fichaConsumoAlimentar->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('dataNascimento', strtotime($fichaConsumoAlimentar->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('sexo', self::sexo($fichaConsumoAlimentar->paciente->cidadao->sexo->id)));
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('localAtendimento', $fichaConsumoAlimentar->local_atendimento_id));
|
||||
|
||||
|
||||
$perguntasRespostas = MarcadorConsumoAlimentarPerguntaResposta::where(
|
||||
'marcador_consumo_alimentar_id',
|
||||
$fichaConsumoAlimentar->id
|
||||
)->get();
|
||||
|
||||
foreach ($perguntasRespostas as $perguntaResposta) {
|
||||
|
||||
$perguntas = $dom->createElement('perguntasQuestionarioCriancasMenoresSeisMeses');
|
||||
$fichaConsumoAlimentarTransport->appendChild($perguntas);
|
||||
|
||||
$perguntas->appendChild($dom->createElement('pergunta', $perguntaResposta->pergunta->descricao_esus));
|
||||
$perguntas->appendChild($dom->createElement('respostaUnicaEscolha', $perguntaResposta->resposta->descricao_esus));
|
||||
}
|
||||
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
$fichaConsumoAlimentarTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaConsumoAlimentar->uuid_ficha = $uuid;
|
||||
$fichaConsumoAlimentar->exportacao_id = $exportacao->id;
|
||||
$fichaConsumoAlimentar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaConsumoAlimentar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaConsumoAlimentar->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
];
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,607 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\AtencaoBasica\Procedimento\Procedimento;
|
||||
use App\Models\AtencaoBasica\Procedimento\ProcedimentoAtendimento;
|
||||
use App\Models\AtencaoBasica\Procedimento\ProcedimentoAtendimentoIvcf;
|
||||
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 FichaProcedimentoService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasProcedimento($mes_ano) as $fichaProcedimento) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaProcedimento, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'PR_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasProcedimento($mesAnoInicial, false) as $fichaProcedimento) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaProcedimento);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaProcedimento->data_usuario_responsavel,
|
||||
'usuario_id' => $fichaProcedimento->usuario->id,
|
||||
'ocupacao_id' => $fichaProcedimento->ocupacao->id,
|
||||
'equipe_id' => $fichaProcedimento->equipe->id,
|
||||
'procedimento_id' => $fichaProcedimento->id,
|
||||
'procedimento_atendimentos' => $dadosExportacao['procedimento_atendimentos'],
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'PR_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasProcedimento($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return Procedimento::whereNull('exportacao_id')
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaProcedimento, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$uuid = ExportacaoService::getUuid($fichaProcedimento->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/fichaprocedimentomaster');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::PROCEDIMENTOS));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaProcedimento->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaProcedimento->equipe->unidade->cnes));
|
||||
|
||||
if($fichaProcedimento->equipe->area->numero_ine){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaProcedimento->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaProcedimentoMasterTransport = $dom->createElement('ns4:fichaProcedimentoMasterTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaProcedimentoMasterTransport);
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaProcedimentoMasterTransport->appendChild($headerTransport);
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaProcedimento->usuario->cidadao->cns ?? ''));
|
||||
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaProcedimento->ocupacao->codigo ));
|
||||
$headerTransport->appendChild($dom->createElement('cnes', $fichaProcedimento->equipe->unidade->cnes));
|
||||
|
||||
if($fichaProcedimento->equipe->area->numero_ine){
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('ine', $fichaProcedimento->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaProcedimento->data_usuario_responsavel) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaProcedimento->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
$retorno = self::getPacientes($dom, $fichaProcedimento, $fichaProcedimentoMasterTransport);
|
||||
$procedimentoAtendimentos = $retorno['procedimento_atendimentos'];
|
||||
|
||||
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
|
||||
if($fichaProcedimento->afericao_pa){
|
||||
|
||||
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalAfericaoPa', $fichaProcedimento->afericao_pa ?? ''));
|
||||
}
|
||||
|
||||
if($fichaProcedimento->afericao_temperatura){
|
||||
|
||||
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalAfericaoTemperatura', $fichaProcedimento->afericao_temperatura ?? ''));
|
||||
}
|
||||
|
||||
if($fichaProcedimento->curativo_simples){
|
||||
|
||||
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalCurativoSimples', $fichaProcedimento->curativo_simples ?? ''));
|
||||
}
|
||||
|
||||
if($fichaProcedimento->coleta_material_exame_laboratorial){
|
||||
|
||||
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalColetaMaterialParaExameLaboratorial', $fichaProcedimento->coleta_material_exame_laboratorial ?? ''));
|
||||
}
|
||||
|
||||
if($fichaProcedimento->glicemia_capilar){
|
||||
|
||||
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalGlicemiaCapilar', $fichaProcedimento->glicemia_capilar ?? ''));
|
||||
}
|
||||
|
||||
if($fichaProcedimento->medicao_altura){
|
||||
|
||||
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalMedicaoAltura', $fichaProcedimento->medicao_altura ?? ''));
|
||||
}
|
||||
|
||||
if($fichaProcedimento->medicao_peso){
|
||||
|
||||
$fichaProcedimentoMasterTransport->appendChild($dom->createElement('numTotalMedicaoPeso', $fichaProcedimento->medicao_peso ?? ''));
|
||||
}
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$fichaProcedimento->uuid_ficha = $uuid;
|
||||
$fichaProcedimento->exportacao_id = $exportacao->id;
|
||||
$fichaProcedimento->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaProcedimento->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
$fichaProcedimento->save();
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
'procedimento_atendimentos' => $procedimentoAtendimentos,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getPacientes(&$dom, $fichaProcedimento, &$fichaProcedimentoMasterTransport){
|
||||
|
||||
$procedimentoAtendimentosPosicoes = collect();
|
||||
|
||||
$procedimentoPaciente = ProcedimentoAtendimento::where('procedimento_id', $fichaProcedimento->id)
|
||||
->get();
|
||||
|
||||
foreach ($procedimentoPaciente as $i => $procedimento) {
|
||||
|
||||
$procedimentoAtendimentosPosicoes->push([
|
||||
'posicao' => $i + 1,
|
||||
'id' => $procedimento->id,
|
||||
]);
|
||||
|
||||
$atendProcedimentos = $dom->createElement('atendProcedimentos');
|
||||
$fichaProcedimentoMasterTransport->appendChild($atendProcedimentos);
|
||||
|
||||
if($procedimento->paciente) {
|
||||
if($procedimento->paciente->prontuario){
|
||||
|
||||
$atendProcedimentos->appendChild($dom->createElement('numProntuario', $procedimento->paciente->prontuario));
|
||||
}
|
||||
|
||||
if (Cns::isValid($procedimento->paciente->cidadao->cns)) {
|
||||
|
||||
$atendProcedimentos->appendChild($dom->createElement('cnsCidadao', $procedimento->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($procedimento->paciente->cidadao->cns)) {
|
||||
|
||||
$atendProcedimentos->appendChild($dom->createElement('cpfCidadao', $procedimento->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
$atendProcedimentos->appendChild($dom->createElement('dtNascimento', strtotime($procedimento->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
$atendProcedimentos->appendChild($dom->createElement('sexo', self::sexo($procedimento->paciente->cidadao->sexo->id)));
|
||||
}
|
||||
|
||||
$atendProcedimentos->appendChild($dom->createElement('localAtendimento', $procedimento->local_atendimento_id));
|
||||
$atendProcedimentos->appendChild($dom->createElement('turno', $procedimento->turno_id));
|
||||
$atendProcedimentos->appendChild($dom->createElement('statusEscutaInicialOrientacao', $procedimento->escuta_inicial ? 'true' : 'false'));
|
||||
|
||||
self::getProcedimentos($dom, $procedimento, $atendProcedimentos);
|
||||
|
||||
$dataHoraInicialAtendimento = strtotime($fichaProcedimento->data_usuario_responsavel . ' ' . Carbon::parse($procedimento->created_at)->format('H:i:s'));
|
||||
$atendProcedimentos->appendChild($dom->createElement('dataHoraInicialAtendimento', $dataHoraInicialAtendimento * 1000));
|
||||
|
||||
$dataHoraFinalAtendimento = $dataHoraInicialAtendimento;
|
||||
$dataHoraFinalAtendimento += 5 * 60;
|
||||
$atendProcedimentos->appendChild($dom->createElement('dataHoraFinalAtendimento', $dataHoraFinalAtendimento * 1000));
|
||||
|
||||
self::getMedicoes($dom, $procedimento, $atendProcedimentos);
|
||||
self::getIvcf($dom, $procedimento, $atendProcedimentos);
|
||||
}
|
||||
|
||||
return [
|
||||
'procedimento_atendimentos' => $procedimentoAtendimentosPosicoes,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getMedicoes(&$dom, $procedimento, &$atendProcedimento){
|
||||
|
||||
$medicoesNecessarias = [
|
||||
'circunferencia_abdominal',
|
||||
'perimetro_panturrilha',
|
||||
'afericao_pa',
|
||||
'frequencia_respiratoria',
|
||||
'frequencia_cardiaca',
|
||||
'temperatura',
|
||||
'saturacao_o2',
|
||||
'glicemia_capilar',
|
||||
'momento_coleta_id',
|
||||
'peso',
|
||||
'altura',
|
||||
'perimetro_cefalico'
|
||||
];
|
||||
|
||||
$existeMedicao = false;
|
||||
foreach ($medicoesNecessarias as $campo) {
|
||||
if (!empty($procedimento->$campo)) {
|
||||
$existeMedicao = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($existeMedicao) {
|
||||
$medicoes = $dom->createElement('medicoes');
|
||||
$atendProcedimento->appendChild($medicoes);
|
||||
|
||||
if (!empty($fichaAtendimentoIndividual->circunferencia_abdominal)) {
|
||||
$medicoes->appendChild($dom->createElement('circunferenciaAbdominal', $procedimento->circunferencia_abdominal));
|
||||
}
|
||||
|
||||
if (!empty($procedimento->perimetro_panturrilha)) {
|
||||
$medicoes->appendChild($dom->createElement('perimetroPanturrilha', $procedimento->perimetro_panturrilha));
|
||||
}
|
||||
|
||||
if (!empty($procedimento->afericao_pa)) {
|
||||
$pressao = explode('/', $procedimento->afericao_pa);
|
||||
|
||||
if (count($pressao) === 2) {
|
||||
$medicoes->appendChild($dom->createElement('pressaoArterialSistolica', $pressao[0]));
|
||||
$medicoes->appendChild($dom->createElement('pressaoArterialDiastolica', $pressao[1]));
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($procedimento->frequencia_respiratoria)) {
|
||||
$medicoes->appendChild($dom->createElement('frequenciaRespiratoria', $procedimento->frequencia_respiratoria));
|
||||
}
|
||||
|
||||
if (!empty($procedimento->frequencia_cardiaca)) {
|
||||
$medicoes->appendChild($dom->createElement('frequenciaCardiaca', $procedimento->frequencia_cardiaca));
|
||||
}
|
||||
|
||||
if (!empty($procedimento->temperatura)) {
|
||||
$medicoes->appendChild($dom->createElement('temperatura', $procedimento->temperatura));
|
||||
}
|
||||
|
||||
if (!empty($procedimento->saturacao_o2)) {
|
||||
$medicoes->appendChild($dom->createElement('saturacaoO2', $procedimento->saturacao_o2));
|
||||
}
|
||||
|
||||
if (!empty($procedimento->glicemia_capilar)) {
|
||||
$medicoes->appendChild($dom->createElement('glicemiaCapilar', $procedimento->glicemia_capilar));
|
||||
}
|
||||
|
||||
if (!empty($procedimento->momento_coleta_id)) {
|
||||
$medicoes->appendChild($dom->createElement('tipoGlicemiaCapilar', $procedimento->momentoColeta->codigo_esus));
|
||||
}
|
||||
|
||||
if (!empty($procedimento->peso)) {
|
||||
$medicoes->appendChild($dom->createElement('peso', $procedimento->peso));
|
||||
}
|
||||
|
||||
if (!empty($procedimento->altura)) {
|
||||
$medicoes->appendChild($dom->createElement('altura', $procedimento->altura));
|
||||
}
|
||||
|
||||
if (!empty($procedimento->perimetro_cefalico)) {
|
||||
$medicoes->appendChild($dom->createElement('perimetroCefalico', $procedimento->perimetro_cefalico));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static function getIvcf(&$dom, $procedimento, &$atendProcedimentos)
|
||||
{
|
||||
$procedimentoAtendimentoIvcf = ProcedimentoAtendimentoIvcf::where('procedimento_atendimento_id', $procedimento->id)->first();
|
||||
|
||||
if ($procedimentoAtendimentoIvcf) {
|
||||
$pacienteIdade = $procedimentoAtendimentoIvcf->procedimentoAtendimento->paciente->cidadao->idade['anos'] ?? null;
|
||||
|
||||
$resultado = null;
|
||||
$hasSgIdade = true;
|
||||
$hasSgPercepcaoSaude = false;
|
||||
$hasSgAvdInstrumental = false;
|
||||
$hasSgAvdBasica = false;
|
||||
$hasSgCognicao = false;
|
||||
$hasSgHumor = false;
|
||||
$hasSgAlcancePreensaoPinca = false;
|
||||
$hasSgCapAerobicaMuscular = false;
|
||||
$hasSgMarcha = false;
|
||||
$hasSgContinencia = false;
|
||||
$hasSgVisao = false;
|
||||
$hasSgAudicao = false;
|
||||
$hasSgComorbidade = false;
|
||||
$dataResultado = strtotime($procedimentoAtendimentoIvcf->updated_at) * 1000;
|
||||
|
||||
if ($pacienteIdade >= 75 && $pacienteIdade <= 84) {
|
||||
$resultado += 1;
|
||||
}
|
||||
else if ($pacienteIdade >= 85) {
|
||||
$resultado += 3;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->estado_saude_geral === 'regular_ou_ruim') {
|
||||
$resultado += 1;
|
||||
$hasSgPercepcaoSaude = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->limitacao_compras || $procedimentoAtendimentoIvcf->limitacao_gestao_financeira || $procedimentoAtendimentoIvcf->limitacao_tarefas_domesticas) {
|
||||
$resultado += 4;
|
||||
$hasSgAvdInstrumental = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->banho_independencia) {
|
||||
$resultado += 6;
|
||||
$hasSgAvdBasica = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->relato_esquecimento_por_terceiros) {
|
||||
$resultado += 1;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->esquecimento_piorando) {
|
||||
$resultado += 1;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->esquecimento_impacta_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->humor_tristeza_desanimo) {
|
||||
$resultado += 2;
|
||||
$hasSgHumor = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->perda_interesse_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgHumor = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->limitacao_elevar_bracos) {
|
||||
$resultado += 1;
|
||||
$hasSgAlcancePreensaoPinca = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->limitacao_motricidade_fina) {
|
||||
$resultado += 1;
|
||||
$hasSgAlcancePreensaoPinca = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->perda_peso_nao_intencional || $procedimentoAtendimentoIvcf->imc_abaixo_22 || $procedimentoAtendimentoIvcf->panturrilha_abaixo_31 || $procedimentoAtendimentoIvcf->marcha_lenta_4m_maior_5s) {
|
||||
$resultado += 2;
|
||||
$hasSgCapAerobicaMuscular = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->dificuldade_caminhar_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgMarcha = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->quedas_recorrentes) {
|
||||
$resultado += 2;
|
||||
$hasSgMarcha = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->incontinencia) {
|
||||
$resultado += 2;
|
||||
$hasSgContinencia = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->problema_visao_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgVisao = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->problema_audicao_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgAudicao = true;
|
||||
}
|
||||
|
||||
if ($procedimentoAtendimentoIvcf->doencas_cronicas_multiplas || $procedimentoAtendimentoIvcf->polifarmacia_5_ou_mais_medicamentos || $procedimentoAtendimentoIvcf->internacao_ultimos_6_meses) {
|
||||
$resultado += 4;
|
||||
$hasSgComorbidade = true;
|
||||
}
|
||||
|
||||
$ivcf = $dom->createElement('ivcf');
|
||||
$atendProcedimentos->appendChild($ivcf);
|
||||
|
||||
$ivcf->appendChild($dom->createElement('resultado', $resultado));
|
||||
$ivcf->appendChild($dom->createElement('hasSgIdade', $hasSgIdade ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgPercepcaoSaude', $hasSgPercepcaoSaude ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAvdInstrumental', $hasSgAvdInstrumental ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAvdBasica', $hasSgAvdBasica ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgCognicao', $hasSgCognicao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgHumor', $hasSgHumor ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAlcancePreensaoPinca', $hasSgAlcancePreensaoPinca ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgCapAerobicaMuscular', $hasSgCapAerobicaMuscular ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgMarcha', $hasSgMarcha ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgContinencia', $hasSgContinencia ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgVisao', $hasSgVisao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAudicao', $hasSgAudicao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgComorbidade', $hasSgComorbidade ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('dataResultado', $dataResultado));
|
||||
}
|
||||
}
|
||||
|
||||
private static function getProcedimentos(&$dom, $procedimento, &$atendProcedimento){
|
||||
|
||||
$atendimentoProcedimentosPequenaCirurgia = DB::table('atencao_basica_procedimento_atendimento_pequena_cirurgia')
|
||||
->select([
|
||||
'atencao_basica_cadastro_procedimento_pequena_cirurgia.codigo_esus',
|
||||
'atencao_basica_cadastro_procedimento_pequena_cirurgia.codigo_procedimento',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_procedimento_pequena_cirurgia',
|
||||
'atencao_basica_cadastro_procedimento_pequena_cirurgia.id',
|
||||
'atencao_basica_procedimento_atendimento_pequena_cirurgia.pequena_cirurgia_id'
|
||||
)
|
||||
->where('atencao_basica_procedimento_atendimento_pequena_cirurgia.procedimento_atendimento_id', $procedimento->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentoProcedimentosPequenaCirurgia as $procedimentosPequenaCirurgia) {
|
||||
|
||||
if (isset($procedimentosPequenaCirurgia->codigo_procedimento)
|
||||
&& !empty(trim($procedimentosPequenaCirurgia->codigo_procedimento))
|
||||
) {
|
||||
$codigoPequenaCirurgia = $procedimentosPequenaCirurgia->codigo_procedimento;
|
||||
}
|
||||
else {
|
||||
$codigoPequenaCirurgia = $procedimentosPequenaCirurgia->codigo_esus;
|
||||
}
|
||||
|
||||
$atendProcedimento->appendChild($dom->createElement('procedimentos', $codigoPequenaCirurgia ));
|
||||
}
|
||||
|
||||
$atendimentoProcedimentosTesteRapido = DB::table('atencao_basica_procedimento_atendimento_teste_rapido')
|
||||
->select([
|
||||
'atencao_basica_cadastro_teste_rapido.codigo_esus',
|
||||
'atencao_basica_cadastro_teste_rapido.codigo_procedimento',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_teste_rapido',
|
||||
'atencao_basica_cadastro_teste_rapido.id',
|
||||
'atencao_basica_procedimento_atendimento_teste_rapido.teste_rapido_id'
|
||||
)
|
||||
->where('atencao_basica_procedimento_atendimento_teste_rapido.procedimento_atendimento_id', $procedimento->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentoProcedimentosTesteRapido as $procedimentosTesteRapido) {
|
||||
|
||||
if (isset($procedimentosTesteRapido->codigo_procedimento)
|
||||
&& !empty(trim($procedimentosTesteRapido->codigo_procedimento))
|
||||
) {
|
||||
$codigoTesteRapido = $procedimentosTesteRapido->codigo_procedimento;
|
||||
}
|
||||
else {
|
||||
$codigoTesteRapido = $procedimentosTesteRapido->codigo_esus;
|
||||
}
|
||||
|
||||
$atendProcedimento->appendChild($dom->createElement('procedimentos', $codigoTesteRapido));
|
||||
}
|
||||
|
||||
$atendimentoProcedimentosViaAdministracao = DB::table('atencao_basica_procedimento_via_administracao')
|
||||
->select([
|
||||
'atencao_basica_cadastro_via_administracao.codigo_esus',
|
||||
'atencao_basica_cadastro_via_administracao.codigo_procedimento',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_via_administracao',
|
||||
'atencao_basica_cadastro_via_administracao.id',
|
||||
'atencao_basica_procedimento_via_administracao.via_administracao_id'
|
||||
)
|
||||
->where('atencao_basica_procedimento_via_administracao.procedimento_atendimento_id', $procedimento->id)
|
||||
->get();
|
||||
|
||||
foreach ($atendimentoProcedimentosViaAdministracao as $procedimentosViaAdministracao) {
|
||||
|
||||
if (isset($procedimentosViaAdministracao->codigo_procedimento)
|
||||
&& !empty(trim($procedimentosViaAdministracao->codigo_procedimento))
|
||||
) {
|
||||
$codigoViaAdministracao = $procedimentosViaAdministracao->codigo_procedimento;
|
||||
}
|
||||
else {
|
||||
$codigoViaAdministracao = $procedimentosViaAdministracao->codigo_esus;
|
||||
}
|
||||
|
||||
$atendProcedimento->appendChild($dom->createElement('procedimentos', $codigoViaAdministracao));
|
||||
}
|
||||
|
||||
$codigoProcedimentoPequenaCirurgia = $atendimentoProcedimentosPequenaCirurgia->pluck('codigo_procedimento')->toArray();
|
||||
$codigoProcedimentoTesteRapido = $atendimentoProcedimentosTesteRapido->pluck('codigo_procedimento')->toArray();
|
||||
$codigoProcedimentoViaAdministracao = $atendimentoProcedimentosViaAdministracao->pluck('codigo_procedimento')->toArray();
|
||||
|
||||
$atendimentoProcedimentos = DB::table('atencao_basica_procedimento_atendimento_procedimento')
|
||||
->select([
|
||||
'procedimento.codigo',
|
||||
])
|
||||
->join(
|
||||
'sigtap.procedimento as procedimento',
|
||||
'procedimento.id',
|
||||
'atencao_basica_procedimento_atendimento_procedimento.procedimento_id'
|
||||
)
|
||||
->join(
|
||||
'atencao_basica_procedimento_atendimento',
|
||||
'atencao_basica_procedimento_atendimento.id',
|
||||
'atencao_basica_procedimento_atendimento_procedimento.procedimento_atendimento_id'
|
||||
)
|
||||
->where('atencao_basica_procedimento_atendimento_procedimento.procedimento_atendimento_id', $procedimento->id)
|
||||
->whereNotIn('procedimento.codigo', $codigoProcedimentoPequenaCirurgia)
|
||||
->whereNotIn('procedimento.codigo', $codigoProcedimentoTesteRapido)
|
||||
->whereNotIn('procedimento.codigo', $codigoProcedimentoViaAdministracao)
|
||||
->where(function ($query) {
|
||||
$query->whereNull('atencao_basica_procedimento_atendimento.atendimento_individual_id')
|
||||
->orWhere(function($query) {
|
||||
$query->whereNotNull('atencao_basica_procedimento_atendimento.atendimento_individual_id')
|
||||
->where('procedimento.codigo', 'NOT LIKE', '09%');
|
||||
});
|
||||
})
|
||||
->get();
|
||||
|
||||
foreach ($atendimentoProcedimentos as $procedimento) {
|
||||
|
||||
$atendProcedimento->appendChild($dom->createElement('procedimentos', $procedimento->codigo));
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,519 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\Exportacao;
|
||||
|
||||
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexo;
|
||||
use App\Enums\AtencaoBasica\Procedimento\TipoDadoSerializado;
|
||||
use App\Enums\AtencaoBasica\VisitaDomiciliar\Desfecho as VisitaDomiciliarDesfecho;
|
||||
use App\Enums\AtencaoBasica\VisitaDomiciliar\TipoImovel;
|
||||
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
|
||||
use App\Models\AtencaoBasica\CadastroDomiciliar\CadastroDomiciliar;
|
||||
use App\Models\AtencaoBasica\Exportacao\Exportacao;
|
||||
use App\Models\AtencaoBasica\VisitaDomiciliar\VisitaDomiciliar;
|
||||
use App\Models\AtencaoBasica\VisitaDomiciliar\VisitaDomiciliarIvcf;
|
||||
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 FichaVisitaDomiciliarService extends Service
|
||||
{
|
||||
|
||||
public static function create($arquivo_caminho, $arquivo_nome, $exportacaoArquivoId, $usuarioId = null)
|
||||
{
|
||||
$mes_ano = request()->mes_ano;
|
||||
|
||||
foreach (self::getFichasProfissional($mes_ano) as $fichaProfissional) {
|
||||
|
||||
$iteracoes = self::getIteracoesCount($fichaProfissional, $mes_ano);
|
||||
|
||||
for ($i = 0; $i < $iteracoes; $i++) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaProfissional, $mes_ano, true, $exportacaoArquivoId, $usuarioId);
|
||||
|
||||
$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, 'VD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml');
|
||||
$zip->close();
|
||||
|
||||
unlink($xmlPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function gerarExportacoes($mesAnoInicial)
|
||||
{
|
||||
$exportacoes = collect();
|
||||
|
||||
foreach (self::getFichasProfissional($mesAnoInicial, false) as $fichaProfissional) {
|
||||
|
||||
$iteracoes = self::getIteracoesCount($fichaProfissional, $mesAnoInicial, false);
|
||||
|
||||
for ($i = 0; $i < $iteracoes; $i++) {
|
||||
|
||||
$dadosExportacao = self::getDadosExportacao($fichaProfissional, $mesAnoInicial, false);
|
||||
|
||||
$exportacoes->push([
|
||||
'exportacao_id' => $dadosExportacao['exportacao']->id,
|
||||
'data_atendimento' => $fichaProfissional->data_usuario_responsavel,
|
||||
'usuario_id' => $fichaProfissional->usuario->id,
|
||||
'ocupacao_id' => $fichaProfissional->ocupacao->id,
|
||||
'equipe_id' => $fichaProfissional->equipe->id,
|
||||
'visitas_domiciliares' => $dadosExportacao['visitas_domiciliares'],
|
||||
'xml' => [
|
||||
'nome_arquivo' => 'VD_' . $dadosExportacao['exportacao']->uuid . '.esus.xml',
|
||||
'conteudo' => $dadosExportacao['dom']->saveXml(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return $exportacoes;
|
||||
}
|
||||
|
||||
private static function getFichasProfissional($mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
return VisitaDomiciliar::whereNull('exportacao_id')
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->groupBy([
|
||||
DB::raw('DATE(data_usuario_responsavel)'),
|
||||
'usuario_id',
|
||||
'equipe_id',
|
||||
'usuario_ocupacao_id',
|
||||
])
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getIteracoesCount($fichaProfissional, $mes_ano, $somenteMesAno = true)
|
||||
{
|
||||
$count = VisitaDomiciliar::whereNull('exportacao_id')
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->where('usuario_id', $fichaProfissional->usuario_id)
|
||||
->where('equipe_id', $fichaProfissional->equipe_id)
|
||||
->where('usuario_ocupacao_id', $fichaProfissional->usuario_ocupacao_id)
|
||||
->whereDate('data_usuario_responsavel', $fichaProfissional->data_usuario_responsavel)
|
||||
->count();
|
||||
|
||||
return ceil($count / 99);
|
||||
}
|
||||
|
||||
private static function getDadosExportacao($fichaProfissional, $mes_ano, $somenteMesAno = true, $exportacaoArquivoId = null, $usuarioId = null)
|
||||
{
|
||||
$visitasDomiciliaresPosicoes = collect();
|
||||
|
||||
$uuid = ExportacaoService::getUuid($fichaProfissional->equipe->unidade->cnes);
|
||||
|
||||
$exportacao = new Exportacao();
|
||||
$exportacao->uuid = $uuid;
|
||||
$exportacao->exportacao_arquivo_id = $exportacaoArquivoId;
|
||||
$exportacao->save();
|
||||
|
||||
$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/fichavisitadomiciliarmaster');
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('uuidDadoSerializado', $uuid));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('tipoDadoSerializado', TipoDadoSerializado::VISITA_DOMICILIAR));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('codIbge', $fichaProfissional->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('cnesDadoSerializado', $fichaProfissional->equipe->unidade->cnes));
|
||||
|
||||
if($fichaProfissional->equipe->area->numero_ine){
|
||||
|
||||
$dadoTransporteTransportXml->appendChild($dom->createElement('ineDadoSerializado', $fichaProfissional->equipe->area->numero_ine));
|
||||
}
|
||||
|
||||
$fichaVisitaDomiciliarMasterTransport = $dom->createElement('ns4:fichaVisitaDomiciliarMasterTransport');
|
||||
$dadoTransporteTransportXml->appendChild($fichaVisitaDomiciliarMasterTransport);
|
||||
|
||||
$fichaVisitaDomiciliarMasterTransport->appendChild($dom->createElement('uuidFicha', $uuid));
|
||||
$fichaVisitaDomiciliarMasterTransport->appendChild($dom->createElement('tpCdsOrigem', '3'));
|
||||
|
||||
$headerTransport = $dom->createElement('headerTransport');
|
||||
$fichaVisitaDomiciliarMasterTransport->appendChild($headerTransport);
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('profissionalCNS', $fichaProfissional->usuario->cidadao->cns ?? ''));
|
||||
$headerTransport->appendChild($dom->createElement('cboCodigo_2002', $fichaProfissional->ocupacao->codigo ));
|
||||
$headerTransport->appendChild($dom->createElement('cnes', $fichaProfissional->equipe->unidade->cnes));
|
||||
|
||||
if($fichaProfissional->equipe->area->numero_ine){
|
||||
|
||||
$headerTransport->appendChild($dom->createElement('ine', $fichaProfissional->equipe->area->numero_ine));
|
||||
}
|
||||
$headerTransport->appendChild($dom->createElement('dataAtendimento', strtotime($fichaProfissional->data_usuario_responsavel) * 1000));
|
||||
$headerTransport->appendChild($dom->createElement('codigoIbgeMunicipio', $fichaProfissional->equipe->infraestrutura->endereco->logradouro->municipio->ibge));
|
||||
|
||||
$dom->appendChild($dadoTransporteTransportXml);
|
||||
|
||||
$fichasVisitaDomiciliar = VisitaDomiciliar::whereNull('exportacao_id')
|
||||
->when($somenteMesAno,
|
||||
fn ($q) => $q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', substr($mes_ano, 0, 2)),
|
||||
fn ($q) => $q->where(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', '>', substr($mes_ano, 2))
|
||||
->orWhere(function ($q) use ($mes_ano) {
|
||||
$q->whereYear('data_usuario_responsavel', substr($mes_ano, 2))
|
||||
->whereMonth('data_usuario_responsavel', '>=', substr($mes_ano, 0, 2));
|
||||
});
|
||||
})
|
||||
)
|
||||
->where('usuario_id', $fichaProfissional->usuario_id)
|
||||
->where('equipe_id', $fichaProfissional->equipe_id)
|
||||
->where('usuario_ocupacao_id', $fichaProfissional->usuario_ocupacao_id)
|
||||
->whereDate('data_usuario_responsavel', $fichaProfissional->data_usuario_responsavel)
|
||||
->take(99)
|
||||
->get();
|
||||
|
||||
foreach ($fichasVisitaDomiciliar as $i => $fichaVisitaDomiciliar) {
|
||||
|
||||
$visitasDomiciliaresPosicoes->push([
|
||||
'posicao' => $i + 1,
|
||||
'id' => $fichaVisitaDomiciliar->id,
|
||||
]);
|
||||
|
||||
$visitasDomiciliares = $dom->createElement('visitasDomiciliares');
|
||||
$fichaVisitaDomiciliarMasterTransport->appendChild($visitasDomiciliares);
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('turno', $fichaVisitaDomiciliar->turno_id));
|
||||
|
||||
$cadastroDomiciliar = null;
|
||||
$foraArea = null;
|
||||
|
||||
if (isset($fichaVisitaDomiciliar->paciente)){
|
||||
$cadastroDomiciliar = CadastroDomiciliar::where('domicilio_id', $fichaVisitaDomiciliar->paciente->cidadao->domicilio_id)->first();
|
||||
|
||||
if ($cadastroDomiciliar) {
|
||||
|
||||
$foraArea = $cadastroDomiciliar->fora_area ? 'true' : 'false';
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($fichaVisitaDomiciliar->paciente)
|
||||
&& $fichaVisitaDomiciliar->paciente->prontuario
|
||||
&& !in_array($fichaVisitaDomiciliar->imovel_tipo_id, [
|
||||
TipoImovel::COMERCIO,
|
||||
TipoImovel::TERRENO_BALDIO,
|
||||
TipoImovel::PONTO_ESTRATEGICO,
|
||||
TipoImovel::ESCOLA,
|
||||
TipoImovel::CRECHE,
|
||||
TipoImovel::ESTABELECIMENTO_RELIGIOSO
|
||||
])
|
||||
) {
|
||||
$visitasDomiciliares->appendChild($dom->createElement('numProntuario', $fichaVisitaDomiciliar->paciente->prontuario));
|
||||
}
|
||||
|
||||
if(isset($fichaVisitaDomiciliar->paciente->cidadao)
|
||||
&& !in_array($fichaVisitaDomiciliar->imovel_tipo_id, [
|
||||
TipoImovel::COMERCIO,
|
||||
TipoImovel::TERRENO_BALDIO,
|
||||
TipoImovel::PONTO_ESTRATEGICO,
|
||||
TipoImovel::ESCOLA,
|
||||
TipoImovel::CRECHE,
|
||||
TipoImovel::ESTABELECIMENTO_RELIGIOSO
|
||||
])
|
||||
){
|
||||
|
||||
if (Cns::isValid($fichaVisitaDomiciliar->paciente->cidadao->cns)) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('cnsCidadao', $fichaVisitaDomiciliar->paciente->cidadao->cns ?? ''));
|
||||
}
|
||||
|
||||
if (!Cns::isValid($fichaVisitaDomiciliar->paciente->cidadao->cns)) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('cpfCidadao', $fichaVisitaDomiciliar->paciente->cidadao->cpf ?? ''));
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->paciente->cidadao->data_nascimento) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('dtNascimento', strtotime($fichaVisitaDomiciliar->paciente->cidadao->data_nascimento->format('Y-m-d')) * 1000));
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->paciente->cidadao->sexo->id) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('sexo', self::sexo($fichaVisitaDomiciliar->paciente->cidadao->sexo->id)));
|
||||
}
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->visita_compartilhada) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('statusVisitaCompartilhadaOutroProfissional', $fichaVisitaDomiciliar->visita_compartilhada ? 'true' : 'false'));
|
||||
}
|
||||
|
||||
if($fichaVisitaDomiciliar->desfecho_id == VisitaDomiciliarDesfecho::VISITA_REALIZADA){
|
||||
|
||||
self::getMotivoVisita($dom, $fichaVisitaDomiciliar, $visitasDomiciliares);
|
||||
}
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('desfecho', $fichaVisitaDomiciliar->desfecho->codigo_esus));
|
||||
|
||||
if ($cadastroDomiciliar) {
|
||||
|
||||
if ($foraArea == 'false' && $cadastroDomiciliar->microarea) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('microArea', str_pad($cadastroDomiciliar->microarea->descricao, 2, '0', STR_PAD_LEFT)));
|
||||
|
||||
}
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('stForaArea', $foraArea));
|
||||
}
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('tipoDeImovel', $fichaVisitaDomiciliar->imovelTipo->codigo_esus));
|
||||
|
||||
if ($fichaVisitaDomiciliar->peso) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('pesoAcompanhamentoNutricional', $fichaVisitaDomiciliar->peso));
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->altura) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('alturaAcompanhamentoNutricional', $fichaVisitaDomiciliar->altura));
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->afericao_pa) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('pressaoSistolica', substr($fichaVisitaDomiciliar->afericao_pa, 0, 3)));
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->afericao_pa) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('pressaoDiastolica', substr($fichaVisitaDomiciliar->afericao_pa, -3)));
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->temperatura) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('temperatura', $fichaVisitaDomiciliar->temperatura));
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->glicemia) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('glicemia', $fichaVisitaDomiciliar->glicemia));
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->momento_coleta_id) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('tipoGlicemia', $fichaVisitaDomiciliar->momentoColeta->codigo_esus));
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->latitude) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('latitude', $fichaVisitaDomiciliar->latitude));
|
||||
}
|
||||
|
||||
if ($fichaVisitaDomiciliar->longitude) {
|
||||
|
||||
$visitasDomiciliares->appendChild($dom->createElement('longitude', $fichaVisitaDomiciliar->longitude));
|
||||
}
|
||||
|
||||
self::getIvcf($dom, $fichaVisitaDomiciliar, $visitasDomiciliares);
|
||||
|
||||
$fichaVisitaDomiciliar->uuid_ficha = $uuid;
|
||||
$fichaVisitaDomiciliar->exportacao_id = $exportacao->id;
|
||||
$fichaVisitaDomiciliar->data_hora_exportacao = Carbon::now()->format('Y-m-d H:i:s');
|
||||
$fichaVisitaDomiciliar->usuario_exportacao_id = $usuarioId ?? self::getCurrentLotacao()->usuario_id ?? null;
|
||||
|
||||
retry(3, function() use ($fichaVisitaDomiciliar) {
|
||||
$fichaVisitaDomiciliar->save();
|
||||
}, 200);
|
||||
}
|
||||
|
||||
ExportacaoService::elementRemetente($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementOriginadora($dom, $dadoTransporteTransportXml);
|
||||
ExportacaoService::elementVersao($dom, $dadoTransporteTransportXml);
|
||||
|
||||
return [
|
||||
'exportacao' => $exportacao,
|
||||
'dom' => $dom,
|
||||
'visitas_domiciliares' => $visitasDomiciliaresPosicoes,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getMotivoVisita($dom, $fichaVisitaDomiciliar, $visitasDomiciliares) {
|
||||
|
||||
$fichaVisitaDomiciliarMotivoVisita = DB::table('atencao_basica_visita_domiciliar_motivo_visita')
|
||||
->select([
|
||||
'atencao_basica_cadastro_motivo_visita.codigo_esus',
|
||||
])
|
||||
->join(
|
||||
'atencao_basica_cadastro_motivo_visita',
|
||||
'atencao_basica_cadastro_motivo_visita.id',
|
||||
'atencao_basica_visita_domiciliar_motivo_visita.motivo_visita_id'
|
||||
)
|
||||
->where('atencao_basica_visita_domiciliar_motivo_visita.visita_domiciliar_id', $fichaVisitaDomiciliar->id)
|
||||
->first();
|
||||
|
||||
if($fichaVisitaDomiciliarMotivoVisita){
|
||||
$visitasDomiciliares->appendChild($dom->createElement('motivosVisita', $fichaVisitaDomiciliarMotivoVisita->codigo_esus));
|
||||
}
|
||||
}
|
||||
|
||||
private static function sexo($sexo_id)
|
||||
{
|
||||
return $sexo_id
|
||||
? ($sexo_id == Sexo::MASCULINO ? ExportacaoSexo::MASCULINO : ExportacaoSexo::FEMININO)
|
||||
: ExportacaoSexo::IGNORADO;
|
||||
}
|
||||
|
||||
private static function getIvcf(&$dom, $atendimento, &$visitasDomiciliares)
|
||||
{
|
||||
$visitaDomiciliarIvcf = VisitaDomiciliarIvcf::where('visita_domiciliar_id', $atendimento->id)->first();
|
||||
|
||||
if ($visitaDomiciliarIvcf) {
|
||||
$pacienteIdade = $visitaDomiciliarIvcf->visitaDomiciliar->paciente->cidadao->idade['anos'] ?? null;
|
||||
|
||||
$resultado = null;
|
||||
$hasSgIdade = true;
|
||||
$hasSgPercepcaoSaude = false;
|
||||
$hasSgAvdInstrumental = false;
|
||||
$hasSgAvdBasica = false;
|
||||
$hasSgCognicao = false;
|
||||
$hasSgHumor = false;
|
||||
$hasSgAlcancePreensaoPinca = false;
|
||||
$hasSgCapAerobicaMuscular = false;
|
||||
$hasSgMarcha = false;
|
||||
$hasSgContinencia = false;
|
||||
$hasSgVisao = false;
|
||||
$hasSgAudicao = false;
|
||||
$hasSgComorbidade = false;
|
||||
$dataAtendimento = strtotime($atendimento->data_usuario_responsavel) * 1000;
|
||||
$dataResultado = min(strtotime($visitaDomiciliarIvcf->updated_at) * 1000, $dataAtendimento);
|
||||
|
||||
if ($pacienteIdade >= 75 && $pacienteIdade <= 84) {
|
||||
$resultado += 1;
|
||||
}
|
||||
else if ($pacienteIdade >= 85) {
|
||||
$resultado += 3;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->estado_saude_geral === 'regular_ou_ruim') {
|
||||
$resultado += 1;
|
||||
$hasSgPercepcaoSaude = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->limitacao_compras || $visitaDomiciliarIvcf->limitacao_gestao_financeira || $visitaDomiciliarIvcf->limitacao_tarefas_domesticas) {
|
||||
$resultado += 4;
|
||||
$hasSgAvdInstrumental = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->banho_independencia) {
|
||||
$resultado += 6;
|
||||
$hasSgAvdBasica = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->relato_esquecimento_por_terceiros) {
|
||||
$resultado += 1;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->esquecimento_piorando) {
|
||||
$resultado += 1;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->esquecimento_impacta_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgCognicao = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->humor_tristeza_desanimo) {
|
||||
$resultado += 2;
|
||||
$hasSgHumor = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->perda_interesse_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgHumor = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->limitacao_elevar_bracos) {
|
||||
$resultado += 1;
|
||||
$hasSgAlcancePreensaoPinca = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->limitacao_motricidade_fina) {
|
||||
$resultado += 1;
|
||||
$hasSgAlcancePreensaoPinca = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->perda_peso_nao_intencional || $visitaDomiciliarIvcf->imc_abaixo_22 || $visitaDomiciliarIvcf->panturrilha_abaixo_31 || $visitaDomiciliarIvcf->marcha_lenta_4m_maior_5s) {
|
||||
$resultado += 2;
|
||||
$hasSgCapAerobicaMuscular = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->dificuldade_caminhar_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgMarcha = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->quedas_recorrentes) {
|
||||
$resultado += 2;
|
||||
$hasSgMarcha = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->incontinencia) {
|
||||
$resultado += 2;
|
||||
$hasSgContinencia = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->problema_visao_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgVisao = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->problema_audicao_impacto_atividades) {
|
||||
$resultado += 2;
|
||||
$hasSgAudicao = true;
|
||||
}
|
||||
|
||||
if ($visitaDomiciliarIvcf->doencas_cronicas_multiplas || $visitaDomiciliarIvcf->polifarmacia_5_ou_mais_medicamentos || $visitaDomiciliarIvcf->internacao_ultimos_6_meses) {
|
||||
$resultado += 4;
|
||||
$hasSgComorbidade = true;
|
||||
}
|
||||
|
||||
$ivcf = $dom->createElement('ivcf');
|
||||
$visitasDomiciliares->appendChild($ivcf);
|
||||
|
||||
$ivcf->appendChild($dom->createElement('resultado', $resultado));
|
||||
$ivcf->appendChild($dom->createElement('hasSgIdade', $hasSgIdade ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgPercepcaoSaude', $hasSgPercepcaoSaude ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAvdInstrumental', $hasSgAvdInstrumental ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAvdBasica', $hasSgAvdBasica ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgCognicao', $hasSgCognicao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgHumor', $hasSgHumor ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAlcancePreensaoPinca', $hasSgAlcancePreensaoPinca ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgCapAerobicaMuscular', $hasSgCapAerobicaMuscular ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgMarcha', $hasSgMarcha ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgContinencia', $hasSgContinencia ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgVisao', $hasSgVisao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgAudicao', $hasSgAudicao ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('hasSgComorbidade', $hasSgComorbidade ? 'true' : 'false'));
|
||||
$ivcf->appendChild($dom->createElement('dataResultado', $dataResultado));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user