Files
rkm-conectasus-ci-sandbox/api/app/Http/Controllers/Cadastro/SujeitoAtencao/PacienteController.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

2612 lines
128 KiB
PHP

<?php
namespace App\Http\Controllers\Cadastro\SujeitoAtencao;
use App\Enums\AtencaoBasica\CadastroDomiciliar\CadastroTratamento as enumsTratamento;
use App\Enums\AtencaoBasica\CadastroDomiciliar\CadastroDestinoLixo as enumsDestinoLixo;
use App\Enums\AtencaoBasica\CadastroIndividual\SaidaCidadao as EnumSaidaCidadao;
use App\Enums\AtencaoBasica\Parametrizacao\Permissao;
use App\Enums\Cadastro\SujeitoAtencao\Classificacao;
use App\Enums\Cadastro\SujeitoAtencao\Deficiencia;
use App\Enums\Cadastro\SujeitoAtencao\FatorRisco;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Enums\Cadastro\SujeitoAtencao\Subclassificacao;
use App\Enums\Geral\MedidaTempo;
use App\Exceptions\AtencaoBasica\ParametrizacaoAtendimentoCboException;
use App\Exceptions\Cadastro\SujeitoAtencao\AlteracaoCadastroPacienteNaoPermitidoException;
use App\Http\Controllers\Controller;
use App\Http\Requests\Cadastro\SujeitoAtencao\PacienteRequest;
use App\Models\AtencaoBasica\AtendimentoIndividual\EscalaCoelho;
use App\Models\AtencaoBasica\CadastroDomiciliar\Abastecimento;
use App\Models\AtencaoBasica\CadastroDomiciliar\Animal;
use App\Models\AtencaoBasica\CadastroDomiciliar\CadastroDomiciliar;
use App\Models\AtencaoBasica\CadastroDomiciliar\DestinoLixo;
use App\Models\AtencaoBasica\CadastroDomiciliar\DomicilioTipo;
use App\Models\AtencaoBasica\CadastroDomiciliar\DomicilioTipoAcesso;
use App\Models\AtencaoBasica\CadastroDomiciliar\FormaEscoamento;
use App\Models\AtencaoBasica\CadastroDomiciliar\HigieneResidencial;
use App\Models\AtencaoBasica\CadastroDomiciliar\ImovelTipo;
use App\Models\AtencaoBasica\CadastroDomiciliar\Lazer;
use App\Models\AtencaoBasica\CadastroDomiciliar\MaterialPredominante;
use App\Models\AtencaoBasica\CadastroDomiciliar\SituacaoDomicilio;
use App\Models\AtencaoBasica\CadastroDomiciliar\SituacaoRural;
use App\Models\AtencaoBasica\CadastroDomiciliar\Tratamento;
use App\Models\AtencaoBasica\CadastroIndividual\AcompanhamentoInfantil;
use App\Models\AtencaoBasica\CadastroIndividual\CadastroIndividual;
use App\Models\AtencaoBasica\CadastroIndividual\Curso;
use App\Models\AtencaoBasica\CadastroIndividual\DoencaCardiaca;
use App\Models\AtencaoBasica\CadastroIndividual\DoencaRespiratoria;
use App\Models\AtencaoBasica\CadastroIndividual\OrientacaoSexual;
use App\Models\AtencaoBasica\CadastroIndividual\Parentesco;
use App\Models\AtencaoBasica\CadastroIndividual\Peso;
use App\Models\AtencaoBasica\CadastroIndividual\ProblemasRins;
use App\Models\AtencaoBasica\CadastroIndividual\SaidaCidadao;
use App\Models\AtencaoBasica\CadastroIndividual\SituacaoMercadoTrabalho;
use App\Models\AtencaoBasica\Parametrizacao\OutrosPermissaoOcupacao;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Localizacao\DomicilioInformacaoResidencial;
use App\Models\Cadastro\Localizacao\Endereco;
use App\Models\Cadastro\Localizacao\Zona;
use App\Models\Cadastro\Parametrizacao\Parametrizacao;
use App\Models\Cadastro\Parametrizacao\ParametrizacaoPermissaoOcupacao;
use App\Models\Cadastro\Parametrizacao\ParametrizacaoPermissaoUsuario;
use App\Models\Cadastro\SujeitoAtencao\Cidadao;
use App\Models\Cadastro\SujeitoAtencao\CidadaoDomicilioHistorico;
use App\Models\Cadastro\SujeitoAtencao\DeficienciaBase;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\SujeitoAtencao\PacienteClassificacao;
use App\Models\Cadastro\SujeitoAtencao\PacienteCondicaoSaude;
use App\Models\Cadastro\SujeitoAtencao\PacienteDum;
use App\Models\Cadastro\SujeitoAtencao\PacienteHistorico;
use App\Models\Cadastro\SujeitoAtencao\PacienteInformacaoResidencial;
use App\Models\Cadastro\SujeitoAtencao\PacienteInformacaoResidencialEmprestimo;
use App\Models\Cadastro\SujeitoAtencao\PacienteInformacaoResidencialFinanciamento;
use App\Models\Cadastro\SujeitoAtencao\PacienteInformacaoResidencialVeiculo;
use App\Models\Cadastro\SujeitoAtencao\PacienteInformacaoSocial;
use App\Models\Cadastro\SujeitoAtencao\PacienteResponsavel;
use App\Models\Cadastro\SujeitoAtencao\PacienteSubclassificacao;
use App\Models\Cadastro\SujeitoAtencao\ProntuarioUnidade;
use App\Models\Cns\TermoInvalido;
use App\Models\Intranet\Cliente;
use App\Models\Sigtap\Ocupacao;
use App\Rules\Cns;
use App\Services\AtencaoBasica\CadastroDomiciliar\CadastroDomiciliarService;
use App\Services\AtencaoBasica\CadastroIndividual\CadastroIndividualService;
use App\Services\Cadastro\SujeitoAtencao\CidadaoService;
use App\Services\Cadastro\SujeitoAtencao\ObitoService;
use App\Services\Imunizacao\CadastroCampanhaService;
use App\Services\Integracao\CnsService;
use App\Services\Integracao\IntegracaoCidadaoService;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class PacienteController extends Controller
{
protected $modulo = 'cadastro';
protected $funcionalidade = 'paciente';
public function datatable()
{
$parametrizacao = Parametrizacao::first();
$quantidadeDias = $parametrizacao->cadastro_paciente_desatualizado_quantidade_dias ?? 0;
$provisorioBloqueado = $parametrizacao->cadastro_paciente_provisorio_bloqueado ?? false;
$provisorioQuantidadeDias = $parametrizacao->cadastro_paciente_provisorio_quantidade_dias ?? 0;
$pacientes = DB::table('cadastro_paciente')
->leftJoin('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->leftJoin(
'cadastro_carteira_identidade',
function ($leftJoin) {
$leftJoin->on('cadastro_carteira_identidade.cidadao_id', 'cadastro_cidadao.id')
->whereNull('cadastro_carteira_identidade.deleted_at')
->whereRaw('cadastro_carteira_identidade.id = (
SELECT id
FROM cadastro_carteira_identidade
WHERE cadastro_carteira_identidade.cidadao_id = cadastro_cidadao.id
ORDER BY cadastro_carteira_identidade.id
LIMIT 1
)');
}
)
->leftJoin('cadastro_domicilio', 'cadastro_domicilio.id', 'cadastro_cidadao.domicilio_id')
->leftJoin('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_domicilio.endereco_id')
->leftJoin('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id')
->leftJoin('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id')
->leftJoin('intranet.cadastro_estado', 'cadastro_estado.id', 'cadastro_municipio.estado_id')
->leftJoin('cadastro_obito', function ($join) {
$join->on('cadastro_cidadao.id', '=', 'cadastro_obito.cidadao_id')
->whereNull('cadastro_obito.deleted_at');
})
->whereNull('cadastro_paciente.deleted_at')
->whereNull('cadastro_paciente.sequencial_desconhecido_em')
->select(
'cadastro_paciente.id',
'cadastro_paciente.bloqueado',
'cadastro_paciente.classificacao_id',
'cadastro_paciente.subclassificacao_id',
'cadastro_cidadao.nome',
'cadastro_cidadao.nome_social',
'cadastro_cidadao.preferencia_nome_id',
'cadastro_cidadao.data_nascimento',
'cadastro_cidadao.nome_mae',
'cadastro_cidadao.cpf',
'cadastro_cidadao.cns',
'cadastro_cidadao.dnv',
'cadastro_carteira_identidade.numero AS rg',
'cadastro_obito.obito_em',
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) as prontuario'),
'cadastro_municipio.nome as municipio_nome',
'cadastro_estado.uf as uf',
DB::raw('GREATEST(cadastro_paciente.updated_at, cadastro_cidadao.updated_at) AS updated_at'),
DB::raw('
CASE
WHEN cadastro_paciente.updated_at IS NULL AND cadastro_cidadao.updated_at IS NULL THEN 1
WHEN cadastro_paciente.updated_at IS NOT NULL AND (cadastro_cidadao.updated_at IS NULL OR cadastro_paciente.updated_at > cadastro_cidadao.updated_at) THEN
CASE
WHEN ' . ($quantidadeDias > 0
? 'DATE_ADD(cadastro_paciente.updated_at, INTERVAL ' . $quantidadeDias . ' DAY) < NOW()'
: 'false') . '
THEN DATEDIFF(NOW(), DATE_ADD(cadastro_paciente.updated_at, INTERVAL ' . $quantidadeDias . ' DAY))
ELSE 0
END
WHEN cadastro_cidadao.updated_at IS NOT NULL AND (cadastro_paciente.updated_at IS NULL OR cadastro_cidadao.updated_at > cadastro_paciente.updated_at) THEN
CASE
WHEN ' . ($quantidadeDias > 0
? 'DATE_ADD(cadastro_cidadao.updated_at, INTERVAL ' . $quantidadeDias . ' DAY) < NOW()'
: 'false') . '
THEN DATEDIFF(NOW(), DATE_ADD(cadastro_cidadao.updated_at, INTERVAL ' . $quantidadeDias . ' DAY))
ELSE 0
END
ELSE 0
END as dias_cadastro_desatualizado
'),
DB::Raw("
(
SELECT cadastro_cidadao_telefone.numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.cidadao_id = cadastro_cidadao.id
AND cadastro_cidadao_telefone.principal = TRUE
AND cadastro_cidadao_telefone.deleted_at IS NULL
ORDER BY cadastro_cidadao_telefone.id DESC
LIMIT 1
) AS telefone_numero
"),
DB::Raw("
(
SELECT cadastro_carteira_identidade.numero
FROM cadastro_carteira_identidade
WHERE cadastro_carteira_identidade.cidadao_id = cadastro_cidadao.id
AND cadastro_carteira_identidade.deleted_at IS NULL
ORDER BY cadastro_carteira_identidade.id DESC
LIMIT 1
) AS carteira_identidade_numero
"),
DB::raw("DATE_FORMAT(GREATEST(cadastro_paciente.updated_at, cadastro_cidadao.updated_at), '%d/%m/%Y %H:%i:%s') AS data_hora_ultima_atualizacao"),
DB::raw("
(
SELECT atencao_basica_cadastro_individual.responsavel
FROM atencao_basica_cadastro_individual
WHERE atencao_basica_cadastro_individual.paciente_id = cadastro_paciente.id
ORDER BY atencao_basica_cadastro_individual.id DESC
LIMIT 1
) AS paciente_responsavel_familiar
"),
'cadastro_cidadao.deficiencia_id',
);
if (DataUtil::isStringTrue(request()->with_prontuario_unidade)) {
$pacientes->addSelect([
'prontuario_unidade' => function ($query) {
$query->select('cadastro_prontuario_unidade.prontuario')
->from('cadastro_prontuario_unidade')
->whereColumn('cadastro_prontuario_unidade.paciente_id', 'cadastro_paciente.id')
->where(
'cadastro_prontuario_unidade.unidade_id',
self::getCurrentCentroCusto()->infraestrutura->unidade_id
)
->whereNull('deleted_at')
->groupBy('cadastro_prontuario_unidade.paciente_id');
}
]);
}
if (!DataUtil::isStringTrue(request()->with_paciente_bloqueado)) {
$pacientes->where(function ($query) {
$query
->where('cadastro_paciente.bloqueado', false)
->orWhereNull('cadastro_paciente.bloqueado');
});
}
if (!DataUtil::isStringTrue(request()->with_paciente_provisorio) && $provisorioBloqueado) {
$pacientes->where(function ($query) use ($provisorioQuantidadeDias) {
$query->where('cadastro_paciente.subclassificacao_id', '!=', Subclassificacao::TEMPORARIO)
->orWhere(function ($query) use ($provisorioQuantidadeDias) {
$query->where('cadastro_paciente.subclassificacao_id', Subclassificacao::TEMPORARIO)
->where(function ($query) use ($provisorioQuantidadeDias) {
$query->where(function ($query) {
$query->whereNull('cadastro_paciente.validade_inicio')
->orWhereDate('cadastro_paciente.validade_inicio', '<=', Carbon::now()->format('Y-m-d'));
});
$query->where(function ($query) use ($provisorioQuantidadeDias) {
$query->whereNull('cadastro_paciente.validade_fim')
->orWhere(function ($query) use ($provisorioQuantidadeDias) {
if (!is_null($provisorioQuantidadeDias) && $provisorioQuantidadeDias > 0) {
$query->whereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->format('Y-m-d'))
->orWhereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->subDays($provisorioQuantidadeDias)->format('Y-m-d'));
} else {
$query->whereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->format('Y-m-d'));
}
});
});
});
})
->orWhereNull('cadastro_paciente.subclassificacao_id');
});
}
return datatables()
->of($pacientes)
->filterColumn('cadastro_paciente.prontuario', function ($query, $keyword) {
$query->whereRaw('LPAD(cadastro_paciente.prontuario,7,0) like ?', ["%{$keyword}%"]);
})
->filterColumn('cadastro_prontuario_unidade.prontuario', function ($query, $keyword) {
$query->whereRaw('EXISTS (
SELECT 1
FROM cadastro_prontuario_unidade
WHERE cadastro_prontuario_unidade.paciente_id = cadastro_paciente.id
AND cadastro_prontuario_unidade.unidade_id = ?
AND cadastro_prontuario_unidade.prontuario LIKE ?
AND cadastro_prontuario_unidade.deleted_at IS NULL
)', [self::getCurrentCentroCusto()->infraestrutura->unidade_id, "%{$keyword}%"]);
})
->filterColumn('cadastro_cidadao.cpf', function ($query, $keyword) {
$query
->whereRaw("cadastro_cidadao.cpf like ?", ["%{$keyword}%"])
->orWhereRaw(
"CONCAT(
SUBSTR(cadastro_cidadao.cpf,1,3),
'.',
SUBSTR(cadastro_cidadao.cpf,4,3),
'.',
SUBSTR(cadastro_cidadao.cpf,7,3),
'-',
SUBSTR(cadastro_cidadao.cpf,10,2)
) like ?",
["%{$keyword}%"]
);
})
->filterColumn('cadastro_cidadao.dnv', function ($query, $keyword) {
$query
->whereRaw("cadastro_cidadao.dnv like ?", ["%{$keyword}%"])
->orWhereRaw(
"CONCAT(
SUBSTR(cadastro_cidadao.dnv,1,2),
'-',
SUBSTR(cadastro_cidadao.dnv,3,8),
'-',
SUBSTR(cadastro_cidadao.dnv,11,1)
) like ?",
["%{$keyword}%"]
);
})
->filterColumn('cadastro_cidadao.data_nascimento', function ($query, $keyword) {
$query
->whereRaw("DATE_FORMAT(cadastro_cidadao.data_nascimento, '%d/%m/%Y') like ?", ["%{$keyword}%"])
->orWhereRaw(
"CONCAT(
SUBSTR(cadastro_cidadao.data_nascimento,9,2),
SUBSTR(cadastro_cidadao.data_nascimento,6,2),
SUBSTR(cadastro_cidadao.data_nascimento,1,4)
) like ?",
["%{$keyword}%"]
);
})
->filterColumn('telefone_numero', function ($query, $keyword) {
$query->whereRaw(
"
(
SELECT cadastro_cidadao_telefone.numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.cidadao_id = cadastro_cidadao.id
AND cadastro_cidadao_telefone.principal = TRUE
ORDER BY cadastro_cidadao_telefone.id DESC
LIMIT 1
) like ?
",
["%{$keyword}%"]
);
})
->filterColumn('carteira_identidade_numero', function ($query, $keyword) {
$query->whereRaw(
"
(
SELECT cadastro_carteira_identidade.numero
FROM cadastro_carteira_identidade
WHERE cadastro_carteira_identidade.cidadao_id = cadastro_cidadao.id
AND cadastro_carteira_identidade.deleted_at IS NULL
ORDER BY cadastro_carteira_identidade.id DESC
LIMIT 1
) like ?
",
["%{$keyword}%"]
);
})
->filterColumn('data_hora_ultima_atualizacao', function ($query, $keyword) {
$query->whereRaw("DATE_FORMAT(GREATEST(cadastro_paciente.updated_at, cadastro_cidadao.updated_at), '%d/%m/%Y %H:%i:%s')", ["%{$keyword}%"]);
})
->skipTotalRecords()
->toJson();
}
public function index()
{
$this->auth(__FUNCTION__);
$pacientes = $this->get(Paciente::class)
->whereNull('sequencial_desconhecido_em')
->doesntHave('cidadao.obito')
->get();
return response()->json($pacientes, Response::HTTP_OK);
}
public function validCNS() {
$paciente = Paciente::findOrFail(request()->paciente_id);
$parametrizacao = Parametrizacao::first();
return [
'additionals' => [
'cns_valido' => Cns::isValid($paciente->cidadao->cns),
'avisa_cns_temporario_invalido' => $parametrizacao->exibe_alerta_paciente_cns_temporario_invalido ?? false,
'cns_provisorio' => self::avisaCnsProvisorio($paciente),
]
];
}
private static function avisaCnsProvisorio($paciente)
{
return Str::startsWith($paciente->cidadao->cns, [5, 7, 8, 9]);
}
public function list()
{
$this->auth(__FUNCTION__);
$lotacao = $this->getCurrentLotacao();
$isPermissaoEndereco = ParametrizacaoPermissaoOcupacao::where('ocupacao_id', $lotacao->ocupacao_id)->first();
$count = ParametrizacaoPermissaoOcupacao::count();
$permissaoUsuario = ParametrizacaoPermissaoUsuario::where('usuario_id', $lotacao->usuario_id)
->where('infraestrutura_id', $lotacao->infraestrutura_id)
->first();
$countUsuario = ParametrizacaoPermissaoUsuario::count();
$classificacoes = $permissaoUsuario
? PacienteClassificacao::orderBy('descricao')
->get()
->filter(function ($classificacao) use ($permissaoUsuario) {
$exibe = false;
switch ($classificacao->id) {
case Classificacao::MUNICIPE:
$exibe = $permissaoUsuario->municipe;
break;
case Classificacao::PROVISORIO:
$exibe = $permissaoUsuario->provisorio;
break;
case Classificacao::OUTRO_MUNICIPIO:
$exibe = $permissaoUsuario->outro_municipio;
break;
}
return $exibe ? [
'id' => $classificacao->id,
'descricao' => $classificacao->descricao
] : null;
})
->values()
: [];
return response()->json(
[
'form' => [
'classificacoes' => $classificacoes,
'is_permissao_cadastro' => $countUsuario === 0 ? true : false,
'is_permissao_endereco' => $isPermissaoEndereco || $count === 0 ? true : false,
'is_permissao_bloquear' => $permissaoUsuario && $permissaoUsuario->desbloquear_usuario || $countUsuario === 0 ? true : false,
],
],
Response::HTTP_OK
);
}
public function create()
{
$this->auth(__FUNCTION__);
$parametrizacao = Parametrizacao::first();
return response()->json(
[
'form' => $this->getFormData(),
'additionals' => [
'exige_cpf_paciente' => $parametrizacao->exige_cpf_paciente ?? true,
'exige_cns_paciente' => $parametrizacao->exige_cns_paciente ?? true,
],
'model' => [
'responsavel_data' => Carbon::now()->format('Y-m-d'),
],
],
Response::HTTP_OK
);
}
public function show($id)
{
$this->auth(__FUNCTION__);
return $this->getAdditionalsFormModelData($id, false);
}
public function store(PacienteRequest $request)
{
$this->auth(__FUNCTION__);
return $this->saveStore($request->all());
}
public function saveStore($params, $paciente = null)
{
$paciente = $this->save($params, $paciente);
self::saveHistorico($paciente->id);
$paciente->has_cadastro_individual = $paciente->cadastroIndividual && $paciente->cadastroIndividual->id ? true : false;
$paciente->has_cadastro_domiciliar = optional($paciente->cidadao->domicilio)->cadastroDomiciliar ? true : false;
if (isset($params['origem']) && $params['origem'] == 'mobile') {
return $paciente->id;
}
return response()->json($paciente, Response::HTTP_CREATED);
}
public function edit($id)
{
$this->auth(__FUNCTION__);
return $this->getAdditionalsFormModelData($id);
}
private static function getSistema()
{
$cliente = Cliente::where('link', app('config')->get('database.default'))->firstOrFail();
return [
'ramo_atividade' => $cliente->sistema->ramoAtividade->nome ?? null,
'nome_sistema' => $cliente->sistema->nome ?? null,
'versao' => $cliente->sistema->versao ?? null,
];
}
public static function getResidentes($id)
{
$residentes = DB::table('cadastro_cidadao')
->select([
'cadastro_cidadao.id AS id',
'cadastro_cidadao.nome AS nome',
'cadastro_cidadao.nome_social AS nome_social',
'cadastro_cidadao.cns',
'cadastro_paciente.id as paciente_id',
'cadastro_paciente_informacao_social.responsavel as is_responsavel',
'atencao_basica_cadastro_parentesco_responsavel.descricao AS parentesco',
DB::raw('
(
CASE WHEN cadastro_cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cadastro_cidadao.nome_mae
END
) AS nome_mae'
),
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
DB::raw('IF (cadastro_cidadao.data_nascimento IS NULL, "Não informada", DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y")) AS data_nascimento'),
DB::raw('COALESCE(atencao_basica_cadastro_parentesco_responsavel.descricao, "-") AS parentesco'),
])
->join('cadastro_paciente', 'cadastro_paciente.cidadao_id', 'cadastro_cidadao.id')
->leftJoin(DB::raw('
(
SELECT abi1.*
FROM atencao_basica_cadastro_individual abi1
WHERE abi1.id = (
SELECT MAX(abi2.id)
FROM atencao_basica_cadastro_individual abi2
WHERE abi2.paciente_id = abi1.paciente_id
)
) AS atencao_basica_cadastro_individual
'), 'atencao_basica_cadastro_individual.paciente_id', '=', 'cadastro_paciente.id')
->leftJoin('atencao_basica_cadastro_parentesco_responsavel', 'atencao_basica_cadastro_parentesco_responsavel.id', 'atencao_basica_cadastro_individual.parentesco_responsavel_id')
->leftJoin(DB::raw('
(
SELECT pis1.*
FROM cadastro_paciente_informacao_social pis1
WHERE pis1.id = (
SELECT MAX(pis2.id)
FROM cadastro_paciente_informacao_social pis2
WHERE pis2.paciente_id = pis1.paciente_id
)
) AS cadastro_paciente_informacao_social
'), 'cadastro_paciente_informacao_social.paciente_id', '=', 'cadastro_paciente.id')
->where('cadastro_cidadao.domicilio_id', $id)
->whereNull('cadastro_paciente.deleted_at')
->whereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('cadastro_obito')
->whereColumn('cadastro_obito.cidadao_id', 'cadastro_cidadao.id')
->whereNull('cadastro_obito.deleted_at');
})
->get();
$nomeResponsavelFamiliar = optional($residentes->firstWhere('is_responsavel', true))->nome ?? '-';
return $residentes->map(function ($residente) use ($nomeResponsavelFamiliar) {
$residente->responsavel_familiar = $residente->is_responsavel ? '-' : $nomeResponsavelFamiliar;
return $residente;
});
}
public static function getMicroareas(){
return DB::table('atencao_basica_parametrizacao_area')
->select([
'atencao_basica_parametrizacao_microarea.id AS id',
'atencao_basica_parametrizacao_microarea.descricao AS descricao_micro',
DB::raw("CONCAT(
'INE: ',
CASE
WHEN atencao_basica_parametrizacao_area.numero_ine
THEN LPAD(atencao_basica_parametrizacao_area.numero_ine, 10, '0')
ELSE ''
END,
CASE
WHEN atencao_basica_parametrizacao_area.descricao
THEN CONCAT(' - Área: ', atencao_basica_parametrizacao_area.descricao)
ELSE ''
END,
' - Microárea: ', atencao_basica_parametrizacao_microarea.descricao
) AS descricao")
])
->join('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.area_id', 'atencao_basica_parametrizacao_area.id')
->groupBy('descricao')
->orderBy('descricao_micro')
->get();
}
private function checkPermissaoCadastro($classificacaoId) {
$lotacao = $this->getCurrentLotacao();
$permissaoUsuario = ParametrizacaoPermissaoUsuario::where([
'usuario_id' => $lotacao->usuario_id,
'infraestrutura_id' => $lotacao->infraestrutura_id
])->first();
if (ParametrizacaoPermissaoUsuario::count() === 0) {
return true;
}
if (!$permissaoUsuario) {
return false;
}
if (!$classificacaoId && ($permissaoUsuario->municipe || $permissaoUsuario->provisorio || $permissaoUsuario->outro_municipio)) {
return true;
}
switch ($classificacaoId) {
case Classificacao::MUNICIPE:
return $permissaoUsuario->municipe;
case Classificacao::PROVISORIO:
return $permissaoUsuario->provisorio;
case Classificacao::OUTRO_MUNICIPIO:
return $permissaoUsuario->outro_municipio;
default:
return false;
}
}
private function getFormData($unidadeReferenciaId = null, $isEdit = null)
{
$unidadesReferencia = Unidade::where('unidade_referencia', true);
if ($unidadeReferenciaId) {
$unidadesReferencia->orWhere('id', $unidadeReferenciaId);
}
$lotacao = $this->getCurrentLotacao();
$isPermissaoEndereco = ParametrizacaoPermissaoOcupacao::where('ocupacao_id', $lotacao->ocupacao_id)->first();
$count = ParametrizacaoPermissaoOcupacao::count();
$permissaoUsuario = ParametrizacaoPermissaoUsuario::where('usuario_id', $lotacao->usuario_id)
->where('infraestrutura_id', $lotacao->infraestrutura_id)
->first();
$countUsuario = ParametrizacaoPermissaoUsuario::count();
$classificacoes = self::getClassificacoes($permissaoUsuario, $countUsuario);
return [
'is_permissao_endereco' => $isEdit
? (($isPermissaoEndereco && $isEdit) || $count === 0 ? true : false)
: true,
'is_permissao_bloquear' => $permissaoUsuario && $permissaoUsuario->desbloquear_usuario || $countUsuario === 0 ? true : false,
'termos_invalidos' => TermoInvalido::all()->map(fn ($termo) => $termo->descricao),
'data_atual' => Carbon::now()->format('d/m/Y'),
'classificacoes' => $classificacoes,
'subclassificacoes' => PacienteSubclassificacao::orderBy('descricao')->get()
->map(fn ($subclassificacao) => [
'id' => $subclassificacao->id,
'descricao' => $subclassificacao->descricao
]),
'unidades_referencia' => $unidadesReferencia->orderBy('nome_fantasia')->get()
->map(fn ($unidades) => [
'id' => $unidades->id,
'nome_fantasia' => $unidades->cnes
? $unidades->cnes . ' - ' . $unidades->nome_fantasia
: $unidades->nome_fantasia
]),
'bloqueado' => [
[ 'value' => true, 'text' => 'SIM'],
[ 'value' => false, 'text' => 'NÃO']
],
'acompanhamento_infantil' => AcompanhamentoInfantil::orderBy('descricao')->get(),
'curso' => Curso::orderBy('descricao')->get(),
'mercado_trabalho' => SituacaoMercadoTrabalho::orderBy('descricao')->get(),
'saida_cidadao' => SaidaCidadao::orderBy('descricao')->get(),
'sistema' => self::getSistema(),
'deficiencia' => DeficienciaBase::orderBy('descricao')->get()->each(function ($item) {
$item->descricao = $item->id == Deficiencia::TEA ? $item->descricao : ucfirst(strtolower($item->descricao));
}),
'orientacao_sexual' => OrientacaoSexual::orderBy('descricao')->get(),
'imovel_tipo' => ImovelTipo::orderBy('descricao')->get(),
'situacao_domicilio' => SituacaoDomicilio::orderBy('descricao')->get(),
'domicilio_tipo' => DomicilioTipo::orderBy('descricao')->get(),
'situacao_rural' => SituacaoRural::orderBy('descricao')->get(),
'zonas' => Zona::orderBy('descricao')->get()->map(fn ($zona) => [
'id' => $zona->id,
'descricao' => $zona->descricao
]),
'domicilio_tipo_acesso' => DomicilioTipoAcesso::orderBy('descricao')->get(),
'material_predominante' => MaterialPredominante::orderBy('descricao')->get(),
'abastecimento' => Abastecimento::orderBy('descricao')->get(),
'tratamento' => Tratamento::whereNotIn('id', [enumsTratamento::FILTRADA])->orderBy('descricao')->get(),
'destino_lixo' => DestinoLixo::whereNotin('id', [enumsDestinoLixo::QUEIMADO_ENTERRADO])->orderBy('descricao')->get(),
'forma_escoamento' => FormaEscoamento::orderBy('descricao')->get(),
'higiene_residencial' => HigieneResidencial::orderBy('descricao')->get(),
'animais' => Animal::orderBy('descricao')->get(),
'escalaCoelho' => EscalaCoelho::orderBy('id')->get(),
'lazer' => Lazer::orderBy('descricao')->get(),
'microareas' => self::getMicroareas(),
'parentesco' => Parentesco::orderBy('descricao')->get(),
'peso' => Peso::orderBy('descricao')->get(),
'doencas_cardiacas' => DoencaCardiaca::orderBy('descricao')->get(),
'problemas_rins' => ProblemasRins::orderBy('descricao')->get(),
'doencas_respiratorias' => DoencaRespiratoria::orderBy('descricao')->get(),
];
}
private static function getResponsaveis($paciente)
{
return DB::table('cadastro_cidadao')
->select([
'cadastro_cidadao.id AS id',
'cadastro_cidadao.nome AS nome',
])
->join('cadastro_paciente', 'cadastro_paciente.cidadao_id', 'cadastro_cidadao.id')
->join('cadastro_paciente_informacao_social', 'cadastro_paciente_informacao_social.paciente_id', 'cadastro_paciente.id')
->where('cadastro_cidadao.domicilio_id', $paciente->cidadao->domicilio_id)
->where('cadastro_paciente_informacao_social.responsavel', true)
->whereNotIn('cadastro_paciente.id', [$paciente->id])
->get();
}
private static function getClassificacoes($permissaoUsuario, $countUsuario) {
if ($countUsuario === 0) {
return PacienteClassificacao::orderBy('descricao')->get();
} else {
return $permissaoUsuario
? PacienteClassificacao::orderBy('descricao')
->get()
->filter(function ($classificacao) use ($permissaoUsuario) {
$exibe = false;
switch ($classificacao->id) {
case Classificacao::MUNICIPE:
$exibe = $permissaoUsuario->municipe;
break;
case Classificacao::PROVISORIO:
$exibe = $permissaoUsuario->provisorio;
break;
case Classificacao::OUTRO_MUNICIPIO:
$exibe = $permissaoUsuario->outro_municipio;
break;
}
return $exibe ? [
'id' => $classificacao->id,
'descricao' => $classificacao->descricao
] : null;
})
->values()
: [];
}
}
public function update(PacienteRequest $request, int $id)
{
$this->auth(__FUNCTION__);
$paciente = Paciente::findOrFail($id);
$cidadao = $paciente->cidadao ?? null;
if (!self::checkPermissaoCadastro($paciente->classificacao_id)) {
throw new AlteracaoCadastroPacienteNaoPermitidoException();
}
$paciente = $this->save($request->all(), $paciente);
if (($paciente && $paciente->wasChanged('updated_at')) || ($cidadao->updated_at != $paciente->cidadao->updated_at)
|| ($paciente->responsavel && $paciente->responsavel->updated_at != $paciente->updated_at)) {
self::saveHistorico($paciente->id);
}
$paciente->has_cadastro_individual = $paciente->cadastroIndividual && $paciente->cadastroIndividual->id ? true : false;
$paciente->has_cadastro_domiciliar = optional(optional($paciente->cidadao)->domicilio)->cadastroDomiciliar ?? false;
return response()->json($paciente, Response::HTTP_OK);
}
private static function saveHistorico($pacienteId)
{
$paciente = Paciente::findOrFail($pacienteId);
$equipeId = $paciente->responsavel && $paciente->responsavel->equipe
? $paciente->responsavel->equipe->id
: null;
$historico = new PacienteHistorico;
$historico->paciente_id = $pacienteId;
$historico->equipe_id = $equipeId;
$historico->save();
}
private function save($params, $paciente = null)
{
$pacienteSaved = null;
DB::transaction(function () use (&$pacienteSaved, $params, $paciente) {
$domicilioIdAntigo = optional(optional($paciente)->cidadao)->domicilio_id;
$params['cidadao']['origem'] = isset($params['origem']) && $params['origem'] == 'mobile' ? 'mobile' : 'paciente';
$cidadao = CidadaoService::save($params['cidadao']);
self::registrarMudancaDomicilio($cidadao, $domicilioIdAntigo);
$data = $this->getPreparedData($params);
$data['cidadao_id'] = $cidadao->id;
if (!is_null($paciente) && $paciente->classificacao_id !== $data['classificacao_id']) {
$paciente->historicoClassificacoes()->create([
'classificacao_id' => $data['classificacao_id']
]);
}
$pacienteSaved = Paciente::updateOrCreate(
['id' => $paciente->id ?? null],
$data
);
if (!isset($params['origem']) || (isset($params['origem']) && $params['origem'] !== 'mobile')) {
self::saveProntuarioUnidade(
$pacienteSaved->id,
isset($params['centro_custo_id']) && (int) $params['centro_custo_id'] > 0 ? CentroCusto::findOrFail($params['centro_custo_id'])->infraestrutura->unidade_id : $this->getCurrentCentroCusto()->infraestrutura->unidade_id,
$data['prontuario_unidade']
);
}
if (isset($params['origem']) && ($params['origem'] === 'cadastroPaciente' || $params['origem'] === 'mobile')) {
$eraResponsavelFamiliar = optional($pacienteSaved->informacaoSocial)->responsavel ?? false;
self::saveResponsavel($pacienteSaved, $data);
self::saveDum($pacienteSaved, $data);
self::saveCondicaoSaude($pacienteSaved, $data);
self::saveInformacaoResidencial($pacienteSaved, $data);
self::saveInformacaoSocial($pacienteSaved, $data);
self::saveDomicilioInformacaoResidencial($pacienteSaved, $data);
self::saveResponsavelFamiliar($pacienteSaved, $data, $eraResponsavelFamiliar);
self::saveAtencaoBasica($pacienteSaved, $data);
self::sincronizarUnidadeReferenciaResponsavelNucleo($pacienteSaved, $data);
}
IntegracaoCidadaoService::integrar($cidadao->id);
if (isset($params['altera_responsavel']) && $params['altera_responsavel'] === true) {
if (!empty($params['domicilio_id_old'])) {
$residentes = Cidadao::where('domicilio_id', $params['domicilio_id_old'])->get();
foreach ($residentes as $residente) {
$residente->update(['domicilio_id' => $cidadao->domicilio_id]);
if($residente->paciente->cadastroIndividual) {
$residente->paciente->cadastroIndividual->update([
'usuario_id' => $data['responsavel_usuario_id'],
'responsavel_equipe_id' => $data['responsavel_equipe_id'],
'responsavel_ocupacao_id' => $data['responsavel_ocupacao_id'],
]);
}
IntegracaoCidadaoService::integrar($residente->id);
self::saveHistorico($residente->paciente->id);
self::saveResponsavel($paciente, $data);
}
}
}
});
return $pacienteSaved;
}
public static function saveProntuarioUnidade($pacienteId, $unidadeId, $prontuario)
{
if (is_null($prontuario)) {
$prontuarioUnidade = ProntuarioUnidade::where('paciente_id', $pacienteId)
->where('unidade_id', $unidadeId)
->first();
if (!is_null($prontuarioUnidade)) {
$prontuarioUnidade->delete();
}
} else {
ProntuarioUnidade::updateOrCreate(
[
'paciente_id' => $pacienteId,
'unidade_id' => $unidadeId,
],
['prontuario' => mb_strtoupper((string) $prontuario)]
);
}
}
private function saveAtencaoBasica($paciente, $data) {
self::saveAtencaoBasicaCadastroDomiciliar($paciente, $data);
self::saveAtencaoBasicaCadastroIndividual($paciente, $data);
}
private function saveResponsavelFamiliar($paciente, $data, $eraResponsavelFamiliar = false) {
if ($data['responsavel_cidadao_id']) {
$cidadaoResponsavel = Cidadao::where('id', $data['responsavel_cidadao_id'])->first();
if ($cidadaoResponsavel) {
PacienteInformacaoSocial::updateOrCreate(
[
'paciente_id' => $cidadaoResponsavel->paciente->id,
],
[
'responsavel' => true,
'responsavel_cidadao_id' => null,
]
);
PacienteInformacaoSocial::where('responsavel_cidadao_id', $paciente->cidadao->id)
->update(['responsavel_cidadao_id' => $cidadaoResponsavel->id]);
CadastroIndividual::where('paciente_id', $cidadaoResponsavel->id)
->update(['responsavel' => true, 'responsavel_cidadao_id' => null ]);
CadastroIndividual::where('responsavel_cidadao_id', $paciente->cidadao->id)
->update(['responsavel_cidadao_id' => $cidadaoResponsavel->id]);
}
}
if ($data['responsavel'] === true && !$eraResponsavelFamiliar) {
self::atualizarResponsavelFamiliarNucleo($paciente);
}
}
private static function atualizarResponsavelFamiliarNucleo($paciente) {
$domicilioId = optional($paciente->cidadao)->domicilio_id;
if (!$domicilioId) {
return;
}
$cidadaoId = $paciente->cidadao->id;
$outrosCidadaoIds = Cidadao::where('domicilio_id', $domicilioId)
->where('id', '!=', $cidadaoId)
->pluck('id');
$outrosPacienteIds = Paciente::whereIn('cidadao_id', $outrosCidadaoIds)->pluck('id');
if ($outrosPacienteIds->isEmpty()) {
return;
}
PacienteInformacaoSocial::whereIn('paciente_id', $outrosPacienteIds)
->update([
'responsavel' => false,
'responsavel_cidadao_id' => $cidadaoId,
'parentesco_responsavel_id' => null,
]);
CadastroIndividual::whereIn('paciente_id', $outrosPacienteIds)
->update([
'responsavel' => false,
'responsavel_cidadao_id' => $cidadaoId,
'parentesco_responsavel_id' => null,
]);
}
private static function sincronizarUnidadeReferenciaResponsavelNucleo($paciente, $data) {
$domicilioId = $paciente->cidadao->domicilio_id;
if (!$domicilioId) {
return;
}
$outrosCidadaoIds = Cidadao::where('domicilio_id', $domicilioId)
->where('id', '!=', $paciente->cidadao->id)
->pluck('id');
$outrosPacientes = Paciente::whereIn('cidadao_id', $outrosCidadaoIds)->get();
if ($outrosPacientes->isEmpty()) {
return;
}
foreach ($outrosPacientes as $outroPaciente) {
$outroPaciente->update(['unidade_id' => $data['unidade_id']]);
PacienteResponsavel::updateOrCreate(
['paciente_id' => $outroPaciente->id],
[
'responsavel_usuario_id' => $data['responsavel_usuario_id'],
'responsavel_equipe_id' => $data['responsavel_equipe_id'],
'responsavel_ocupacao_id' => $data['responsavel_ocupacao_id'],
'responsavel_data' => Carbon::now(),
]
);
CadastroIndividual::where('paciente_id', $outroPaciente->id)
->update([
'usuario_id' => $data['responsavel_usuario_id'],
'equipe_id' => $data['responsavel_equipe_id'],
'usuario_ocupacao_id' => $data['responsavel_ocupacao_id'],
'data_usuario_responsavel' => $data['responsavel_data'],
]);
}
}
private function saveDum($paciente, $data) {
PacienteDum::updateOrCreate(
[
'paciente_id' => $paciente->id,
],
[
'data_ultima_menstruacao' => $data['data_ultima_menstruacao'],
'idade_gestacional_semanas' => $data['idade_gestacional_semanas'],
'idade_gestacional_dias' => $data['idade_gestacional_dias'],
'data_possivel_parto' => $data['data_possivel_parto'],
'gravidez_planejada' => $data['gravidez_planejada'],
'gestacao_previa' => $data['gestacao_previa'],
'parto' => $data['parto'],
]
);
}
private function saveResponsavel($paciente, $data) {
PacienteResponsavel::updateOrCreate(
[
'paciente_id' => $paciente->id,
],
[
'responsavel_usuario_id' => $data['responsavel_usuario_id'],
'responsavel_equipe_id' => $data['responsavel_equipe_id'],
'responsavel_ocupacao_id' => $data['responsavel_ocupacao_id'],
'responsavel_data' => Carbon::now(),
]
);
}
private function saveCondicaoSaude($paciente, $data) {
PacienteCondicaoSaude::updateOrCreate(
[
'paciente_id' => $paciente->id,
],
[
'peso_id' => $data['peso_id'],
'internacao' => $data['internacao'],
'internacao_motivo' => $data['internacao_motivo'],
'internacao_data' => $data['internacao_data'],
'doenca_cardiaca' => $data['doenca_cardiaca'],
'problemas_rins' => $data['problemas_rins'],
'doenca_respiratoria' => $data['doenca_respiratoria'],
'tratamento_saude_mental' => $data['tratamento_saude_mental'],
'tratamento_saude_mental_internacao_data' => $data['tratamento_saude_mental_internacao_data'],
'tratamento_saude_mental_alta_data' => $data['tratamento_saude_mental_alta_data'],
'acamado' => $data['acamado'],
'domiciliado' => $data['domiciliado'],
'plantas_medicinais' => $data['plantas_medicinais'],
'plantas_medicinais_quais' => $data['plantas_medicinais_quais'],
'praticas_integrativas' => $data['praticas_integrativas'],
'outras_condicoes_primaria' => $data['outras_condicoes_primaria'],
'outras_condicoes_secundaria' => $data['outras_condicoes_secundaria'],
'outras_condicoes_terciaria' => $data['outras_condicoes_terciaria'],
]
);
if ($paciente->condicaoSaude) {
$paciente->condicaoSaude->doencaCardiaca()->sync($data['doenca_cardiaca_quais']);
$paciente->condicaoSaude->doencaRespiratoria()->sync($data['doenca_respiratoria_quais']);
$paciente->condicaoSaude->problemasRins()->sync($data['problemas_rins_quais']);
}
}
private function saveInformacaoSocial($paciente, $data) {
$dadosInformacaoSocialAnterior = optional($paciente)->informacaoSocial;
$alimentosAtual = optional($dadosInformacaoSocialAnterior)->alimentos_acabaram;
$comeuAtual = optional($dadosInformacaoSocialAnterior)->comeu_alguns_alimentos;
$alimentosNovo = $data['alimentos_acabaram'] ?? null;
$comeuNovo = $data['comeu_alguns_alimentos'] ?? null;
$dataAtualizacaoTriaAnterior = optional($dadosInformacaoSocialAnterior)->data_atualizacao_tria;
$atualizaDataTrita = self::houveMudancaInformacaoSocioeconomica($alimentosAtual, $comeuAtual, $alimentosNovo, $comeuNovo);
PacienteInformacaoSocial::updateOrCreate(
[
'paciente_id' => $paciente->id,
],
[
'responsavel' => $data['responsavel'],
'responsavel_cidadao_id' => $data['responsavel'] ? null : $data['responsavel_cidadao_id'],
'parentesco_responsavel_id' => $data['responsavel'] ? null : $data['parentesco_responsavel_id'],
'curso_id' => $data['curso_id'],
'orientacao_sexual' => $data['orientacao_sexual'],
'orientacao_sexual_id' => $data['orientacao_sexual_id'],
'deficiente' => $data['deficiente'],
'frequenta_escola_creche' => $data['frequenta_escola_creche'],
'situacao_mercado_trabalho_id' => $data['situacao_mercado_trabalho_id'],
'frequenta_cuidador_tradicional' => $data['frequenta_cuidador_tradicional'],
'participa_grupo_comunitario' => $data['participa_grupo_comunitario'],
'plano_saude' => $data['plano_saude'],
'comunidade_tradicional' => $data['comunidade_tradicional'],
'comunidade_tradicional_id' => $data['comunidade_tradicional_id'],
'saida_cidadao_id' => $data['saida_cidadao_id'],
'motivo_saida_data' => $data['motivo_saida_data'],
'recusa_cadastro' => $data['informacao_social_recusa_cadastro'],
'alimentos_acabaram' => $data['alimentos_acabaram'],
'comeu_alguns_alimentos' => $data['comeu_alguns_alimentos'],
'data_atualizacao_tria' => $atualizaDataTrita ? Carbon::now() : $dataAtualizacaoTriaAnterior,
]
);
if ($paciente->informacaoSocial) {
$paciente->informacaoSocial->acompanhamentoInfantil()->sync($data['acompanhamento_infantil']);
$paciente->informacaoSocial->deficiencia()->sync($data['deficiencias']);
if (!$paciente->informacaoSocial->deficiencia->pluck('id')->contains(Deficiencia::TEA)
&& $paciente->cidadao->fatoresRisco->pluck('id')->contains(FatorRisco::TEA)) {
$paciente->cidadao->fatoresRisco()->detach(FatorRisco::TEA);
}
}
if ($data['saida_cidadao_id'] == EnumSaidaCidadao::OBITO) {
$currentLotacao = self::getCurrentLotacao();
$obitoService = new ObitoService($paciente->cidadao);
if (is_null($obitoService->get())) {
$obitoService->save(
Carbon::createFromFormat('d/m/Y H:i:s', $data['obito_em']),
$data['obito_declaracao'] ?? '',
$data['obito_causa'] ?? '',
$data['obito_cid_id'] ?? null,
$currentLotacao->usuario->id
);
}
}
if ($data['saida_cidadao_id'] == EnumSaidaCidadao::MUDANCA_DE_TERRITORIO) {
Cidadao::findOrFail($paciente->cidadao->id)->update(['domicilio_id' => null]);
Paciente::findOrFail($paciente->id)->update(['classificacao_id' => Classificacao::PROVISORIO]);
}
}
private function saveInformacaoResidencial($paciente, $data) {
PacienteInformacaoResidencial::updateOrCreate(
[
'paciente_id' => $paciente->id,
],
[
'recusa_cadastro' => $data['informacao_residencial_recusa_cadastro'],
'renda_mensal' => $data['renda_mensal'],
'ocupacao_id' => $data['ocupacao_id'],
'renda_total_familiar' => $data['renda_total_familiar'],
'possui_veiculo_proprio' => $data['possui_veiculo_proprio'],
'possui_financiamento' => $data['possui_financiamento'],
'possui_emprestimo' => $data['possui_emprestimo'],
]
);
if ($paciente->informacaoResidencial) {
if ($data['veiculos'] != null) {
$paciente->informacaoResidencial->veiculo()->delete();
$veiculosData = array_map(function($veiculo) use ($paciente) {
return [
'paciente_informacao_residencial_id' => $paciente->informacaoResidencial->id,
'modelo' => $veiculo['modelo'],
'ano' => $veiculo['ano'],
];
}, $data['veiculos']);
PacienteInformacaoResidencialVeiculo::insert($veiculosData);
}
if ($data['financiamentos'] != null) {
$paciente->informacaoResidencial->financiamento()->delete();
$financiamentosData = array_map(function($financiamento) use ($paciente) {
$financiamento['valor_parcela'] = str_replace('.', '', $financiamento['valor_parcela']);
$financiamento['valor_parcela'] = str_replace(',', '.', $financiamento['valor_parcela']);
return [
'paciente_informacao_residencial_id' => $paciente->informacaoResidencial->id,
'tipo' => $financiamento['tipo'],
'valor_parcela' => $financiamento['valor_parcela'],
'quantidade_parcela' => $financiamento['quantidade_parcela'],
];
}, $data['financiamentos']);
PacienteInformacaoResidencialFinanciamento::insert($financiamentosData);
}
if ($data['emprestimos'] != null) {
$paciente->informacaoResidencial->emprestimo()->delete();
$emprestimosData = array_map(function($emprestimo) use ($paciente) {
$emprestimo['valor_parcela'] = str_replace('.', '', $emprestimo['valor_parcela']);
$emprestimo['valor_parcela'] = str_replace(',', '.', $emprestimo['valor_parcela']);
return [
'paciente_informacao_residencial_id' => $paciente->informacaoResidencial->id,
'tipo' => $emprestimo['tipo'],
'valor_parcela' => $emprestimo['valor_parcela'],
'quantidade_parcela' => $emprestimo['quantidade_parcela'],
];
}, $data['emprestimos']);
PacienteInformacaoResidencialEmprestimo::insert($emprestimosData);
}
}
}
private function saveDomicilioInformacaoResidencial($paciente, $data) {
if($paciente->cidadao->domicilio){
DomicilioInformacaoResidencial::updateOrCreate(
[
'domicilio_id' => $paciente->cidadao->domicilio->id,
],
[
'microarea_id' => $data['microarea_id'],
'fora_area' => $data['fora_area'],
'instituicao_nome' => $data['instituicao_nome'],
'instituicao_outros_profissionais' => $data['instituicao_outros_profissionais'],
'instituicao_nome_responsavel_tecnico' => $data['instituicao_nome_responsavel_tecnico'],
'instituicao_cns_responsavel_tecnico' => $data['instituicao_cns_responsavel_tecnico'],
'instituicao_cargo_responsavel_tecnico' => $data['instituicao_cargo_responsavel_tecnico'],
'instituicao_telefone_responsavel_tecnico' => $data['instituicao_telefone_responsavel_tecnico'],
'imovel_tipo_id' => $data['imovel_tipo_id'],
'situacao_domicilio_id' => $data['situacao_domicilio_id'],
'domicilio_tipo_id' => $data['domicilio_tipo_id'],
'quantidade_comodos' => $data['quantidade_comodos'],
'situacao_rural_id' => $data['situacao_rural_id'],
'domicilio_zona_id' => $data['domicilio_zona_id'],
'domicilio_tipo_acesso_id' => $data['domicilio_tipo_acesso_id'],
'material_predominante_id' => $data['material_predominante_id'],
'abastecimento_id' => $data['abastecimento_id'],
'tratamento_id' => $data['tratamento_id'],
'destino_lixo_id' => $data['destino_lixo_id'],
'forma_escoamento_id' => $data['forma_escoamento_id'],
'possui_animais' => $data['possui_animais'],
'quantidade_animais' => $data['quantidade_animais'],
'energia_eletrica' => $data['energia_eletrica'],
'higiene_residencial_id' => $data['higiene_residencial_id'],
'bolsa_familia' => $data['bolsa_familia'],
'vale_gas' => $data['vale_gas'],
'bolsa_escola' => $data['bolsa_escola'],
'bpc' => $data['bpc'],
'escala_coelho_id' => $data['escala_coelho_id'],
]
);
if ($paciente->cidadao->domicilio->informacaoResidencial) {
$paciente->cidadao->domicilio->informacaoResidencial->lazer()->sync($data['lazer']);
$paciente->cidadao->domicilio->informacaoResidencial->animal()->sync($data['animal']);
}
}
}
private function saveAtencaoBasicaCadastroDomiciliar($paciente, $data) {
if (is_null($data['microarea_id'] && !$data['fora_area']) || is_null($data['imovel_tipo_id'])) {
return false;
}
if ($data['responsavel_ocupacao_id']) {
$permissao = OutrosPermissaoOcupacao::where('permissao_id', Permissao::CADASTRO_DOMICILIAR)->get();
$codigos = $permissao->pluck('ocupacao');
$ocupacao = Ocupacao::find($data['responsavel_ocupacao_id']);
$hasPermissao = $codigos->contains($ocupacao->codigo);
} else {
$hasPermissao = false;
}
if (!$hasPermissao && !($data['saida_cidadao_id'] != null)) {
throw new ParametrizacaoAtendimentoCboException;
}
$domicilioId = $paciente->cidadao->domicilio_id;
$cadastroDomiciliar = CadastroDomiciliar::where('domicilio_id', $domicilioId)->first();
$dados = [
'id' => null,
'endereco' => [
'microarea_id' => $data['microarea_id'],
'fora_area' => $data['fora_area'],
],
'cadastro' => [
'usuario_id' => $hasPermissao ? $data['responsavel_usuario_id'] : ($cadastroDomiciliar['usuario_id'] ?? null),
'equipe_id' => $hasPermissao ? $data['responsavel_equipe_id'] : ($cadastroDomiciliar['equipe_id'] ?? null),
'ocupacao_id' => $hasPermissao ? $data['responsavel_ocupacao_id'] : ($cadastroDomiciliar['usuario_ocupacao_id'] ?? null),
'data_usuario_responsavel' => $hasPermissao ? $data['responsavel_data'] : ($cadastroDomiciliar['data_usuario_responsavel'] ?? null),
],
'instituicao' => [
'nome' => $data['instituicao_nome'],
'outros_profissionais' => $data['instituicao_outros_profissionais'],
'nome_responsavel_tecnico' => $data['instituicao_nome_responsavel_tecnico'],
'cns_responsavel_tecnico' => $data['instituicao_cns_responsavel_tecnico'],
'cargo_responsavel_tecnico' => $data['instituicao_cargo_responsavel_tecnico'],
'telefone_responsavel_tecnico' => $data['instituicao_telefone_responsavel_tecnico'],
],
'residencia' => [
'imovel_tipo_id' => $data['imovel_tipo_id'],
'situacao_domicilio_id' => $data['situacao_domicilio_id'],
'domicilio_tipo_id' => $data['domicilio_tipo_id'],
'quantidade_comodos' => $data['quantidade_comodos'],
'situacao_rural_id' => $data['situacao_rural_id'],
'domicilio_zona_id' => $data['domicilio_zona_id'],
'domicilio_tipo_acesso_id' => $data['domicilio_tipo_acesso_id'],
'material_predominante_id' => $data['material_predominante_id'],
'abastecimento_id' => $data['abastecimento_id'],
'tratamento_id' => $data['tratamento_id'],
'destino_lixo_id' => $data['destino_lixo_id'],
'forma_escoamento_id' => $data['forma_escoamento_id'],
'possui_animais' => $data['possui_animais'],
'quantidade_animais' => $data['quantidade_animais'],
'energia_eletrica' => $data['energia_eletrica'],
'animal' => $data['animal'],
],
'informacao' => [
'higiene_residencial_id' => $data['higiene_residencial_id'],
'bolsa_familia' => $data['bolsa_familia'],
'vale_gas' => $data['vale_gas'],
'bolsa_escola' => $data['bolsa_escola'],
'bpc' => $data['bpc'],
'escala_coelho_id' => $data['escala_coelho_id'],
'lazer' => $data['lazer'],
],
'renda_mensal' => $data['renda_mensal'],
'ocupacao_id' => $data['ocupacao_id'],
'renda_total_familiar' => $data['renda_total_familiar'],
'recusa_cadastro' => $data['informacao_residencial_recusa_cadastro'],
'domicilio_id' => $domicilioId,
'origem' => 'cadastroPaciente',
];
if ($hasPermissao && $domicilioId || $cadastroDomiciliar) {
CadastroDomiciliarService::saveStore($dados);
return true;
}
return false;
}
private function saveAtencaoBasicaCadastroIndividual($paciente, $data) {
if ($data['responsavel_ocupacao_id']) {
$permissao = OutrosPermissaoOcupacao::where('permissao_id', Permissao::CADASTRO_INDIVIDUAL)->get();
$codigos = $permissao->pluck('ocupacao');
$ocupacao = Ocupacao::find($data['responsavel_ocupacao_id']);
$hasPermissao = $codigos->contains($ocupacao->codigo);
} else {
$hasPermissao = false;
}
$cadastroIndividual = CadastroIndividual::where('paciente_id', $paciente->id)->first();
$fatoresRisco = $paciente->cidadao->fatoresRisco->pluck('id');
$dataUsuarioResponsavel = $hasPermissao ? $data['responsavel_data'] : ($cadastroIndividual->data_usuario_responsavel ?? null);
if (isset($data['saida_cidadao_id']) && ($data['saida_cidadao_id'] == EnumSaidaCidadao::MUDANCA_DE_TERRITORIO || $data['saida_cidadao_id'] == EnumSaidaCidadao::OBITO) && $cadastroIndividual && $hasPermissao)
{
$cadastroIndividual->update([
'usuario_id' => null,
'usuario_ocupacao_id' => null,
'equipe_id' => null,
]);
$dataUsuarioResponsavel = Carbon::now()->format('Y-m-d');
}
$dados = [
'id' => null,
'paciente_id' => $paciente->id,
'endereco' => [
'microarea_id' => $data['microarea_id'],
'fora_area' => $data['fora_area'],
],
'cadastro' => [
'usuario_id' => $hasPermissao ? $data['responsavel_usuario_id'] : ($cadastroIndividual->usuario_id ?? null),
'equipe_id' => $hasPermissao ? $data['responsavel_equipe_id'] : ($cadastroIndividual->equipe_id ?? null),
'ocupacao_id' => $hasPermissao ? $data['responsavel_ocupacao_id'] : ($cadastroIndividual->usuario_ocupacao_id ?? null),
'data_usuario_responsavel' => $dataUsuarioResponsavel,
'supervisor_id' => $cadastroIndividual ? $cadastroIndividual->supervisor_id : null,
],
'condicao' => [
'peso_id' => $data['peso_id'],
'internacao' => $data['internacao'],
'internacao_motivo' => $data['internacao_motivo'],
'doenca_cardiaca' => $data['doenca_cardiaca'],
'problemas_rins' => $data['problemas_rins'],
'doenca_respiratoria' => $data['doenca_respiratoria'],
'tratamento_saude_mental' => $data['tratamento_saude_mental'],
'acamado' => $data['acamado'],
'domiciliado' => $data['domiciliado'],
'plantas_medicinais' => $data['plantas_medicinais'],
'plantas_medicinais_quais' => $data['plantas_medicinais_quais'],
'doenca_cardiaca_quais' => $data['doenca_cardiaca_quais'],
'problemas_rins_quais' => $data['problemas_rins_quais'],
'doenca_respiratoria_quais' => $data['doenca_respiratoria_quais'],
'outras_condicoes_primaria' => $data['outras_condicoes_primaria'],
'outras_condicoes_secundaria' => $data['outras_condicoes_secundaria'],
'outras_condicoes_terciaria' => $data['outras_condicoes_terciaria'],
'avc_derrame' => $fatoresRisco->contains(FatorRisco::AVC) ? true : false,
'cancer' => $fatoresRisco->contains(FatorRisco::CANCERO) ? true : false,
'diabetes' => $fatoresRisco->contains(FatorRisco::DIABETES) ? true : false,
'fibromialgia' => $fatoresRisco->contains(FatorRisco::FIBROMIALGIA) ? true : false,
'fumante' => $fatoresRisco->contains(FatorRisco::TABAGISMO) ? true : false,
'gestante' => $fatoresRisco->contains(FatorRisco::GESTANTE) ? true : false,
'hanseniase' => $fatoresRisco->contains(FatorRisco::HANSENIASE) ? true : false,
'hipertensao' => $fatoresRisco->contains(FatorRisco::HIPERTENSAO) ? true : false,
'infarto' => $fatoresRisco->contains(FatorRisco::INFARTO) ? true : false,
'outras_drogas' => $fatoresRisco->contains(FatorRisco::OUTRAS_DROGAS) ? true : false,
'transtorno_espectro_autista' => $fatoresRisco->contains(FatorRisco::TEA) ? true : false,
'tuberculose' => $fatoresRisco->contains(FatorRisco::TUBERCULOSE) ? true : false,
'usa_alcool' => $fatoresRisco->contains(FatorRisco::USA_ALCOOL) ? true : false,
'maternidade_referencia' => $data['maternidade_referencia'],
'praticas_integrativas' => $data['praticas_integrativas'],
],
'informacao' => [
'responsavel' => $data['responsavel'],
'responsavel_cidadao_id' => $data['responsavel_cidadao_id'],
'parentesco_responsavel_id' => $data['parentesco_responsavel_id'],
'curso_id' => $data['curso_id'],
'frequenta_escola_creche' => $data['frequenta_escola_creche'],
'situacao_mercado_trabalho_id' => $data['situacao_mercado_trabalho_id'],
'frequenta_cuidador_tradicional' => $data['frequenta_cuidador_tradicional'],
'participa_grupo_comunitario' => $data['participa_grupo_comunitario'],
'plano_saude' => $data['plano_saude'],
'comunidade_tradicional' => $data['comunidade_tradicional'],
'comunidade_tradicional_id' => $data['comunidade_tradicional_id'],
'saida_cidadao_id' => $data['saida_cidadao_id'],
'motivo_saida_data' => $data['motivo_saida_data'],
'ocupacao_id' => $data['ocupacao_id'],
'acompanhamento_infantil' => $data['acompanhamento_infantil'],
'deficiente' => $data['deficiente'],
'deficiencias' => $data['deficiencias'],
'identidade_genero' => $paciente->cidadao->identidade_genero_id ? true : false,
'identidade_genero_id' => $paciente->cidadao->identidade_genero_id,
'orientacao_sexual' => $data['orientacao_sexual'],
'orientacao_sexual_id' => $data['orientacao_sexual_id'],
'obito' => $data['obito'],
'obito_em' => $data['obito_em'],
'obito_declaracao' => $data['obito_declaracao'],
'obito_causa' => $data['obito_causa'],
'obito_cid_id' => $data['obito_cid_id'],
],
'informacao_socioeconomica' => [
'alimentos_acabaram' => $data['alimentos_acabaram'],
'comeu_alguns_alimentos' => $data['comeu_alguns_alimentos'],
'data_atualizacao_tria' => $data['data_atualizacao_tria'] ?? null,
],
'cidadao' => [
'ativo' => true,
'responsavel' => $data['responsavel'],
'ocupacao_id' => $data['ocupacao_id'],
'responsavel_cidadao_id' => $data['responsavel_cidadao_id'],
'parentesco_responsavel_id' => $data['parentesco_responsavel_id'],
'renda_mensal' => $data['renda_mensal'],
],
'situacao_rua' => [
'alimentacao_diaria_id' => $data['alimentacao_diaria_id'] ? $data['alimentacao_diaria_id'] : null,
'higiene_pessoal' => $data['higiene_pessoal'] ? $data['higiene_pessoal'] : null,
'outra_instituicao' => $data['outra_instituicao'] ? $data['outra_instituicao'] : null,
'outra_instituicao_quais' => $data['outra_instituicao_quais'] ? $data['outra_instituicao_quais'] : null,
'parentesco' => $data['parentesco'] ? $data['parentesco'] : null,
'recebe_beneficio' => $data['recebe_beneficio'] ? $data['recebe_beneficio'] : null,
'referencia_familiar' => $data['referencia_familiar'] ? $data['referencia_familiar'] : null,
'situacao_rua_id' => $data['situacao_rua_id'] ? $data['situacao_rua_id'] : null,
'visita_familiar' => $data['visita_familiar'] ? $data['visita_familiar'] : null,
'origem_alimentacao' => $data['origem_alimentacao'] ? $data['origem_alimentacao'] : null,
'higiene_pessoal_quais' => $data['higiene_pessoal_quais'] ? $data['higiene_pessoal_quais'] : null,
],
'recusa_cadastro' => $data['informacao_social_recusa_cadastro'],
'origem' => 'cadastroPaciente',
];
if (isset($data['created_lotacao_id'])) {
$dados['created_lotacao_id'] = $data['created_lotacao_id'];
}
if (isset($data['created_centro_custo_id'])) {
$dados['created_centro_custo_id'] = $data['created_centro_custo_id'];
}
if (isset($data['updated_lotacao_id'])) {
$dados['updated_lotacao_id'] = $data['updated_lotacao_id'];
}
if (isset($data['updated_centro_custo_id'])) {
$dados['updated_centro_custo_id'] = $data['updated_centro_custo_id'];
}
if ($hasPermissao || $cadastroIndividual) {
CadastroIndividualService::saveStore($dados);
return true;
}
return false;
}
public static function saveResidente() {
$cidadao = Cidadao::where('id', request()->cidadao_id)->first();
$cidadao->update(['domicilio_id' => request()->domicilio_id]);
$cidadao->paciente->update([
'unidade_id' => request()->unidade_id,
'classificacao_id' => request()->classificacao_id,
'responsavel_usuario_id' => request()->responsavel_usuario_id,
'responsavel_ocupacao_id' => request()->responsavel_ocupacao_id,
'responsavel_equipe_id' => request()->responsavel_equipe_id,
'responsavel_data' => Carbon::now()->format('Y-m-d'),
]);
self::registrarEntradaDomicilio($cidadao->id, request()->domicilio_id);
IntegracaoCidadaoService::integrar($cidadao->id);
return PacienteController::getResidentes(request()->domicilio_id);
}
private static function registrarMudancaDomicilio($cidadao, $domicilioIdAntigo) {
$domicilioIdNovo = $cidadao->domicilio_id;
if ($domicilioIdAntigo == $domicilioIdNovo) {
return;
}
if ($domicilioIdAntigo) {
self::registrarSaidaDomicilio($cidadao->id, $domicilioIdAntigo);
}
if ($domicilioIdNovo) {
self::registrarEntradaDomicilio($cidadao->id, $domicilioIdNovo);
}
}
private static function registrarEntradaDomicilio($cidadaoId, $domicilioId) {
CidadaoDomicilioHistorico::updateOrCreate(
[
'cidadao_id' => $cidadaoId,
'domicilio_id' => $domicilioId,
'data_saida' => null,
],
[
'data_entrada' => Carbon::now()->format('Y-m-d'),
]
);
}
private static function registrarSaidaDomicilio($cidadaoId, $domicilioId) {
if (!$domicilioId) {
return;
}
CidadaoDomicilioHistorico::where('cidadao_id', $cidadaoId)
->where('domicilio_id', $domicilioId)
->whereNull('data_saida')
->update(['data_saida' => Carbon::now()->format('Y-m-d')]);
}
public static function getResidentesAnteriores($domicilioId) {
return DB::table('cadastro_cidadao_domicilio_historico')
->select([
'cadastro_cidadao_domicilio_historico.id',
'cadastro_cidadao.nome AS nome',
'cadastro_sexo.descricao AS sexo',
DB::raw('LPAD(cadastro_paciente.prontuario,7,0) AS prontuario'),
'cadastro_cidadao_domicilio_historico.data_entrada',
'cadastro_cidadao_domicilio_historico.data_saida',
])
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_cidadao_domicilio_historico.cidadao_id')
->leftJoin('cadastro_paciente', 'cadastro_paciente.cidadao_id', 'cadastro_cidadao.id')
->leftJoin('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id')
->where('cadastro_cidadao_domicilio_historico.domicilio_id', $domicilioId)
->whereNotNull('cadastro_cidadao_domicilio_historico.data_saida')
->orderByDesc('cadastro_cidadao_domicilio_historico.data_saida')
->get()
->map(function ($residente) {
$residente->tempo_moradia = self::getTempoMoradia($residente->data_entrada, $residente->data_saida);
$residente->data_entrada = (new Carbon($residente->data_entrada))->format('d/m/Y');
$residente->data_saida = (new Carbon($residente->data_saida))->format('d/m/Y');
return $residente;
});
}
private static function getTempoMoradia($dataEntrada, $dataSaida) {
$inicio = Carbon::parse($dataEntrada);
$fim = Carbon::parse($dataSaida);
$anos = $inicio->diffInYears($fim);
$inicio->addYears($anos);
$meses = $inicio->diffInMonths($fim);
$inicio->addMonths($meses);
$dias = $inicio->diffInDays($fim);
$partes = [];
if ($anos > 0) {
$partes[] = $anos . ($anos == 1 ? ' ano' : ' anos');
}
if ($meses > 0) {
$partes[] = $meses . ($meses == 1 ? ' mês' : ' meses');
}
if (empty($partes) || $dias > 0) {
$partes[] = $dias . ($dias == 1 ? ' dia' : ' dias');
}
return implode(' e ', $partes);
}
public static function removeResidente($cidadaoId) {
$cidadao = Cidadao::where('id', $cidadaoId)->first();
$domicilioId = $cidadao->domicilio_id;
$cidadao->update(['domicilio_id' => null]);
$cidadao->paciente->update([
'classificacao_id' => Classificacao::PROVISORIO,
]);
if ($cidadao->paciente->responsavel) {
$cidadao->paciente->responsavel->delete();
}
if($cidadao->paciente->cadastroIndividual) {
$cidadao->paciente->cadastroIndividual->update([
'usuario_id' => null,
'equipe_id' => null,
'usuario_ocupacao_id' => null,
'data_usuario_responsavel' => null,
'responsavel' => false,
]);
}
self::registrarSaidaDomicilio($cidadao->id, $domicilioId);
IntegracaoCidadaoService::integrar($cidadao->id);
self::saveHistorico($cidadao->paciente->id);
if (isset(request()->remove_familia) && request()->remove_familia == true) {
$residentes = Cidadao::where('domicilio_id', $domicilioId)->get();
foreach ($residentes as $residente) {
$residente->update(['domicilio_id' => null]);
$residente->paciente->update([
'classificacao_id' => Classificacao::PROVISORIO,
]);
if ($residente->paciente->responsavel) {
$residente->paciente->responsavel->delete();
}
if($residente->paciente->cadastroIndividual) {
$residente->paciente->cadastroIndividual->update([
'usuario_id' => null,
'equipe_id' => null,
'usuario_ocupacao_id' => null,
'data_usuario_responsavel' => null,
'responsavel' => false,
]);
}
self::registrarSaidaDomicilio($residente->id, $domicilioId);
IntegracaoCidadaoService::integrar($residente->id);
self::saveHistorico($residente->paciente->id);
}
}
return [
'residentes' => $domicilioId ? self::getResidentes($domicilioId) : [],
'residentes_anteriores' => $domicilioId ? self::getResidentesAnteriores($domicilioId) : [],
];
}
public static function getDomicilio() {
$informacaoResidencial = null;
$domicilio = null;
$endereco = Endereco::where('logradouro_id', request()->logradouro_id)
->where('numero', request()->numero)
->where('complemento', request()->complemento)
->first();
if ($endereco) {
$domicilio = $endereco->domicilios->first();
if ($domicilio) {
$informacaoResidencial = $domicilio->informacaoResidencial;
if ($informacaoResidencial && $informacaoResidencial->lazer) {
$informacaoResidencial->new_lazer = $informacaoResidencial->lazer->pluck('id')->toArray();
}
if ($informacaoResidencial && $informacaoResidencial->animal) {
$informacaoResidencial->new_animal = $informacaoResidencial->animal->pluck('id')->toArray();
}
}
}
return [
'informacaoResidencial' => $informacaoResidencial,
'residentes' => $domicilio ? self::getResidentes($domicilio->id) : [],
];
}
private function getPreparedData($params)
{
$data = [
'email' => $params['email'] ?? null,
'classificacao_id' => $params['classificacao_id'],
'subclassificacao_id' => $params['subclassificacao_id'] ?? null,
'validade_inicio' => $params['validade_inicio'] ?? null,
'validade_fim' => $params['validade_fim'] ?? null,
'prontuario_unidade' => $params['prontuario_unidade'] ?? null,
'unidade_id' => $params['unidade_id'],
'bloqueado' => $params['bloqueado'] ?? false,
'sem_documentos_em' => $params['sem_documentos_em'] ?? null,
'sequencial_desconhecido' => null,
'sequencial_desconhecido_em' => null,
'responsavel_usuario_id' => isset($params['responsavel_usuario']) ? $params['responsavel_usuario']['id'] : null,
'responsavel_equipe_id' => $params['responsavel_equipe_id'] ?? null,
'responsavel_ocupacao_id' => $params['responsavel_ocupacao_id'] ?? null,
'responsavel_data' => $params['responsavel_data'] ?? null,
'peso_id' => $params['peso_id'] ?? null,
'internacao' => $params['internacao'] ?? null,
'internacao_motivo' => $params['internacao_motivo'] ?? null,
'internacao_data' => $params['internacao_data'] ?? null,
'doenca_cardiaca' => $params['doenca_cardiaca'] ?? null,
'doenca_cardiaca_quais' => $params['doenca_cardiaca_quais'] ?? null,
'problemas_rins' => $params['problemas_rins'] ?? null,
'problemas_rins_quais' => $params['problemas_rins_quais'] ?? null,
'doenca_respiratoria' => $params['doenca_respiratoria'] ?? null,
'doenca_respiratoria_quais' => $params['doenca_respiratoria_quais'] ?? null,
'tratamento_saude_mental' => $params['tratamento_saude_mental'] ?? null,
'tratamento_saude_mental_internacao_data' => $params['tratamento_saude_mental_internacao_data'] ?? null,
'tratamento_saude_mental_alta_data' => $params['tratamento_saude_mental_alta_data'] ?? null,
'acamado' => $params['acamado'] ?? null,
'domiciliado' => $params['domiciliado'] ?? null,
'deficiente' => $params['deficiente'] ?? null,
'plantas_medicinais' => $params['plantas_medicinais'] ?? null,
'plantas_medicinais_quais' => $params['plantas_medicinais_quais'] ?? null,
'praticas_integrativas' => $params['praticas_integrativas'] ?? null,
'outras_condicoes_primaria' => $params['outras_condicoes_primaria'] ?? null,
'outras_condicoes_secundaria' => $params['outras_condicoes_secundaria'] ?? null,
'outras_condicoes_terciaria' => $params['outras_condicoes_terciaria'] ?? null,
'data_ultima_menstruacao' => $params['data_ultima_menstruacao'] ?? null,
'idade_gestacional_semanas' => $params['idade_gestacional_semanas'] ?? null,
'idade_gestacional_dias' => $params['idade_gestacional_dias'] ?? null,
'data_possivel_parto' => $params['data_possivel_parto'] ?? null,
'gravidez_planejada' => $params['gravidez_planejada'] ?? null,
'gestacao_previa' => $params['gestacao_previa'] ?? null,
'parto' => $params['parto'] ?? null,
'responsavel' => $params['responsavel'] ?? null,
'responsavel_cidadao_id' => $params['responsavel_cidadao_id'] ?? null,
'parentesco_responsavel_id' => $params['parentesco_responsavel_id'] ?? null,
'curso_id' => $params['curso_id'] ?? null,
'orientacao_sexual' => $params['orientacao_sexual'] ?? null,
'orientacao_sexual_id' => $params['orientacao_sexual_id'] ?? null,
'frequenta_escola_creche' => $params['frequenta_escola_creche'] ?? null,
'situacao_mercado_trabalho_id' => $params['situacao_mercado_trabalho_id'] ?? null,
'frequenta_cuidador_tradicional' => $params['frequenta_cuidador_tradicional'] ?? null,
'participa_grupo_comunitario' => $params['participa_grupo_comunitario'] ?? null,
'plano_saude' => $params['plano_saude'] ?? null,
'comunidade_tradicional' => $params['comunidade_tradicional'] ?? null,
'comunidade_tradicional_id' => $params['comunidade_tradicional_id'] ?? null,
'saida_cidadao_id' => $params['saida_cidadao_id'] ?? null,
'motivo_saida_data' => $params['motivo_saida_data'] ?? null,
'alimentos_acabaram' => isset($params['alimentos_acabaram']) ? $params['alimentos_acabaram'] : null,
'comeu_alguns_alimentos' => isset($params['comeu_alguns_alimentos']) ? $params['comeu_alguns_alimentos'] : null,
'data_atualizacao_tria' => $params['data_atualizacao_tria'] ?? null,
'informacao_social_recusa_cadastro' => $params['informacao_social_recusa_cadastro'] ?? null,
'acompanhamento_infantil' => $params['acompanhamento_infantil'] ?? null,
'deficiencias' => $params['deficiencias'] ?? null,
'obito' => $params['obito'] ?? null,
'obito_em' => $params['obito_em'] ?? null,
'obito_declaracao' => $params['obito_declaracao'] ?? null,
'obito_causa' => $params['obito_causa'] ?? null,
'obito_cid_id' => $params['obito_cid_id'] ?? null,
'microarea_id' => $params['microarea_id'] ?? null,
'fora_area' => $params['fora_area'] ?? null,
'instituicao_nome' => $params['instituicao_nome'] ?? null,
'instituicao_outros_profissionais' => $params['instituicao_outros_profissionais'] ?? null,
'instituicao_nome_responsavel_tecnico' => $params['instituicao_nome_responsavel_tecnico'] ?? null,
'instituicao_cns_responsavel_tecnico' => $params['instituicao_cns_responsavel_tecnico'] ?? null,
'instituicao_cargo_responsavel_tecnico' => $params['instituicao_cargo_responsavel_tecnico'] ?? null,
'instituicao_telefone_responsavel_tecnico' => $params['instituicao_telefone_responsavel_tecnico'] ?? null,
'imovel_tipo_id' => $params['imovel_tipo_id'] ?? null,
'situacao_domicilio_id' => $params['situacao_domicilio_id'] ?? null,
'domicilio_tipo_id' => $params['domicilio_tipo_id'] ?? null,
'quantidade_comodos' => $params['quantidade_comodos'] ?? null,
'situacao_rural_id' => $params['situacao_rural_id'] ?? null,
'domicilio_zona_id' => $params['domicilio_zona_id'] ?? null,
'domicilio_tipo_acesso_id' => $params['domicilio_tipo_acesso_id'] ?? null,
'material_predominante_id' => $params['material_predominante_id'] ?? null,
'abastecimento_id' => $params['abastecimento_id'] ?? null,
'tratamento_id' => $params['tratamento_id'] ?? null,
'destino_lixo_id' => $params['destino_lixo_id'] ?? null,
'forma_escoamento_id' => $params['forma_escoamento_id'] ?? null,
'possui_animais' => $params['possui_animais'] ?? null,
'quantidade_animais' => $params['quantidade_animais'] ?? null,
'energia_eletrica' => $params['energia_eletrica'] ?? null,
'higiene_residencial_id' => $params['higiene_residencial_id'] ?? null,
'bolsa_familia' => $params['bolsa_familia'] ?? null,
'vale_gas' => $params['vale_gas'] ?? null,
'bolsa_escola' => $params['bolsa_escola'] ?? null,
'bpc' => $params['bpc'] ?? null,
'informacao_residencial_recusa_cadastro' => $params['informacao_residencial_recusa_cadastro'] ?? null,
'escala_coelho_id' => $params['escala_coelho_id'] ?? null,
'renda_mensal' => $params['renda_mensal'] ?? null,
'ocupacao_id' => $params['ocupacao_id'] ?? null,
'renda_total_familiar' => $params['renda_total_familiar'] ?? null,
'possui_veiculo_proprio' => $params['possui_veiculo_proprio'] ?? false,
'possui_financiamento' => $params['possui_financiamento'] ?? false,
'possui_emprestimo' => $params['possui_emprestimo'] ?? false,
'animal' => $params['animal'] ?? null,
'lazer' => $params['lazer'] ?? null,
'veiculos' => $params['veiculos'] ?? null,
'financiamentos' => $params['financiamentos'] ?? null,
'emprestimos' => $params['emprestimos'] ?? null,
'protocolo_cross' => $params['cidadao']['documentos']['outro']['protocolo_cross'] ?? null,
'alimentacao_diaria_id' => $params['alimentacao_diaria_id'] ?? null,
'higiene_pessoal' => $params['higiene_pessoal'] ?? null,
'outra_instituicao' => $params['outra_instituicao'] ?? null,
'outra_instituicao_quais' => $params['outra_instituicao_quais'] ?? null,
'parentesco' => $params['parentesco'] ?? null,
'recebe_beneficio' => $params['recebe_beneficio'] ?? null,
'referencia_familiar' => $params['referencia_familiar'] ?? null,
'situacao_rua_id' => $params['situacao_rua_id'] ?? null,
'visita_familiar' => $params['visita_familiar'] ?? null,
'origem_alimentacao' => $params['origem_alimentacao'] ?? null,
'higiene_pessoal_quais' => $params['higiene_pessoal_quais'] ?? null,
'maternidade_referencia' => $params['maternidade_referencia'] ?? null,
'gestante' => $params['gestante'] ?? null,
];
if (is_string($data['prontuario_unidade'])) {
$data['prontuario_unidade'] = mb_strtoupper($data['prontuario_unidade']);
}
if (isset($params['origem']) && $params['origem'] == 'mobile') {
$data['created_lotacao_id'] = $params['cidadao']['created_lotacao_id'];
$data['created_centro_custo_id'] = $params['cidadao']['created_centro_custo_id'];
$data['updated_lotacao_id'] = $params['cidadao']['updated_lotacao_id'];
$data['updated_centro_custo_id'] = $params['cidadao']['updated_centro_custo_id'];
}
return $data;
}
public function destroy(int $id)
{
$this->auth(__FUNCTION__);
Paciente::findOrFail($id)->delete();
return response()->json(null, Response::HTTP_NO_CONTENT);
}
public function bloquear($id)
{
$this->auth(__FUNCTION__);
$paciente = Paciente::findOrFail($id);
$paciente->update(['bloqueado' => true]);
return response()->json($paciente->fresh(), Response::HTTP_OK);
}
public function desbloquear($id)
{
$this->auth(__FUNCTION__);
$paciente = Paciente::findOrFail($id);
$paciente->update(['bloqueado' => false]);
return response()->json($paciente->fresh(), Response::HTTP_OK);
}
public function autocomplete()
{
$parametrizacao = Parametrizacao::first();
$provisorioBloqueado = $parametrizacao->cadastro_paciente_provisorio_bloqueado ?? false;
$provisorioQuantidadeDias = $parametrizacao->cadastro_paciente_provisorio_quantidade_dias ?? 0;
$search = request()->query('search')['value'] ?? null;
$pacientes = Paciente::query()
->join('cadastro_cidadao','cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->with(['cidadao', 'cidadao.sexo', 'cidadao.nacionalidade', 'cidadao.racaCor', 'cidadao.etniaIndigena'])
->select('cadastro_paciente.*', 'cadastro_cidadao.nome');
if (DataUtil::isStringBoolean(request()->query('imunizacao_aplicacao_campanha'))) {
if (self::getImunizcaoParametrizacao()->perfil_campanha) {
$campanha = CadastroCampanhaService::show(request()->query('campanha_id'));
$campanha->populacoes->each(function ($populacao) use ($pacientes) {
if ($populacao->idade_inicial_medida_tempo_id === MedidaTempo::DIAS) {
$pacientes->orWhereHas('cidadao', function ($query) use ($populacao) {
$query
->whereRaw("TIMESTAMPDIFF(DAY, data_nascimento, CURRENT_DATE) >= $populacao->idade_inicial")
->whereRaw("TIMESTAMPDIFF(DAY, data_nascimento, CURRENT_DATE) <= $populacao->idade_final");
if ($populacao->sexo_id === Sexo::FEMININO) {
$query->where('sexo_id', Sexo::FEMININO);
} elseif ($populacao->sexo_id === Sexo::MASCULINO) {
$query->where('sexo_id', Sexo::MASCULINO);
}
});
} elseif ($populacao->idade_inicial_medida_tempo_id === MedidaTempo::MESES) {
$pacientes->orWhereHas('cidadao', function ($query) use ($populacao) {
$query
->whereRaw("TIMESTAMPDIFF(MONTH, data_nascimento, CURRENT_DATE) >= $populacao->idade_inicial")
->whereRaw("TIMESTAMPDIFF(MONTH, data_nascimento, CURRENT_DATE) <= $populacao->idade_final");
if ($populacao->sexo_id === Sexo::FEMININO) {
$query->where('sexo_id', Sexo::FEMININO);
} elseif ($populacao->sexo_id === Sexo::MASCULINO) {
$query->where('sexo_id', Sexo::MASCULINO);
}
});
} elseif ($populacao->idade_inicial_medida_tempo_id === MedidaTempo::ANOS) {
$pacientes->orWhereHas('cidadao', function ($query) use ($populacao) {
$query
->whereRaw("TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE) >= $populacao->idade_inicial")
->whereRaw("TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE) <= $populacao->idade_final");
if ($populacao->sexo_id === Sexo::FEMININO) {
$query->where('sexo_id', Sexo::FEMININO);
} elseif ($populacao->sexo_id === Sexo::MASCULINO) {
$query->where('sexo_id', Sexo::MASCULINO);
}
});
}
});
}
}
$pacientes->where(function ($query) {
$query
->where('cadastro_paciente.bloqueado', false)
->orWhereNull('cadastro_paciente.bloqueado');
});
if ($provisorioBloqueado) {
$pacientes->where(function ($query) use ($provisorioQuantidadeDias) {
$query->where('cadastro_paciente.subclassificacao_id', '!=', Subclassificacao::TEMPORARIO)
->orWhere(function ($query) use ($provisorioQuantidadeDias) {
$query->where('cadastro_paciente.subclassificacao_id', Subclassificacao::TEMPORARIO)
->where(function ($query) use ($provisorioQuantidadeDias) {
$query->where(function ($query) {
$query->whereNull('cadastro_paciente.validade_inicio')
->orWhereDate('cadastro_paciente.validade_inicio', '<=', Carbon::now()->format('Y-m-d'));
});
$query->where(function ($query) use ($provisorioQuantidadeDias) {
$query->whereNull('cadastro_paciente.validade_fim')
->orWhere(function ($query) use ($provisorioQuantidadeDias) {
if (!is_null($provisorioQuantidadeDias) && $provisorioQuantidadeDias > 0) {
$query->whereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->format('Y-m-d'))
->orWhereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->subDays($provisorioQuantidadeDias)->format('Y-m-d'));
} else {
$query->whereDate('cadastro_paciente.validade_fim', '>=', Carbon::now()->format('Y-m-d'));
}
});
});
});
})
->orWhereNull('cadastro_paciente.subclassificacao_id');
});
}
if (DataUtil::isStringBoolean(request()->query('not_cidadao_obito'))) {
$pacientes->whereDoesntHave('cidadao.obito', function ($query) {
$query->whereNull('cadastro_obito.deleted_at');
});
}
if($search){
$pacientes->orderByRaw("
CASE
WHEN cadastro_cidadao.nome = ? then 0
WHEN cadastro_cidadao.nome LIKE ? then 1
WHEN cadastro_cidadao.nome LIKE ? then 2
ELSE 3
END
",[
$search,
"$search%",
"%$search"
]);
}
return datatables()
->of($pacientes)
->filterColumn('prontuario', function ($query, $keyword) {
$query->whereRaw('LPAD(prontuario,7,0) like ?', ["%{$keyword}%"]);
})
->filterColumn('cidadao.cpf', function ($query, $keyword) {
$query->whereHas('cidadao', function ($query) use ($keyword) {
$query
->whereRaw("cpf like ?", ["%{$keyword}%"])
->orWhereRaw(
"CONCAT(
SUBSTR(cpf,1,3),
'.',
SUBSTR(cpf,4,3),
'.',
SUBSTR(cpf,7,3),
'-',
SUBSTR(cpf,10,2)
) like ?",
["%{$keyword}%"]
);
});
})
->filterColumn('cidadao.data_nascimento', function ($query, $keyword) {
$query->whereHas('cidadao', function ($query) use ($keyword) {
$query
->whereRaw("DATE_FORMAT(data_nascimento, '%d/%m/%Y') like ?", ["%{$keyword}%"])
->orWhereRaw(
"CONCAT(
SUBSTR(data_nascimento,9,2),
SUBSTR(data_nascimento,6,2),
SUBSTR(data_nascimento,1,4)
) like ?",
["%{$keyword}%"]
);
});
})
->toJson();
}
private static function getImunizcaoParametrizacao()
{
return DB::table('imunizacao_parametrizacao')
->select([
'perfil_campanha',
])
->first();
}
public static function isCadastroPacienteVencido($pacienteId)
{
$paciente = Paciente::findOrFail($pacienteId);
if (is_null($paciente->validade_fim)) {
return false;
}
return Carbon::today() > $paciente->validade_fim;
}
private function getPermissoesAtualizacaoCadastroPaciente()
{
$parametrizacao = CnsService::getParametrizacao();
if (!is_null($parametrizacao)) {
$lotacao = self::getCurrentLotacao();
return DB::table('cadastro_parametrizacao_permissao_usuario')
->select([
'municipe',
'provisorio',
'outro_municipio',
])
->where('infraestrutura_id', $lotacao->infraestrutura_id)
->where('usuario_id', $lotacao->usuario_id)
->get()
->first();
}
return null;
}
public function getPaciente($id = null)
{
if (is_null($id)) {
return null;
}
return Paciente::find($id);
}
public static function obterFichaPacientePorCpf($cpf)
{
$cidadao = Cidadao::with('paciente')->where('cpf', $cpf)->first();
if (is_null($cidadao)) {
return null;
}
if (is_null($cidadao->paciente)) {
return null;
}
return $cidadao->paciente->id;
}
public function getAdditionalsFormModelData($id, $checarPermissaoCadastro = true)
{
$paciente = Paciente::findOrFail($id);
if ($checarPermissaoCadastro) {
if (!self::checkPermissaoCadastro($paciente->classificacao_id)) {
throw new AlteracaoCadastroPacienteNaoPermitidoException();
}
}
$prontuarioUnidade = $paciente->prontuariosUnidade()
->where('unidade_id', $this->getCurrentCentroCusto()->infraestrutura->unidade_id)
->first();
$parametrizacao = Parametrizacao::first();
$quantidadeDias = $parametrizacao->cadastro_paciente_desatualizado_quantidade_dias ?? 0;
$exigeCpfPaciente = $parametrizacao->exige_cpf_paciente ?? true;
$exigeCnsPaciente = $parametrizacao->exige_cns_paciente ?? true;
$updatedAt = $paciente->updated_at > $paciente->cidadao->updated_at
? $paciente->updated_at
: $paciente->cidadao->updated_at;
if ($updatedAt) {
$updatedAtCarbon = Carbon::createFromFormat('Y-m-d H:i:s', $updatedAt);
$updatedAtCarbon->addDays($quantidadeDias);
$currentDateTime = Carbon::now();
if ($updatedAtCarbon->lessThan($currentDateTime)) {
$diasAtrasados = $updatedAtCarbon->diffInDays($currentDateTime);
$diasAtrasados = str_pad($diasAtrasados, 2, '0', STR_PAD_LEFT);
} else {
$diasAtrasados = null;
}
} else {
$diasAtrasados = null;
}
$cadastroDomiciliar = CadastroDomiciliar::where('domicilio_id', $paciente->cidadao->domicilio_id)->first();
$cadastroIndividual = CadastroIndividual::where('paciente_id', $paciente->id)->first();
$hasCadastroIndividual = CadastroIndividual::where('paciente_id', $paciente->id)->first() ? false : true;
$hasCadastroDomiciliar = $cadastroDomiciliar ? false : true;
$informacaoResidencial = $paciente->cidadao->domicilio && $paciente->cidadao->domicilio->informacaoResidencial
? $paciente->cidadao->domicilio->informacaoResidencial
: null;
$internacaoData = $paciente->condicaoSaude->internacao_data ?? null;
if ($internacaoData && Carbon::parse($internacaoData)->lt(Carbon::now()->subYear())) {
$internacao = null;
$internacaoMotivo = null;
$internacaoData = null;
} else {
$internacao = $paciente->condicaoSaude->internacao ?? null;
$internacaoMotivo = $paciente->condicaoSaude->internacao_motivo ?? null;
$internacaoData = $internacaoData;
}
$isPacienteResponsavel = $paciente->informacaoSocial && $paciente->informacaoSocial->responsavel === true;
$responsaveis = self::getResponsaveis($paciente);
$isResponsavel = (count($responsaveis) === 0 && !$isPacienteResponsavel)
? false : $isPacienteResponsavel;
$responsavelCidadaoId = $paciente->informacaoSocial->responsavel_cidadao_id ?? null;
if (!$isResponsavel && is_null($responsavelCidadaoId) && $responsaveis->count() === 1) {
$responsavelCidadaoId = $responsaveis->first()->id;
}
$fatoresRisco = $paciente->cidadao->fatoresRisco->pluck('id');
$transtornoEspectroAutista = $fatoresRisco->contains(FatorRisco::TEA) ? true : false;
$deficiencias = $paciente && $paciente->informacaoSocial
? $paciente->informacaoSocial->deficiencia->pluck('id')
: collect();
$deficiente = $paciente->informacaoSocial->deficiente ?? null;
if ($transtornoEspectroAutista) {
$deficiente = true;
if (!$deficiencias->contains(Deficiencia::TEA)) {
$deficiencias->push(Deficiencia::TEA);
}
}
if ($deficiencias->contains(Deficiencia::TEA) && !$fatoresRisco->contains(FatorRisco::TEA)) {
$paciente->cidadao->fatoresRisco()->attach(FatorRisco::TEA);
}
return response()->json(
[
'additionals' => [
'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(),
'exige_cpf_paciente' => $exigeCpfPaciente,
'exige_cns_paciente' => $exigeCnsPaciente,
],
'form' => array_merge(
[
'cidadao' => CidadaoService::edit($paciente->cidadao_id)['form'],
'prontuario' => $paciente->prontuario,
'is_unidade_referencia' => $paciente->unidade && $paciente->unidade->unidade_referencia === true,
'is_responsavel' => $isResponsavel,
'atualizacao' => $updatedAt ? (new Carbon($updatedAt))->format('d/m/Y H:i') : null,
'dias_atrasados' => $quantidadeDias && $quantidadeDias > 0 ? $diasAtrasados : null,
'historico' => PacienteHistorico::where('paciente_id', $paciente->id)
->orderBy('created_at')
->get()
->map(fn ($historico) => [
'data' => $historico->is_integrado == 1 || $historico->lotacao != null
? (new Carbon($historico->created_at))->format('d/m/Y H:i') : null,
'usuario' => $historico->is_integrado == 1
? 'INTEGRAÇÃO'
:($historico->lotacao
? $historico->lotacao->usuario->cidadao->nome
: null),
'equipe' => $historico->equipe && $historico->equipe->microarea_id
? ($historico->equipe->microarea->descricao
? 'INE: ' . str_pad($historico->equipe->microarea->area->numero_ine, 10, '0', STR_PAD_LEFT)
. ' - ÁREA: ' . $historico->equipe->microarea->area->descricao
. ' - MICROÁREA: ' . $historico->equipe->microarea->descricao
: 'INE: ' . str_pad($historico->equipe->microarea->area->numero_ine, 10, '0', STR_PAD_LEFT)
. ' - ÁREA: ' . $historico->equipe->microarea->area->descricao)
: '-',
])->filter(),
'impressoes' => [
['value' => 'cadastroIndividual', 'text' => 'Cadastro individual', 'disabled' => $hasCadastroIndividual],
['value' => 'cadastroDomiciliar', 'text' => 'Cadastro domiciliar', 'disabled' => $hasCadastroDomiciliar],
['value' => 'termoRecusaCadastro', 'text' => 'Termo de recusa do cadastro', 'disabled' => false],
['value' => 'etiquetaConectasus', 'text' => 'Etiqueta do prontuário', 'disabled' => false],
['value' => 'residentes', 'text' => 'Residentes', 'disabled' => false],
['value' => 'folhaRosto', 'text' => 'Folha de rosto', 'disabled' => false],
['value' => 'cartaoNacionalSaude', 'text' => 'Cartão nacional de saúde', 'disabled' => false],
],
'residentes' => $paciente && $paciente->cidadao->domicilio_id
? self::getResidentes($paciente->cidadao->domicilio_id) : [],
'residentes_anteriores' => $paciente && $paciente->cidadao->domicilio_id
? self::getResidentesAnteriores($paciente->cidadao->domicilio_id) : [],
'domicilio_id' => $paciente ? $paciente->cidadao->domicilio_id : null,
'cadastro_domiciliar_id' => $cadastroDomiciliar ? $cadastroDomiciliar->id : null,
'responsaveis' => $responsaveis,
],
$this->getFormData($paciente->unidade_id, true)
),
'model' => [
'email' => $paciente->email,
'classificacao_id' => $paciente->classificacao_id,
'subclassificacao_id' => $paciente->subclassificacao_id,
'validade_inicio' => $paciente->validade_inicio,
'validade_fim' => $paciente->validade_fim,
'prontuario_unidade' => $prontuarioUnidade->prontuario ?? null,
'protocolo_cross' => $paciente->protocolo_cross ?? null,
'unidade_id' => $paciente->unidade_id,
'infraestrutura_id' => $paciente->infraestrutura_id,
'altera_responsavel' => false,
'domicilio_id_old' => $paciente->cidadao->domicilio_id ?? null,
'responsavel_usuario' => [
'id' => $paciente->responsavel && $paciente->responsavel->usuario
? $paciente->responsavel->usuario->id : null,
'cidadao_nome' => $paciente->responsavel && $paciente->responsavel->usuario
? $paciente->responsavel->usuario->cidadao->nome : null,
],
'responsavel_unidade_id' => $paciente->responsavel && $paciente->responsavel->equipe
? $paciente->responsavel->equipe->unidade_id : null,
'responsavel_infraestrutura_id' => $paciente->responsavel && $paciente->responsavel->equipe
? $paciente->responsavel->equipe->infraestrutura_id : null,
'responsavel_equipe_id' => $paciente->responsavel
? $paciente->responsavel->responsavel_equipe_id : null,
'responsavel_ocupacao_id' => $paciente->responsavel
? $paciente->responsavel->responsavel_ocupacao_id : null,
'responsavel_data' => $paciente->responsavel && $paciente->responsavel->responsavel_data
? $paciente->responsavel->responsavel_data : Carbon::now()->format('Y-m-d'),
'prontuarios_unidades' => $paciente->prontuariosUnidade,
'bloqueado' => $paciente->bloqueado ? true : false,
'cidadao' => array_merge([
'id' => $paciente->cidadao_id,
], CidadaoService::edit($paciente->cidadao_id)['model']),
'impressoes' => [],
'curso_id' => $paciente ? $paciente->curso_id : null,
'frequenta_escola_creche' => $paciente ? $paciente->frequenta_escola_creche : null,
'situacao_mercado_trabalho_id' => $paciente ? $paciente->situacao_mercado_trabalho_id : null,
'frequenta_cuidador_tradicional' => $paciente ? $paciente->frequenta_cuidador_tradicional : null,
'participa_grupo_comunitario' => $paciente ? $paciente->participa_grupo_comunitario : null,
'acompanhamento_infantil' => $paciente && $paciente->informacaoSocial
? $paciente->informacaoSocial->acompanhamentoInfantil->pluck('id')
: [],
'deficiencias' => $deficiencias,
'plano_saude' => $paciente
? $paciente->cidadao->conveniosMedico->isEmpty() ? $paciente->plano_saude : true
: null,
'convenio_medico' => $paciente->cidadao->conveniosMedico ?? null,
'comunidade_tradicional' => $paciente ? $paciente->comunidade_tradicional : null,
'comunidade_tradicional_qual' => $paciente && $paciente->comunidade_tradicional ? [
'id' => $paciente->comunidadeTradicionalQual->id,
'codigo_esus' => $paciente->comunidadeTradicionalQual->codigo_esus,
'descricao' => $paciente->comunidadeTradicionalQual->descricao,
] : null,
'saida_cidadao_id' => optional($paciente->informacaoSocial)->saida_cidadao_id,
'motivo_saida_data' => optional($paciente->informacaoSocial)->motivo_saida_data,
'obito' => $paciente->cidadao->obito ? true : false,
'obito_em' => $paciente->cidadao->obito ? (new Carbon($paciente->cidadao->obito->obito_em))->format('Y-m-d') : null,
'hora_obito' => $paciente->cidadao->obito ? (new Carbon($paciente->cidadao->obito->obito_em))->format('H:i:s') : null,
'obito_declaracao' => $paciente->cidadao->obito->declaracao ?? null,
'obito_causa' => $paciente->cidadao->obito->causa ?? null,
'obito_cid' => [
'id' => $paciente->cidadao->obito->cid->id ?? null,
'nome' => $paciente->cidadao->obito->cid->nome ?? null,
],
'fora_area' => $informacaoResidencial ? $informacaoResidencial->fora_area : false,
'microarea_id' => $informacaoResidencial ? $informacaoResidencial->microarea_id : null,
'imovel_tipo_id' => $informacaoResidencial ? $informacaoResidencial->imovel_tipo_id : null,
'situacao_domicilio_id' => $informacaoResidencial ? $informacaoResidencial->situacao_domicilio_id : null,
'domicilio_tipo_id' => $informacaoResidencial ? $informacaoResidencial->domicilio_tipo_id : null,
'quantidade_comodos' => $informacaoResidencial ? $informacaoResidencial->quantidade_comodos : null,
'situacao_rural_id' => $informacaoResidencial ? $informacaoResidencial->situacao_rural_id : null,
'domicilio_zona_id' => $informacaoResidencial ? $informacaoResidencial->domicilio_zona_id : null,
'domicilio_tipo_acesso_id' => $informacaoResidencial ? $informacaoResidencial->domicilio_tipo_acesso_id : null,
'material_predominante_id' => $informacaoResidencial ? $informacaoResidencial->material_predominante_id : null,
'abastecimento_id' => $informacaoResidencial ? $informacaoResidencial->abastecimento_id : null,
'tratamento_id' => $informacaoResidencial ? $informacaoResidencial->tratamento_id : null,
'destino_lixo_id' => $informacaoResidencial ? $informacaoResidencial->destino_lixo_id : null,
'forma_escoamento_id' => $informacaoResidencial ? $informacaoResidencial->forma_escoamento_id : null,
'possui_animais' => $informacaoResidencial ? $informacaoResidencial->possui_animais : false,
'energia_eletrica' => $informacaoResidencial ? $informacaoResidencial->energia_eletrica : false,
'quantidade_animais' => $informacaoResidencial ? $informacaoResidencial->quantidade_animais : null,
'animal' => $informacaoResidencial && $informacaoResidencial->animal ? $informacaoResidencial->animal->pluck('id') : [],
'escala_coelho_id' => $informacaoResidencial ? $informacaoResidencial->escala_coelho_id : null,
'higiene_residencial_id' => $informacaoResidencial ? $informacaoResidencial->higiene_residencial_id : null,
'bolsa_familia' => $informacaoResidencial ? $informacaoResidencial->bolsa_familia : false,
'vale_gas' => $informacaoResidencial ? $informacaoResidencial->vale_gas : false,
'bolsa_escola' => $informacaoResidencial ? $informacaoResidencial->bolsa_escola : false,
'lazer' => $informacaoResidencial && $informacaoResidencial->lazer ? $informacaoResidencial->lazer->pluck('id') : [],
'bpc' => $informacaoResidencial ? $informacaoResidencial->bpc : false,
'renda_mensal' => $paciente->informacaoResidencial && $paciente->informacaoResidencial->renda_mensal
? number_format($paciente->informacaoResidencial->renda_mensal, 2, ',', '.')
: '0,00',
'ocupacao_id' => $paciente->informacaoResidencial->ocupacao_id ?? null,
'ocupacao' => $paciente && $paciente->informacaoResidencial && $paciente->informacaoResidencial->ocupacao ? [
'id' => $paciente->informacaoResidencial->ocupacao->id,
'codigo' => $paciente->informacaoResidencial->ocupacao->codigo,
'nome' => $paciente->informacaoResidencial->ocupacao->nome,
] : null,
'renda_total_familiar' => $paciente->informacaoResidencial && $paciente->informacaoResidencial->renda_total_familiar
? number_format($paciente->informacaoResidencial->renda_total_familiar, 2, ',', '.')
: '0,00',
'informacao_residencial_recusa_cadastro' => $paciente->informacaoResidencial->recusa_cadastro ?? false,
'possui_veiculo_proprio' => $paciente->informacaoResidencial->possui_veiculo_proprio ?? false,
'possui_financiamento' => $paciente->informacaoResidencial->possui_financiamento ?? false,
'possui_emprestimo' => $paciente->informacaoResidencial->possui_emprestimo ?? false,
'instituicao_nome' => $paciente->informacaoResidencial->instituicao_nome ?? null,
'instituicao_outros_profissionais' => $paciente->cidadao->domicilio->informacaoResidencial->instituicao_outros_profissionais ?? false,
'instituicao_nome_responsavel_tecnico' => $paciente->cidadao->domicilio->informacaoResidencial->instituicao_nome_responsavel_tecnico ?? null,
'instituicao_cns_responsavel_tecnico' => isset($paciente->cidadao) && isset($paciente->cidadao->domicilio) &&
isset($paciente->cidadao->domicilio->informacaoResidencial) &&
isset($paciente->cidadao->domicilio->informacaoResidencial->instituicao_cns_responsavel_tecnico)
? MaskUtil::getCnsMasked($paciente->cidadao->domicilio->informacaoResidencial->instituicao_cns_responsavel_tecnico)
: null,
'instituicao_cargo_responsavel_tecnico' => $paciente->cidadao->domicilio->informacaoResidencial->instituicao_cargo_responsavel_tecnico ?? null,
'instituicao_telefone_responsavel_tecnico' => isset($paciente->cidadao) && isset($paciente->cidadao->domicilio) &&
isset($paciente->cidadao->domicilio->informacaoResidencial) && isset($paciente->cidadao->domicilio->informacaoResidencial->instituicao_telefone_responsavel_tecnico)
? MaskUtil::getPhoneMasked($paciente->cidadao->domicilio->informacaoResidencial->instituicao_telefone_responsavel_tecnico)
: null,
'parentesco_id' => $paciente->parentesco_id ?? null,
'peso_id' => $paciente->condicaoSaude->peso_id ?? null,
'internacao' => $internacao,
'internacao_motivo' => $internacaoMotivo,
'internacao_data' => $internacaoData,
'doenca_cardiaca' => $paciente->condicaoSaude->doenca_cardiaca ?? null,
'doenca_cardiaca_quais' => $paciente && $paciente->condicaoSaude ? $paciente->condicaoSaude->doencaCardiaca->pluck('id') : [],
'problemas_rins' => $paciente->condicaoSaude->problemas_rins ?? null,
'problemas_rins_quais' => $paciente && $paciente->condicaoSaude ? $paciente->condicaoSaude->problemasRins->pluck('id') : [],
'doenca_respiratoria' => $paciente->condicaoSaude->doenca_respiratoria ?? null,
'doenca_respiratoria_quais' => $paciente && $paciente->condicaoSaude ? $paciente->condicaoSaude->doencaRespiratoria->pluck('id') : [],
'tratamento_saude_mental' => $paciente->condicaoSaude->tratamento_saude_mental ?? null,
'tratamento_saude_mental_internacao_data' => $paciente->condicaoSaude->tratamento_saude_mental_internacao_data ?? null,
'tratamento_saude_mental_alta_data' => $paciente->condicaoSaude->tratamento_saude_mental_alta_data ?? null,
'acamado' => $paciente->condicaoSaude->acamado ?? null,
'domiciliado' => $paciente->condicaoSaude->domiciliado ?? null,
'plantas_medicinais' => $paciente->condicaoSaude->plantas_medicinais ?? null,
'plantas_medicinais_quais' => $paciente->condicaoSaude->plantas_medicinais_quais ?? null,
'praticas_integrativas' => $paciente->condicaoSaude->praticas_integrativas ?? null,
'outras_condicoes_primaria' => $paciente->condicaoSaude->outras_condicoes_primaria ?? null,
'outras_condicoes_secundaria' => $paciente->condicaoSaude->outras_condicoes_secundaria ?? null,
'outras_condicoes_terciaria' => $paciente->condicaoSaude->outras_condicoes_terciaria ?? null,
'recusa_cadastro' => $paciente->recusa_cadastro ?? false,
'data_ultima_menstruacao' => $paciente->dum->data_ultima_menstruacao ?? null,
'idade_gestacional_semanas' => $paciente->dum->idade_gestacional_semanas ?? null,
'idade_gestacional_dias' => $paciente->dum->idade_gestacional_dias ?? null,
'data_possivel_parto' => $paciente->dum->data_possivel_parto ?? null,
'gravidez_planejada' => $paciente->dum->gravidez_planejada ?? null,
'gestacao_previa' => $paciente->dum->gestacao_previa ?? null,
'parto' => $paciente->dum->parto ?? null,
'responsavel' => $isResponsavel,
'responsavel_cidadao_id' => $responsavelCidadaoId,
'parentesco_responsavel_id' => $paciente->informacaoSocial->parentesco_responsavel_id ?? null,
'curso_id' => $paciente->informacaoSocial->curso_id ?? null,
'orientacao_sexual' => $paciente->informacaoSocial->orientacao_sexual ?? null,
'orientacao_sexual_id' => $paciente->informacaoSocial->orientacao_sexual_id ?? null,
'identidade_genero' => !is_null($paciente->cidadao->identidade_genero_id),
'deficiente' => $deficiente,
'frequenta_escola_creche' => $paciente->informacaoSocial->frequenta_escola_creche ?? null,
'situacao_mercado_trabalho_id' => $paciente->informacaoSocial->situacao_mercado_trabalho_id ?? null,
'frequenta_cuidador_tradicional' => $paciente->informacaoSocial->frequenta_cuidador_tradicional ?? null,
'participa_grupo_comunitario' => $paciente->informacaoSocial->participa_grupo_comunitario ?? null,
'plano_saude' => $paciente->informacaoSocial->plano_saude ?? null,
'comunidade_tradicional' => $paciente->informacaoSocial->comunidade_tradicional ?? null,
'comunidade_tradicional_qual' => $paciente->informacaoSocial && $paciente->informacaoSocial->comunidadeTradicionalQual
? [ 'id' => $paciente->informacaoSocial->comunidadeTradicionalQual->id,
'codigo_esus' => $paciente->informacaoSocial->comunidadeTradicionalQual->codigo_esus,
'descricao' => $paciente->informacaoSocial->comunidadeTradicionalQual->descricao, ]
: null,
'saida_cidadao_id' => $paciente->informacaoSocial->saida_cidadao_id ?? null,
'motivo_saida_data' => $paciente->informacaoSocial->motivo_saida_data ?? null,
'informacao_social_recusa_cadastro' => $paciente->informacaoSocial->recusa_cadastro ?? null,
'alimentos_acabaram' => $paciente->informacaoSocial->alimentos_acabaram ?? null,
'comeu_alguns_alimentos' => $paciente->informacaoSocial->comeu_alguns_alimentos ?? null,
'data_atualizacao_tria' => optional($paciente->informacaoSocial)->data_atualizacao_tria ? optional($paciente->informacaoSocial)->data_atualizacao_tria : optional($cadastroIndividual)->created_at,
'veiculos' => $paciente->informacaoResidencial->veiculo ?? [],
'financiamentos' => $paciente->informacaoResidencial && $paciente->informacaoResidencial->financiamento
? $paciente->informacaoResidencial->financiamento->map(fn($financiamento) => [
'id' => $financiamento->id ?? null,
'tipo' => $financiamento->tipo ?? null,
'valor_parcela' => $financiamento->valor_parcela ? number_format($financiamento->valor_parcela, 2, ',', '.') : null,
'quantidade_parcela' => $financiamento->quantidade_parcela ?? null,
])
: [],
'emprestimos' => $paciente->informacaoResidencial && $paciente->informacaoResidencial->emprestimo
? $paciente->informacaoResidencial->emprestimo->map(fn($emprestimo) => [
'id' => $emprestimo->id ?? null,
'tipo' => $emprestimo->tipo ?? null,
'valor_parcela' => $emprestimo->valor_parcela ? number_format($emprestimo->valor_parcela, 2, ',', '.') : null,
'quantidade_parcela' => $emprestimo->quantidade_parcela ?? null,
])
: [],
],
],
Response::HTTP_OK
);
}
public function getPrintFormModelData($id)
{
$paciente = Paciente::findOrFail($id);
$cadastroDomiciliar = CadastroDomiciliar::where('domicilio_id', $paciente->cidadao->domicilio_id)->first();
$cadastroIndividual = CadastroIndividual::where('paciente_id', $paciente->id)->first();
$unidadesReferencia = Unidade::where('unidade_referencia', true)
->where('id', $paciente->unidade_id)
->orderBy('nome_fantasia')
->get();
return [
'form' => [
'prontuario' => $paciente->prontuario,
'unidades_referencia' => $unidadesReferencia->map(fn ($unidades) => [
'id' => $unidades->id,
'nome_fantasia' => $unidades->cnes ? $unidades->cnes . ' - ' . $unidades->nome_fantasia : $unidades->nome_fantasia
]),
'impressoes' => [
['value' => 'cadastroIndividual', 'text' => 'Cadastro individual', 'disabled' => $cadastroIndividual ? false: true],
['value' => 'cadastroDomiciliar', 'text' => 'Cadastro domiciliar', 'disabled' => $cadastroDomiciliar ? false : true],
['value' => 'termoRecusaCadastro', 'text' => 'Termo de recusa do cadastro', 'disabled' => false],
['value' => 'etiquetaConectasus', 'text' => 'Etiqueta do prontuário', 'disabled' => false],
['value' => 'residentes', 'text' => 'Residentes', 'disabled' => false],
['value' => 'folhaRosto', 'text' => 'Folha de rosto', 'disabled' => false],
['value' => 'cartaoNacionalSaude', 'text' => 'Cartão nacional de saúde', 'disabled' => false],
],
],
'model' => [
'id' => $paciente->id,
'domicilio_id' => $paciente ? $paciente->cidadao->domicilio_id : null,
'cadastro_domiciliar_id' => $cadastroDomiciliar ? $cadastroDomiciliar->id : null,
'cidadao' => $paciente->cidadao,
'impressoes' => [],
],
];
}
private static function houveMudancaInformacaoSocioeconomica($alimentosAtual, $comeuAtual, $alimentosNovo, $comeuNovo)
{
return $alimentosAtual !== $alimentosNovo || $comeuAtual !== $comeuNovo;
}
}