283 lines
14 KiB
PHP
283 lines
14 KiB
PHP
<?php
|
|
|
|
namespace App\Services\AtencaoBasica\RelatorioInconsistencia;
|
|
|
|
use App\Enums\AtencaoBasica\Exportacao\Inconsistencia;
|
|
use App\Enums\AtencaoBasica\Parametrizacao\Permissao;
|
|
use App\Enums\Cadastro\SujeitoAtencao\LocalNascimento;
|
|
use App\Enums\Cadastro\SujeitoAtencao\Nacionalidade;
|
|
use App\Enums\Cadastro\SujeitoAtencao\RacaCor;
|
|
use App\Rules\AtencaoBasica\Exportacao\AlimentosAcabaramIsRequired;
|
|
use App\Rules\AtencaoBasica\Exportacao\CnesIsValid;
|
|
use App\Rules\AtencaoBasica\Exportacao\CnsPaciente;
|
|
use App\Rules\AtencaoBasica\Exportacao\ComeuALgunsAlimentosIsRequired;
|
|
use App\Rules\AtencaoBasica\Exportacao\DataAtendimentoIsValid;
|
|
use App\Rules\AtencaoBasica\Exportacao\DataEntradaIsRequired;
|
|
use App\Rules\AtencaoBasica\Exportacao\DataNascimentoIsRequired;
|
|
use App\Rules\AtencaoBasica\Exportacao\DataNascimentoIsValid;
|
|
use App\Rules\AtencaoBasica\Exportacao\EtniaIndigenaIsRequired;
|
|
use App\Rules\AtencaoBasica\Exportacao\IbgeIsValid;
|
|
use App\Rules\AtencaoBasica\Exportacao\OcupacaoIsAllowed;
|
|
use App\Rules\AtencaoBasica\Exportacao\PaisNascimentoIsRequired;
|
|
use App\Rules\AtencaoBasica\Exportacao\PaisNascimentoIsValid;
|
|
use App\Rules\AtencaoBasica\Exportacao\RacaCorIsRequired;
|
|
use App\Rules\AtencaoBasica\Exportacao\SexoIsRequired;
|
|
use App\Rules\AtencaoBasica\Exportacao\TelefoneIsRequired;
|
|
use App\Rules\Cns;
|
|
use App\Rules\Cpf;
|
|
use App\Services\Service;
|
|
use App\Utils\MaskUtil;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class FichaCadastroIndividualService extends Service
|
|
{
|
|
private const ERROR_MAP = [
|
|
CnesIsValid::class => Inconsistencia::CNES_DA_UNIDADE_COM_TAMANHO_DIFERENTE_DE_7_CARACTERES,
|
|
IbgeIsValid::class => Inconsistencia::IBGE_DO_MUNICIPIO_SEM_PREENCHIMENTO_OU_INVALIDO,
|
|
Cns::class => Inconsistencia::CNS_DO_PROFISSIONAL_INVALIDO,
|
|
OcupacaoIsAllowed::class => Inconsistencia::OCUPACAO_DO_USUARIO_SEM_PERMISSAO_PARA_REGISTRAR_A_FICHA,
|
|
DataAtendimentoIsValid::class => Inconsistencia::DATA_ATENDIMENTO_INVALIDO,
|
|
CnsPaciente::class => Inconsistencia::CNS_DO_PACIENTE_INVALIDO,
|
|
Cpf::class => Inconsistencia::CPF_DO_PACIENTE_INVALIDO,
|
|
DataNascimentoIsRequired::class => Inconsistencia::DATA_NASCIMENTO_SEM_PREENCHIMENTO,
|
|
DataNascimentoIsValid::class => Inconsistencia::DATA_DE_NASCIMENTO_POSTERIOR_A_DATA_DE_ATENDIMENTO_SUPERIOR_A_130_ANOS_OU_NAO_PREENCHIDA,
|
|
SexoIsRequired::class => Inconsistencia::SEXO_DO_PACIENTE_SEM_PREENCHIMENTO,
|
|
RacaCorIsRequired::class => Inconsistencia::RACA_COR_SEM_PREENCHIMENTO,
|
|
TelefoneIsRequired::class => Inconsistencia::TELEFONE_CELULAR_INVALIDO,
|
|
PaisNascimentoIsRequired::class => Inconsistencia::PAIS_NASCIMENTO_SEM_PREENCHIMENTO,
|
|
DataEntradaIsRequired::class => Inconsistencia::DATA_ENTRADA_BRASIL_SEM_PREENCHIMENTO,
|
|
PaisNascimentoIsValid::class => Inconsistencia::PAIS_NASCIMENTO_INVALIDO,
|
|
EtniaIndigenaIsRequired::class => Inconsistencia::ETNIA_SEM_PREENCHIMENTO_QUANDO_RACA_DO_PACIENTE_E_INDIGENA,
|
|
AlimentosAcabaramIsRequired::class => Inconsistencia::ALIMENTOS_ACABARAM_SEM_PREENCHIMENTO,
|
|
ComeuALgunsAlimentosIsRequired::class => Inconsistencia::COMEU_APENAS_ALGUNS_ALIMENTOS_SEM_PREENCHIMENTO,
|
|
];
|
|
|
|
public static function index()
|
|
{
|
|
$mes_ano = request()->mes_ano;
|
|
$date = Carbon::createFromFormat('mY', $mes_ano);
|
|
$start = $date->copy()->startOfMonth()->toDateString();
|
|
$end = $date->copy()->endOfMonth()->toDateString();
|
|
|
|
$inconsistencias = DB::table('atencao_basica_inconsistencia')
|
|
->select('id', 'descricao')
|
|
->get()
|
|
->pluck('descricao', 'id');
|
|
|
|
$fichasCadastroIndividual = DB::table('atencao_basica_cadastro_individual')
|
|
->select([
|
|
'atencao_basica_cadastro_individual.id as id',
|
|
'atencao_basica_cadastro_individual.usuario_id as usuario_id',
|
|
'atencao_basica_cadastro_individual.alimentos_acabaram',
|
|
'atencao_basica_cadastro_individual.comeu_alguns_alimentos',
|
|
'atencao_basica_cadastro_individual.data_usuario_responsavel as data_atendimento',
|
|
'cadastro_unidade.cnes as unidade_cnes',
|
|
'cadastro_municipio.ibge as municipio_ibge',
|
|
'sigtap.ocupacao.codigo as ocupacao_codigo',
|
|
'cadastro_cidadao.cns AS usuario_cns',
|
|
'cadastro_cidadao.nome AS profissional_nome',
|
|
'paciente_cidadao.cns as paciente_cns',
|
|
'paciente_cidadao.cpf as paciente_cpf',
|
|
'paciente_cidadao.nome as paciente_nome',
|
|
'paciente_cidadao.nome_social as paciente_nome_social',
|
|
'paciente_cidadao.preferencia_nome_id as paciente_preferencia_nome_id',
|
|
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS paciente_prontuario'),
|
|
'responsavel_cidadao.cns as responsavel_cns',
|
|
'responsavel_cidadao.cpf as responsavel_cpf',
|
|
'paciente_cidadao.data_nascimento as paciente_data_nascimento',
|
|
'paciente_cidadao.sexo_id as paciente_sexo_id',
|
|
'paciente_cidadao.raca_cor_id as paciente_raca_cor_id',
|
|
'atencao_basica_cadastro_individual.paciente_id',
|
|
'atencao_basica_cadastro_individual.responsavel_cidadao_id',
|
|
'paciente_cidadao.nacionalidade_id',
|
|
'paciente_cidadao.pais_nascimento_id',
|
|
'paciente_cidadao.etnia_indigena_id',
|
|
'paciente_cidadao.local_nascimento_id',
|
|
'entrada_brasil.data_entrada',
|
|
DB::raw("
|
|
(
|
|
SELECT numero
|
|
FROM cadastro_cidadao_telefone
|
|
WHERE cadastro_cidadao_telefone.cidadao_id = paciente_cidadao.id
|
|
AND cadastro_cidadao_telefone.principal = TRUE
|
|
LIMIT 1
|
|
) AS paciente_telefone
|
|
"),
|
|
])
|
|
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_cadastro_individual.equipe_id')
|
|
->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
|
|
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id')
|
|
->leftJoin('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_infraestrutura.endereco_id')
|
|
->leftJoin('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id')
|
|
->leftJoin('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id')
|
|
->join('cadastro_usuario', 'cadastro_usuario.id', 'atencao_basica_cadastro_individual.usuario_id')
|
|
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
|
->join('sigtap.ocupacao', 'sigtap.ocupacao.id', 'atencao_basica_cadastro_individual.usuario_ocupacao_id')
|
|
->join('cadastro_paciente', 'cadastro_paciente.id', 'atencao_basica_cadastro_individual.paciente_id')
|
|
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'cadastro_paciente.cidadao_id')
|
|
->leftJoin('cadastro_cidadao as responsavel_cidadao', 'responsavel_cidadao.id', 'atencao_basica_cadastro_individual.responsavel_cidadao_id')
|
|
->leftJoin('cadastro_estrangeiro_entrada_brasil as entrada_brasil', 'entrada_brasil.cidadao_id', 'paciente_cidadao.id')
|
|
->whereBetween('atencao_basica_cadastro_individual.data_usuario_responsavel', [$start, $end])
|
|
->whereNull('cadastro_paciente.deleted_at')
|
|
->when(request()->unidade_id, fn ($query) => $query->where('atencao_basica_parametrizacao_equipe.unidade_id', request()->unidade_id))
|
|
->when(request()->infraestrutura_id, fn ($query) => $query->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', request()->infraestrutura_id))
|
|
->when(request()->usuario_id, fn ($query) => $query->where('atencao_basica_cadastro_individual.usuario_id', request()->usuario_id))
|
|
->get();
|
|
|
|
$groupedList = [];
|
|
|
|
foreach ($fichasCadastroIndividual as $ficha) {
|
|
|
|
$errosHeader = RelatorioInconsistenciaService::validHeader($ficha, Permissao::CADASTRO_INDIVIDUAL);
|
|
$errosAtendimento = self::validAtendimento($ficha);
|
|
|
|
$errors = $errosHeader->merge($errosAtendimento);
|
|
$errorDescriptions = self::mapErrorsToDescriptions($errors, $inconsistencias);
|
|
|
|
if (
|
|
$errosAtendimento->isNotEmpty()
|
|
&& $ficha->responsavel_cidadao_id
|
|
&& !Cns::isValid($ficha->responsavel_cns)
|
|
&& !Cpf::isValid($ficha->responsavel_cpf)
|
|
) {
|
|
|
|
$descricao = $inconsistencias[Inconsistencia::CNS_DO_RESPONSAVEL_FAMILIAR_INVALIDO] ?? null;
|
|
|
|
if ($descricao !== null) {
|
|
$errorDescriptions->push($descricao);
|
|
}
|
|
}
|
|
|
|
if ($errorDescriptions->isEmpty()) {
|
|
continue;
|
|
}
|
|
|
|
$key = $ficha->data_atendimento . '|' . $ficha->paciente_id . '|' . $ficha->usuario_id;
|
|
|
|
if (!isset($groupedList[$key])) {
|
|
|
|
$groupedList[$key] = [
|
|
'data' => (new Carbon($ficha->data_atendimento))->format('d/m/Y'),
|
|
'ficha' => 'Cadastro individual',
|
|
'paciente_nome' => $ficha->paciente_nome,
|
|
'paciente_nome_social' => $ficha->paciente_nome_social,
|
|
'paciente_preferencia_nome_id' => $ficha->paciente_preferencia_nome_id,
|
|
'paciente_prontuario' => $ficha->paciente_prontuario,
|
|
'paciente_cns' => $ficha->paciente_cns ? MaskUtil::getCnsMasked($ficha->paciente_cns) : '-',
|
|
'paciente_cpf' => $ficha->paciente_cpf ? MaskUtil::getCpfMasked($ficha->paciente_cpf) : '-',
|
|
'profissional' => $ficha->profissional_nome,
|
|
'erros' => $errorDescriptions,
|
|
];
|
|
} else {
|
|
$groupedList[$key]['erros'] = $groupedList[$key]['erros']->merge($errorDescriptions);
|
|
}
|
|
}
|
|
|
|
$result = [];
|
|
|
|
foreach ($groupedList as $group) {
|
|
|
|
$unique = $group['erros']->unique();
|
|
$group['erros'] = $unique->implode('<br />');
|
|
$group['total_erros'] = $unique->count();
|
|
$result[] = $group;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
private static function mapErrorsToDescriptions(Collection $errors, Collection $inconsistencias): Collection
|
|
{
|
|
$descriptions = collect();
|
|
|
|
foreach ($errors as $error) {
|
|
|
|
$inconsistenciaId = self::ERROR_MAP[$error] ?? null;
|
|
|
|
if ($inconsistenciaId === null) {
|
|
continue;
|
|
}
|
|
|
|
$descricao = $inconsistencias[$inconsistenciaId] ?? null;
|
|
|
|
if ($descricao !== null) {
|
|
$descriptions->push($descricao);
|
|
}
|
|
}
|
|
|
|
return $descriptions;
|
|
}
|
|
|
|
private static function validAtendimento($cadastro): Collection
|
|
{
|
|
$errors = collect();
|
|
|
|
if (!Cns::isValid($cadastro->paciente_cns) && !Cpf::isValid($cadastro->paciente_cpf)) {
|
|
$errors->push(CnsPaciente::class);
|
|
$errors->push(Cpf::class);
|
|
}
|
|
|
|
if (!DataNascimentoIsRequired::isValid($cadastro->paciente_data_nascimento)) {
|
|
$errors->push(DataNascimentoIsRequired::class);
|
|
}
|
|
|
|
if (!DataNascimentoIsValid::isValid([
|
|
'data_nascimento' => $cadastro->paciente_data_nascimento,
|
|
'data_atendimento' => $cadastro->data_atendimento
|
|
])) {
|
|
$errors->push(DataNascimentoIsValid::class);
|
|
}
|
|
|
|
if (!SexoIsRequired::isValid($cadastro->paciente_sexo_id)) {
|
|
$errors->push(SexoIsRequired::class);
|
|
}
|
|
|
|
if (!RacaCorIsRequired::isValid($cadastro->paciente_raca_cor_id)) {
|
|
$errors->push(RacaCorIsRequired::class);
|
|
}
|
|
|
|
if ($cadastro->paciente_raca_cor_id == RacaCor::SEM_INFORMACAO) {
|
|
$errors->push(RacaCorIsRequired::class);
|
|
}
|
|
|
|
if (($cadastro->nacionalidade_id == Nacionalidade::BRASILEIRO || $cadastro->nacionalidade_id == Nacionalidade::NATURALIZADO_BRASILEIRO)
|
|
&& !TelefoneIsRequired::isValid($cadastro->paciente_telefone)) {
|
|
$errors->push(TelefoneIsRequired::class);
|
|
}
|
|
|
|
if ($cadastro->nacionalidade_id == Nacionalidade::ESTRANGEIRO && !PaisNascimentoIsRequired::isValid($cadastro->pais_nascimento_id)) {
|
|
$errors->push(PaisNascimentoIsRequired::class);
|
|
}
|
|
|
|
if ($cadastro->nacionalidade_id == LocalNascimento::EM_OUTRO_PAIS && !DataEntradaIsRequired::isValid($cadastro->data_entrada) && $cadastro->nacionalidade_id == Nacionalidade::ESTRANGEIRO) {
|
|
$errors->push(DataEntradaIsRequired::class);
|
|
}
|
|
|
|
if ($cadastro->nacionalidade_id == Nacionalidade::BRASILEIRO && !PaisNascimentoIsValid::isValid($cadastro->pais_nascimento_id)) {
|
|
$errors->push(PaisNascimentoIsValid::class);
|
|
}
|
|
|
|
if ($cadastro->paciente_raca_cor_id == RacaCor::INDIGENA && !EtniaIndigenaIsRequired::isValid($cadastro->etnia_indigena_id)) {
|
|
$errors->push(EtniaIndigenaIsRequired::class);
|
|
}
|
|
|
|
if (
|
|
(!is_null($cadastro->comeu_alguns_alimentos) && ($cadastro->comeu_alguns_alimentos == true || $cadastro->comeu_alguns_alimentos == false))
|
|
&& $cadastro->alimentos_acabaram === null
|
|
) {
|
|
$errors->push(AlimentosAcabaramIsRequired::class);
|
|
}
|
|
|
|
if (
|
|
(!is_null($cadastro->alimentos_acabaram) && ($cadastro->alimentos_acabaram == true || $cadastro->alimentos_acabaram == false))
|
|
&& $cadastro->comeu_alguns_alimentos === null
|
|
) {
|
|
$errors->push(ComeuALgunsAlimentosIsRequired::class);
|
|
}
|
|
|
|
return $errors;
|
|
}
|
|
}
|