203 lines
9.6 KiB
PHP
203 lines
9.6 KiB
PHP
<?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;
|
|
}
|
|
}
|