This commit is contained in:
@@ -0,0 +1,232 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\AtencaoBasica\RelatorioInconsistencia;
|
||||
|
||||
use App\Enums\AtencaoBasica\Exportacao\Inconsistencia;
|
||||
use App\Enums\AtencaoBasica\Parametrizacao\Permissao;
|
||||
use App\Rules\AtencaoBasica\Exportacao\CnesIsValid;
|
||||
use App\Rules\AtencaoBasica\Exportacao\CnsPaciente;
|
||||
use App\Rules\AtencaoBasica\Exportacao\DataAtendimentoIsValid;
|
||||
use App\Rules\AtencaoBasica\Exportacao\ExameIsRequired;
|
||||
use App\Rules\AtencaoBasica\Exportacao\ExameIsValid;
|
||||
use App\Rules\AtencaoBasica\Exportacao\IbgeIsValid;
|
||||
use App\Rules\AtencaoBasica\Exportacao\OcupacaoIsAllowed;
|
||||
use App\Rules\AtencaoBasica\Exportacao\TurnoIsRequired;
|
||||
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 FichaComplementarService 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,
|
||||
TurnoIsRequired::class => Inconsistencia::TURNO_SEM_PREENCHIMENTO,
|
||||
ExameIsRequired::class => Inconsistencia::NENHUM_EXAME_PREENCHIDO,
|
||||
ExameIsValid::class => Inconsistencia::EXAME_COM_DATA_PREENCHIDA_E_SEM_RESULTADO,
|
||||
];
|
||||
|
||||
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');
|
||||
|
||||
$fichasComplementar = DB::table('atencao_basica_ficha_complementar')
|
||||
->select([
|
||||
'atencao_basica_ficha_complementar.id as id',
|
||||
'atencao_basica_ficha_complementar.usuario_id as usuario_id',
|
||||
'atencao_basica_ficha_complementar.data_atendimento 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'),
|
||||
'atencao_basica_ficha_complementar.turno_id',
|
||||
'atencao_basica_ficha_complementar.paciente_id',
|
||||
'atencao_basica_ficha_complementar.data_realizacao_teste_olhinho',
|
||||
'atencao_basica_ficha_complementar.resultado_teste_olhinho_id',
|
||||
'atencao_basica_ficha_complementar.data_realizacao_fundo_olho',
|
||||
'atencao_basica_ficha_complementar.resultado_fundo_olho_id',
|
||||
'atencao_basica_ficha_complementar.data_realizacao_teste_orelhinha',
|
||||
'atencao_basica_ficha_complementar.resultado_teste_orelhinha_id',
|
||||
'atencao_basica_ficha_complementar.data_realizacao_us_transfontanela',
|
||||
'atencao_basica_ficha_complementar.resultado_us_transfontanela_id',
|
||||
'atencao_basica_ficha_complementar.data_realizacao_tomografia_computadorizada',
|
||||
'atencao_basica_ficha_complementar.resultado_tomografia_computadorizada_id',
|
||||
'atencao_basica_ficha_complementar.data_realizacao_ressonancia_magnetica',
|
||||
'atencao_basica_ficha_complementar.resultado_ressonancia_magnetica_id',
|
||||
])
|
||||
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_ficha_complementar.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_ficha_complementar.usuario_id')
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
||||
->join('sigtap.ocupacao', 'sigtap.ocupacao.id', 'atencao_basica_ficha_complementar.cbo_id')
|
||||
->join('cadastro_paciente', 'cadastro_paciente.id', 'atencao_basica_ficha_complementar.paciente_id')
|
||||
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'cadastro_paciente.cidadao_id')
|
||||
->whereBetween('atencao_basica_ficha_complementar.data_atendimento', [$start, $end])
|
||||
->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_ficha_complementar.usuario_id', request()->usuario_id))
|
||||
->get();
|
||||
|
||||
if ($fichasComplementar->isEmpty()) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$responsaveisPorPaciente = self::loadResponsaveis(
|
||||
$fichasComplementar->pluck('paciente_id')->unique()->all()
|
||||
);
|
||||
|
||||
$groupedList = [];
|
||||
|
||||
foreach ($fichasComplementar as $ficha) {
|
||||
|
||||
$errosHeader = RelatorioInconsistenciaService::validHeader($ficha, Permissao::FICHA_COMPLEMENTAR);
|
||||
$errosAtendimento = self::validAtendimento($ficha);
|
||||
|
||||
$errors = $errosHeader->merge($errosAtendimento);
|
||||
$errorDescriptions = self::mapErrorsToDescriptions($errors, $inconsistencias);
|
||||
|
||||
if ($errosAtendimento->isNotEmpty()) {
|
||||
|
||||
$responsavel = $responsaveisPorPaciente[$ficha->paciente_id] ?? null;
|
||||
|
||||
if ($responsavel && !Cns::isValid($responsavel->cns) && !Cpf::isValid($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' => 'Ficha complementar',
|
||||
'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($atendimento): Collection
|
||||
{
|
||||
$errors = collect();
|
||||
|
||||
if (!Cns::isValid($atendimento->paciente_cns) && !Cpf::isValid($atendimento->paciente_cpf)) {
|
||||
$errors->push(CnsPaciente::class);
|
||||
$errors->push(Cpf::class);
|
||||
}
|
||||
|
||||
if (!TurnoIsRequired::isValid($atendimento->turno_id)) {
|
||||
$errors->push(TurnoIsRequired::class);
|
||||
}
|
||||
|
||||
if (!ExameIsRequired::isValid($atendimento)) {
|
||||
$errors->push(ExameIsRequired::class);
|
||||
}
|
||||
|
||||
if (!ExameIsValid::isValid($atendimento)) {
|
||||
$errors->push(ExameIsValid::class);
|
||||
}
|
||||
|
||||
return $errors;
|
||||
}
|
||||
|
||||
private static function loadResponsaveis(array $pacienteIds): array
|
||||
{
|
||||
if (empty($pacienteIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return DB::table('atencao_basica_cadastro_individual')
|
||||
->whereIn('paciente_id', $pacienteIds)
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'atencao_basica_cadastro_individual.responsavel_cidadao_id')
|
||||
->select(
|
||||
'atencao_basica_cadastro_individual.paciente_id',
|
||||
'cadastro_cidadao.cns',
|
||||
'cadastro_cidadao.cpf'
|
||||
)
|
||||
->get()
|
||||
->keyBy('paciente_id')
|
||||
->all();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user