2509 lines
127 KiB
PHP
2509 lines
127 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Imunizacao;
|
|
|
|
use App\Enums\Almoxarifado\EntradaTipo;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\LocalAtendimento as AtendimentoIndividualLocalAtendimento;
|
|
use App\Enums\Imunizacao\LocalAplicacao as ImunizacaoLocalAplicacao;
|
|
use App\Enums\Imunizacao\SaidaTipo;
|
|
use App\Enums\Imunizacao\ViaAdministracao as ImunizacaoViaAdministracao;
|
|
use App\Exceptions\AtencaoBasica\FichaVacinacao\CnsException;
|
|
use App\Models\AtencaoBasica\FichaVacinacao\FichaVacinacao;
|
|
use App\Models\AtencaoBasica\FichaVacinacao\PacienteItem;
|
|
use App\Models\AtencaoBasica\FichaVacinacao\VacinacaoPaciente;
|
|
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
|
|
use App\Models\Cadastro\Parametrizacao\Parametrizacao;
|
|
use App\Models\Cadastro\SujeitoAtencao\CidadaoTelefone;
|
|
use App\Models\Cadastro\SujeitoAtencao\Paciente;
|
|
use App\Models\Cadastro\Vacina;
|
|
use App\Models\Geral\Turno;
|
|
use App\Models\Imunizacao\Entrada;
|
|
use App\Models\Imunizacao\ParametrizacaoOcupacao;
|
|
use App\Models\Imunizacao\RegistroAplicacao;
|
|
use App\Models\Imunizacao\RegistroAprazamento;
|
|
use App\Models\Imunizacao\RegistroAtualizacao;
|
|
use App\Models\Imunizacao\Saida;
|
|
use App\Models\Imunizacao\SaidaVacina;
|
|
use App\Models\Imunizacao\SalaVacinacao;
|
|
use App\Models\Integracao\Ria\DocumentoImunologicoRotina;
|
|
use App\Models\Integracao\Ria\DocumentoImunologicoRotinaResposta;
|
|
use App\Models\PainelSenha\Fila;
|
|
use App\Services\Integracao\CnsService;
|
|
use App\Services\Service;
|
|
use App\Services\Sigtap\CidService;
|
|
use App\Utils\DataUtil;
|
|
use App\Utils\MaskUtil;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Validator;
|
|
|
|
class RegistroVacinacaoService extends Service
|
|
{
|
|
public static function index()
|
|
{
|
|
return [
|
|
'additionals' => self::getAdditionalsData(),
|
|
];
|
|
}
|
|
|
|
public static function create()
|
|
{
|
|
if (isset(request()->fila_id)) {
|
|
$fila = Fila::findOrFail(request()->fila_id);
|
|
|
|
FilaAtendimentoService::answer($fila->id);
|
|
}
|
|
|
|
return [
|
|
'additionals' => self::getAdditionalsData(),
|
|
'form' => self::getFormData(),
|
|
'model' => self::getModelData(),
|
|
];
|
|
}
|
|
|
|
public static function store($request)
|
|
{
|
|
self::validate($request->all());
|
|
|
|
DB::transaction(function() use ($request) {
|
|
self::updatePaciente();
|
|
self::storeRegistrosAplicacao($request['paciente_id'], collect($request['aplicacoes']));
|
|
self::storeRegistrosAtualizacao($request['paciente_id'], collect($request['atualizacoes']));
|
|
self::storeRegistrosAprazamento($request['paciente_id'], collect($request['aprazamentos']));
|
|
|
|
if (isset($request->fila_id)) {
|
|
FilaAtendimentoService::finalize($request->fila_id);
|
|
}
|
|
});
|
|
}
|
|
|
|
private static function updatePaciente()
|
|
{
|
|
$paciente = Paciente::find(request()->paciente_id);
|
|
|
|
$paciente->cidadao->cns = request()->cidadao_cns;
|
|
$paciente->cidadao->cpf = request()->cidadao_cpf;
|
|
$paciente->cidadao->save();
|
|
|
|
$telefone = CidadaoTelefone::where('cidadao_id', $paciente->cidadao_id)->where('principal', true)->first();
|
|
|
|
if(!$telefone) {
|
|
CidadaoTelefone::create([
|
|
'cidadao_id' => $paciente->cidadao_id,
|
|
'numero' => request()->cidadao_telefone,
|
|
'principal' => true,
|
|
'autoriza_sms' => false
|
|
]);
|
|
} else {
|
|
$telefone->numero = request()->cidadao_telefone;
|
|
$telefone->save();
|
|
}
|
|
}
|
|
|
|
public static function show($id)
|
|
{
|
|
return DB::table('cadastro_paciente')
|
|
->select([
|
|
'cadastro_paciente.id AS paciente_id',
|
|
'cadastro_cidadao.nome',
|
|
'cadastro_cidadao.cns',
|
|
'cadastro_sexo.descricao AS sexo_descricao',
|
|
'cadastro_cidadao.data_nascimento AS cidadao_data_nascimento',
|
|
'cadastro_cidadao.nome_mae',
|
|
'cadastro_logradouro.nome AS logradouro_nome',
|
|
'cadastro_endereco.numero AS endereco_numero',
|
|
'cadastro_endereco.complemento AS endereco_complemento',
|
|
'cadastro_endereco.referencia AS endereco_referencia',
|
|
'cadastro_bairro.nome AS bairro_nome',
|
|
'cadastro_municipio.nome AS municipio_nome',
|
|
'cadastro_estado.nome AS estado_nome',
|
|
'cadastro_paciente.prontuario AS paciente_prontuario',
|
|
'cadastro_paciente.bloqueado',
|
|
'cadastro_paciente.classificacao_id',
|
|
'cadastro_paciente.subclassificacao_id',
|
|
])
|
|
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
|
|
->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id')
|
|
->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('cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_id')
|
|
->leftJoin('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id')
|
|
->leftJoin('intranet.cadastro_estado', 'cadastro_estado.id', 'cadastro_municipio.estado_id')
|
|
->whereNull('cadastro_paciente.deleted_at')
|
|
->where('cadastro_cidadao.id', $id)
|
|
->first();
|
|
}
|
|
|
|
public static function list()
|
|
{
|
|
switch (request()->get('listar')) {
|
|
case 'unidades':
|
|
return self::getUnidades();
|
|
break;
|
|
|
|
case 'salas_vacinacao':
|
|
return self::getSalasVacinacao(request()->get('unidade_id'));
|
|
break;
|
|
|
|
case 'usuario':
|
|
return self::getUsuario();
|
|
break;
|
|
|
|
case 'lotes':
|
|
return self::getLotes(request()->get('sala_vacinacao_id'), request()->get('vacina_id'), request()->get('lote'), request()->get('data_validade_lote'));
|
|
break;
|
|
|
|
case 'produtores':
|
|
return self::getProdutores(request()->get('sala_vacinacao_id'), request()->get('vacina_id'), request()->get('lote'), request()->get('data_validade_lote'));
|
|
break;
|
|
|
|
case 'estrategias':
|
|
return self::getEstrategias(request()->get('paciente_id'), request()->get('data_registro'), request()->get('vacina_id'));
|
|
break;
|
|
|
|
case 'doses':
|
|
return self::getDoses(request()->get('paciente_id'), request()->get('data_registro'), request()->get('vacina_id'), request()->get('estrategia_id'), request()->get('dose_id'));
|
|
break;
|
|
|
|
case 'doses-aprazamento':
|
|
return self::getDosesAprazamento(request()->get('paciente_id'), request()->get('data_registro'), request()->get('vacina_id'));
|
|
break;
|
|
|
|
case 'proxima_dose':
|
|
return self::getProximaDose(request()->get('paciente_id'), request()->get('data_registro'), request()->get('vacina_id'), request()->get('estrategia_id'), request()->get('dose_id'));
|
|
break;
|
|
|
|
case 'proximo_aprazamento':
|
|
return self::getProximoAprazamento(request()->get('paciente_id'), request()->get('data_registro'), request()->get('vacina_id'), request()->get('estrategia_id'), request()->get('dose_id'));
|
|
break;
|
|
|
|
case 'locais-aplicacao':
|
|
return self::getLocaisAplicacao(request()->get('via_administracao_id'));
|
|
break;
|
|
|
|
case 'sugestao-via-administracao-local-aplicacao':
|
|
return self::getSugestacaoViaAdministracaoLocalAplicacao(request()->get('paciente_id'), request()->get('data_registro'), request()->get('vacina_id'), request()->get('estrategia_id'), request()->get('dose_id'));
|
|
break;
|
|
|
|
default:
|
|
return [];
|
|
break;
|
|
}
|
|
}
|
|
|
|
public static function validate($request)
|
|
{
|
|
$rules = [];
|
|
|
|
foreach ($request['aplicacoes'] as $key => $value) {
|
|
if (!isset($value['id'])) {
|
|
$rules["aplicacoes.$key.sala_vacinacao_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
|
|
];
|
|
$rules["aplicacoes.$key.aplicador_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Cadastro\SujeitoAtencao\Usuario,id',
|
|
];
|
|
$rules["aplicacoes.$key.ocupacao_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Sigtap\Ocupacao,id',
|
|
];
|
|
$rules["aplicacoes.$key.vacina_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Cadastro\Vacina,id',
|
|
];
|
|
$rules["aplicacoes.$key.grupo_atendimento_id"] = [
|
|
'nullable',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\GrupoAtendimento,id',
|
|
];
|
|
$rules["aplicacoes.$key.dose_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\Dose,id',
|
|
];
|
|
$rules["aplicacoes.$key.estrategia_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\Estrategia,id',
|
|
];
|
|
$rules["aplicacoes.$key.via_administracao_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\ViaAdministracao,id',
|
|
];
|
|
$rules["aplicacoes.$key.local_aplicacao_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\LocalAplicacao,id',
|
|
];
|
|
$rules["aplicacoes.$key.cid_id"] = [
|
|
'nullable',
|
|
'integer',
|
|
];
|
|
$rules["aplicacoes.$key.data_registro"] = [
|
|
'required',
|
|
'date_format:Y-m-d',
|
|
'before_or_equal:now',
|
|
];
|
|
$rules["aplicacoes.$key.lote"] = [
|
|
'required',
|
|
'string',
|
|
];
|
|
$rules["aplicacoes.$key.data_validade_lote"] = [
|
|
'required',
|
|
'date',
|
|
];
|
|
$rules["aplicacoes.$key.comunicante_hanseniase"] = [
|
|
'required',
|
|
'boolean',
|
|
];
|
|
$rules["aplicacoes.$key.gestante"] = [
|
|
'required',
|
|
'boolean',
|
|
];
|
|
$rules["aplicacoes.$key.puerpera"] = [
|
|
'required',
|
|
'boolean',
|
|
];
|
|
$rules["aplicacoes.$key.imunizacao_advertida"] = [
|
|
'required',
|
|
'boolean',
|
|
];
|
|
$rules["aplicacoes.$key.viajante"] = [
|
|
'required',
|
|
'boolean',
|
|
];
|
|
$rules["aplicacoes.$key.observacao"] = [
|
|
'nullable',
|
|
'string',
|
|
'between:1,5000',
|
|
];
|
|
}
|
|
}
|
|
|
|
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
|
|
|
|
foreach ($request['atualizacoes'] as $key => $value) {
|
|
if (!isset($value['id'])) {
|
|
$rules["atualizacoes.$key.sala_vacinacao_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
|
|
];
|
|
$rules["atualizacoes.$key.aplicador_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Cadastro\SujeitoAtencao\Usuario,id',
|
|
];
|
|
$rules["atualizacoes.$key.ocupacao_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Sigtap\Ocupacao,id',
|
|
];
|
|
$rules["atualizacoes.$key.vacina_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Cadastro\Vacina,id',
|
|
];
|
|
if($salaVacinacaoLogada->cria_ficha_ab) {
|
|
$rules["atualizacoes.$key.grupo_atendimento_id"] = [
|
|
'nullable',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\GrupoAtendimento,id',
|
|
];
|
|
} else {
|
|
$rules["atualizacoes.$key.grupo_atendimento_id"] = [
|
|
'nullable',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\GrupoAtendimento,id',
|
|
];
|
|
}
|
|
$rules["atualizacoes.$key.dose_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\Dose,id',
|
|
];
|
|
$rules["atualizacoes.$key.estrategia_id"] = [
|
|
'nullable',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\Estrategia,id',
|
|
];
|
|
$rules["atualizacoes.$key.data_registro"] = [
|
|
'required',
|
|
'date_format:Y-m-d',
|
|
'before_or_equal:now',
|
|
];
|
|
|
|
$rules["atualizacoes.$key.observacao"] = [
|
|
'nullable',
|
|
'string',
|
|
'between:1,5000',
|
|
];
|
|
}
|
|
}
|
|
|
|
foreach ($request['aprazamentos'] as $key => $value) {
|
|
if (!isset($value['id'])) {
|
|
$rules["aprazamentos.$key.vacina_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Cadastro\Vacina,id',
|
|
];
|
|
$rules["aprazamentos.$key.dose_id"] = [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Imunizacao\Dose,id',
|
|
];
|
|
$rules["aprazamentos.$key.data_aprazamento"] = [
|
|
'required',
|
|
'date_format:d/m/Y',
|
|
'after_or_equal:today',
|
|
];
|
|
$rules["aprazamentos.$key.observacao"] = [
|
|
'nullable',
|
|
'string',
|
|
'between:1,5000',
|
|
];
|
|
}
|
|
}
|
|
|
|
$rules = array_merge([
|
|
'paciente_id' => [
|
|
'required',
|
|
'integer',
|
|
'exists:\App\Models\Cadastro\SujeitoAtencao\Paciente,id',
|
|
],
|
|
'aplicacoes' => [
|
|
'nullable',
|
|
'array',
|
|
],
|
|
'atualizacoes' => [
|
|
'nullable',
|
|
'array',
|
|
],
|
|
'aprazamentos' => [
|
|
'nullable',
|
|
'array',
|
|
],
|
|
], $rules);
|
|
|
|
return Validator::make($request, $rules)->validate();
|
|
}
|
|
|
|
private static function getAdditionalsData()
|
|
{
|
|
$cid = CidService::getCid('Z251');
|
|
|
|
return [
|
|
'data_atual' => Carbon::now()->format('Y-m-d'),
|
|
'parametrizacao' => self::getParametrizacao(),
|
|
'sala_vacinacao_logada' => self::getSalaVacinacaoLogada(),
|
|
'permissoes_atualizacao_cadastro_paciente' => self::getPermissoesAtualizacaoCadastroPaciente(),
|
|
'cid' => $cid,
|
|
];
|
|
}
|
|
|
|
private static function getFormData()
|
|
{
|
|
return [
|
|
'unidades' => [],
|
|
'salas_vacinacao' => [],
|
|
'lotes' => [],
|
|
'doses' => [],
|
|
'produtores' => [],
|
|
'grupos_atendimento' => self::getGruposAtendimento(),
|
|
'estrategias' => [],
|
|
'turnos' => Turno::all(),
|
|
'locais' => LocalAtendimento::whereIn('id', [
|
|
AtendimentoIndividualLocalAtendimento::UBS,
|
|
AtendimentoIndividualLocalAtendimento::UNIDADE_MOVEL,
|
|
AtendimentoIndividualLocalAtendimento::RUA,
|
|
AtendimentoIndividualLocalAtendimento::DOMICILIO,
|
|
AtendimentoIndividualLocalAtendimento::ESCOLA_CRECHE,
|
|
AtendimentoIndividualLocalAtendimento::OUTROS,
|
|
AtendimentoIndividualLocalAtendimento::POLO,
|
|
AtendimentoIndividualLocalAtendimento::INSTITUICAO,
|
|
AtendimentoIndividualLocalAtendimento::UNIDADE_PRISIONAL_CONGENERES,
|
|
AtendimentoIndividualLocalAtendimento::UNIDADE_SOCIOEDUCATIVA
|
|
])->orderBy('descricao')->get(),
|
|
'vias_administracao' => self::getViasAdministracao(),
|
|
'locais_aplicacao' => [],
|
|
'ocupacoes' => [],
|
|
'equipes' => [],
|
|
];
|
|
}
|
|
|
|
public static function getViasAdministracao()
|
|
{
|
|
return DB::table('imunizacao_via_administracao')
|
|
->select(
|
|
'id',
|
|
DB::raw("IF(imunizacao_via_administracao.id = " . ImunizacaoViaAdministracao::SEM_REGISTRO_NO_SISTEMA_DE_INFORMACAO_DE_ORIGEM . ",
|
|
'Não aplicável',
|
|
imunizacao_via_administracao.nome
|
|
) AS nome")
|
|
)
|
|
->orderByRaw("IF(imunizacao_via_administracao.id = " . ImunizacaoViaAdministracao::SEM_REGISTRO_NO_SISTEMA_DE_INFORMACAO_DE_ORIGEM . ",
|
|
'Não aplicável',
|
|
imunizacao_via_administracao.nome
|
|
)")
|
|
->get();
|
|
}
|
|
|
|
public static function getLocaisAplicacao($viaAdministracaoId)
|
|
{
|
|
$hasLocais = DB::table('imunizacao_via_administracao_local_aplicacao')
|
|
->where('via_administracao_id', $viaAdministracaoId)
|
|
->exists();
|
|
|
|
return DB::table('imunizacao_local_aplicacao')
|
|
->select(
|
|
'id',
|
|
DB::raw("IF(imunizacao_local_aplicacao.id = " . ImunizacaoLocalAplicacao::SEM_REGISTRO_NO_SISTEMA_DE_INFORMACAO_DE_ORIGEM . ",
|
|
'Não aplicável',
|
|
imunizacao_local_aplicacao.nome
|
|
) AS nome")
|
|
)
|
|
->when($hasLocais, fn ($q) => $q->where(fn ($q) => $q
|
|
->where('imunizacao_local_aplicacao.id', ImunizacaoLocalAplicacao::SEM_REGISTRO_NO_SISTEMA_DE_INFORMACAO_DE_ORIGEM)
|
|
->orWhereExists(fn ($q) => $q
|
|
->selectRaw(1)
|
|
->from('imunizacao_via_administracao_local_aplicacao')
|
|
->whereColumn('imunizacao_via_administracao_local_aplicacao.local_aplicacao_id', 'imunizacao_local_aplicacao.id')
|
|
->where('imunizacao_via_administracao_local_aplicacao.via_administracao_id', $viaAdministracaoId)
|
|
)
|
|
))
|
|
->orderByRaw("IF(imunizacao_local_aplicacao.id = " . ImunizacaoLocalAplicacao::SEM_REGISTRO_NO_SISTEMA_DE_INFORMACAO_DE_ORIGEM . ",
|
|
'Não aplicável',
|
|
imunizacao_local_aplicacao.nome
|
|
)")
|
|
->get();
|
|
}
|
|
|
|
private static function getModelData()
|
|
{
|
|
return array_merge(
|
|
self::getPaciente(request()->get('paciente_id')),
|
|
[
|
|
'registros' => array_merge(
|
|
self::getRegistrosAplicacao(request()->get('paciente_id'))->toArray(),
|
|
self::getRegistrosAtualizacao(request()->get('paciente_id'))->toArray(),
|
|
),
|
|
'aprazamentos' => self::getRegistrosAprazamento(request()->get('paciente_id')),
|
|
],
|
|
);
|
|
}
|
|
|
|
public static function getSalaVacinacaoLogada()
|
|
{
|
|
return DB::table('imunizacao_sala_vacinacao')
|
|
->select([
|
|
'imunizacao_sala_vacinacao.id',
|
|
'cadastro_infraestrutura.unidade_id',
|
|
'imunizacao_sala_vacinacao.responsavel',
|
|
'imunizacao_sala_vacinacao.permite_aplicacao',
|
|
'imunizacao_sala_vacinacao.cria_ficha_ab'
|
|
])
|
|
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
|
|
->where('imunizacao_sala_vacinacao.ativo', true)
|
|
->where('cadastro_infraestrutura.id', auth()->payload()->get('infraestrutura_id'))
|
|
->first();
|
|
}
|
|
|
|
public static function getParametrizacao()
|
|
{
|
|
return DB::table('imunizacao_parametrizacao')
|
|
->select([
|
|
'parametrizacao_descricao_vacina_id',
|
|
'perfil_campanha',
|
|
'usa_ultimo_frasco',
|
|
'cns_cpf_obrigatorio',
|
|
'aprazamento_dias_antes',
|
|
'aprazamento_dias_depois',
|
|
'aprazamento_ativo',
|
|
'aplicacao_data_retroativa',
|
|
'cadastro_outro_municipio',
|
|
'cadastro_provisorio',
|
|
'cadastro_bloqueado',
|
|
'cadastro_desatualizado'
|
|
])
|
|
->first();
|
|
}
|
|
|
|
public static function getPaciente($id)
|
|
{
|
|
|
|
$parametrizacao = Parametrizacao::first();
|
|
$quantidadeDias = $parametrizacao->cadastro_paciente_desatualizado_quantidade_dias ?? 0;
|
|
|
|
$paciente = DB::table('cadastro_paciente')
|
|
->select([
|
|
'cadastro_cidadao.id as cidadao_id',
|
|
'cadastro_paciente.id AS paciente_id',
|
|
'cadastro_cidadao.nome AS cidadao_nome',
|
|
'cadastro_cidadao.nome_social AS cidadao_nome_social',
|
|
'cadastro_cidadao.cns AS cidadao_cns',
|
|
'cadastro_cidadao.cpf AS cidadao_cpf',
|
|
'cadastro_sexo.id AS sexo_id',
|
|
'cadastro_sexo.descricao AS sexo_descricao',
|
|
'cadastro_cidadao.data_nascimento AS cidadao_data_nascimento',
|
|
'cadastro_cidadao.nome_mae AS cidadao_nome_mae',
|
|
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
'cadastro_logradouro.nome AS logradouro_nome',
|
|
'cadastro_endereco.numero AS endereco_numero',
|
|
'cadastro_endereco.complemento AS endereco_complemento',
|
|
'cadastro_endereco.referencia AS endereco_referencia',
|
|
'cadastro_bairro.nome AS bairro_nome',
|
|
'cadastro_municipio.nome AS municipio_nome',
|
|
'cadastro_estado.nome AS estado_nome',
|
|
'cadastro_paciente.prontuario AS paciente_prontuario',
|
|
'cadastro_nacionalidade.descricao as nacionalidade_descricao',
|
|
'cadastro_obito.obito_em as obito',
|
|
'cadastro_paciente.classificacao_id',
|
|
'cadastro_paciente.subclassificacao_id',
|
|
'cadastro_paciente.bloqueado',
|
|
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
|
|
')
|
|
])
|
|
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
|
|
->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id')
|
|
->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_paciente.unidade_id')
|
|
->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('cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_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_nacionalidade', 'cadastro_nacionalidade.id', 'cadastro_cidadao.nacionalidade_id')
|
|
->leftJoin('cadastro_obito', function ($join) {
|
|
|
|
$join->on('cadastro_obito.cidadao_id', '=', 'cadastro_cidadao.id')
|
|
->whereNull('cadastro_obito.deleted_at');
|
|
})
|
|
->whereNull('cadastro_paciente.deleted_at')
|
|
->where('cadastro_paciente.id', $id)
|
|
->first();
|
|
|
|
$telefone = CidadaoTelefone::where('cidadao_id', $paciente->cidadao_id)->where('principal', true)->first();
|
|
|
|
return [
|
|
'cidadao_id' => $paciente->cidadao_id,
|
|
'cidadao_nome' => $paciente->cidadao_nome,
|
|
'cidadao_nome_social' => $paciente->cidadao_nome_social,
|
|
'cidadao_cns' => $paciente->cidadao_cns ? MaskUtil::getCnsMasked($paciente->cidadao_cns) : null,
|
|
'cidadao_cpf' => $paciente->cidadao_cpf ? MaskUtil::getCpfMasked($paciente->cidadao_cpf) : null,
|
|
'sexo_id' => $paciente->sexo_id,
|
|
'sexo_descricao' => $paciente->sexo_descricao,
|
|
'cidadao_data_nascimento' => $paciente->cidadao_data_nascimento,
|
|
'cidadao_idade' => Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%ya, %mm e %dd'),
|
|
'cidadao_idade_anos' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%y'),
|
|
'cidadao_idade_meses' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%m'),
|
|
'cidadao_idade_dias' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%d'),
|
|
'cidadao_nome_mae' => $paciente->cidadao_nome_mae,
|
|
'unidade_nome_fantasia' => $paciente->unidade_nome_fantasia,
|
|
'logradouro_nome' => $paciente->logradouro_nome,
|
|
'endereco_numero' => $paciente->endereco_numero,
|
|
'endereco_complemento' => $paciente->endereco_complemento,
|
|
'endereco_referencia' => $paciente->endereco_referencia,
|
|
'bairro_nome' => $paciente->bairro_nome,
|
|
'municipio_nome' => $paciente->municipio_nome,
|
|
'estado_nome' => $paciente->estado_nome,
|
|
'paciente_prontuario' => $paciente->paciente_prontuario,
|
|
'nacionalidade_descricao' => $paciente->nacionalidade_descricao,
|
|
'cidadao_telefone' => $telefone ? MaskUtil::getPhoneMasked($telefone->numero) : null,
|
|
'classificacao_id' => $paciente->classificacao_id,
|
|
'subclassificacao_id' => $paciente->subclassificacao_id,
|
|
'bloqueado' => $paciente->bloqueado,
|
|
'obito' => $paciente->obito,
|
|
'cadastro_desatualizado' => $paciente->dias_cadastro_desatualizado > 0 ? true : false,
|
|
];
|
|
}
|
|
|
|
public static function getRegistrosAplicacao($pacienteId)
|
|
{
|
|
$paciente = Paciente::findOrFail($pacienteId);
|
|
|
|
return DB::table('imunizacao_registro_aplicacao')
|
|
->select([
|
|
'imunizacao_registro_aplicacao.id AS id',
|
|
'cadastro_unidade.id AS unidade_id',
|
|
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
'cadastro_unidade.cnes as unidade_cnes',
|
|
'imunizacao_sala_vacinacao.id AS sala_vacinacao_id',
|
|
DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS sala_vacinacao_nome"),
|
|
'cadastro_usuario.id AS aplicador_id',
|
|
'cadastro_cidadao.nome AS aplicador_nome',
|
|
'cadastro_cidadao.cns AS aplicador_cns',
|
|
DB::raw('DATE_FORMAT(imunizacao_registro_aplicacao.created_at, "%d/%m/%Y") AS data_cadastro'),
|
|
'imunizacao_registro_aplicacao.data_aplicacao as data_aplicacao',
|
|
'cadastro_vacina.id AS vacina_id',
|
|
'cadastro_vacina.nome AS vacina_nome',
|
|
'cadastro_vacina.abreviacao AS vacina_abreviacao',
|
|
'cadastro_vacina.sigla AS vacina_sigla',
|
|
'imunizacao_entrada_vacina.id as lote_id',
|
|
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.nome) AS vacina_sigla_nome"),
|
|
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.abreviacao) AS vacina_sigla_abreviacao"),
|
|
DB::raw("CONCAT(cadastro_vacina.abreviacao, ' - ', cadastro_vacina.nome) AS vacina_abreviacao_nome"),
|
|
DB::raw("CONCAT(
|
|
cadastro_vacina.sigla, ' - ',
|
|
cadastro_vacina.abreviacao, ' - ',
|
|
cadastro_vacina.nome) AS vacina_sigla_abreviacao_nome"
|
|
),
|
|
'imunizacao_entrada_vacina.lote',
|
|
'imunizacao_entrada_vacina.data_validade_lote',
|
|
'imunizacao_produtor.id as produtor_id',
|
|
'imunizacao_produtor.nome as produtor_nome',
|
|
'imunizacao_produtor.id AS produtor_id',
|
|
'imunizacao_produtor.nome AS produtor_nome',
|
|
'imunizacao_grupo_atendimento.id AS grupo_atendimento_id',
|
|
'imunizacao_grupo_atendimento.nome AS grupo_atendimento_nome',
|
|
'imunizacao_dose.id AS dose_id',
|
|
'imunizacao_dose.nome AS dose_nome',
|
|
'imunizacao_estrategia.id AS estrategia_id',
|
|
'imunizacao_estrategia.nome AS estrategia_nome',
|
|
'imunizacao_via_administracao.id AS via_administracao_id',
|
|
DB::raw("IF(imunizacao_via_administracao.id = " . ImunizacaoViaAdministracao::SEM_REGISTRO_NO_SISTEMA_DE_INFORMACAO_DE_ORIGEM . ",
|
|
'Não aplicável',
|
|
imunizacao_via_administracao.nome
|
|
) AS via_administracao_nome"),
|
|
'imunizacao_local_aplicacao.id AS local_aplicacao_id',
|
|
DB::raw("IF(imunizacao_local_aplicacao.id = " . ImunizacaoLocalAplicacao::SEM_REGISTRO_NO_SISTEMA_DE_INFORMACAO_DE_ORIGEM . ",
|
|
'Não aplicável',
|
|
imunizacao_local_aplicacao.nome
|
|
) AS local_aplicacao_nome"),
|
|
'cid.id AS cid_id',
|
|
'cid.codigo AS cid_codigo',
|
|
'cid.nome AS cid_nome',
|
|
'imunizacao_registro_aplicacao.comunicante_hanseniase',
|
|
'imunizacao_registro_aplicacao.gestante',
|
|
'imunizacao_registro_aplicacao.puerpera',
|
|
'imunizacao_registro_aplicacao.imunizacao_advertida',
|
|
'imunizacao_registro_aplicacao.viajante',
|
|
'imunizacao_registro_aplicacao.ultimo_frasco',
|
|
'imunizacao_registro_aplicacao.observacao',
|
|
'sigtap.ocupacao.id as ocupacao_id',
|
|
'sigtap.ocupacao.nome as ocupacao_nome',
|
|
'atencao_basica_ficha_vacinacao.equipe_id',
|
|
DB::raw("
|
|
CONCAT(
|
|
CASE
|
|
WHEN atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', atencao_basica_parametrizacao_area.numero_ine)
|
|
ELSE ''
|
|
END,
|
|
CASE
|
|
WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL AND atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN ' - Área: '
|
|
WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL THEN 'Área: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(atencao_basica_parametrizacao_area.descricao, ''),
|
|
CASE
|
|
WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL AND (atencao_basica_parametrizacao_area.numero_ine IS NOT NULL OR atencao_basica_parametrizacao_area.descricao IS NOT NULL) THEN ' - Microárea: '
|
|
WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL THEN 'Microárea: '
|
|
ELSE ''
|
|
END,
|
|
COALESCE(atencao_basica_parametrizacao_microarea.descricao, '')
|
|
) AS equipe_nome
|
|
"),
|
|
'atencao_basica_vacinacao_paciente.turno_id',
|
|
'geral_turno.nome as turno_nome',
|
|
'atencao_basica_vacinacao_paciente.local_atendimento_id',
|
|
'atencao_basica_local_atendimento.descricao as local_atendimento_nome',
|
|
DB::raw("'aplicacao' AS registro_tipo"),
|
|
DB::raw("IF(atencao_basica_ficha_vacinacao.uuid_ficha IS NOT NULL, TRUE, FALSE) as exportado"),
|
|
DB::raw("IF(integracao_ria_documento_imunologico_rotina.id IS NULL,
|
|
'pendente',
|
|
IF(EXISTS (
|
|
SELECT 1
|
|
FROM integracao_ria_documento_imunologico_rotina_resposta
|
|
WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id
|
|
), 'rejeitado', 'enviado')
|
|
) as status_ria"),
|
|
DB::raw("DATE_FORMAT(integracao_ria_documento_imunologico_rotina.data_hora_envio, '%d/%m/%Y %H:%i:%s') as ria_data_hora_envio"),
|
|
'integracao_ria_documento_imunologico_rotina.identificador_rnds as ria_identificador_rnds',
|
|
DB::raw('COALESCE(integracao_ria_documento_imunologico_rotina.usuario_atualizou, 0) as ria_usuario_atualizou'),
|
|
DB::raw('COALESCE(integracao_ria_documento_imunologico_rotina.atualizado, 0) as ria_atualizado'),
|
|
])
|
|
->leftJoin('cadastro_usuario', 'cadastro_usuario.id', 'imunizacao_registro_aplicacao.aplicador_id')
|
|
->leftJoin('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
|
->leftJoin('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id')
|
|
->leftJoin('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
|
|
->leftJoin('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
|
|
->leftJoin('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
|
|
->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
|
->leftJoin('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_entrada_vacina.vacina_id')
|
|
->leftJoin('imunizacao_produtor', 'imunizacao_produtor.id', 'imunizacao_entrada_vacina.produtor_id')
|
|
->leftJoin('imunizacao_grupo_atendimento', 'imunizacao_grupo_atendimento.id', 'imunizacao_registro_aplicacao.grupo_atendimento_id')
|
|
->leftJoin('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_aplicacao.dose_id')
|
|
->leftJoin('imunizacao_estrategia', 'imunizacao_estrategia.id', 'imunizacao_registro_aplicacao.estrategia_id')
|
|
->leftJoin('imunizacao_via_administracao', 'imunizacao_via_administracao.id', 'imunizacao_registro_aplicacao.via_administracao_id')
|
|
->leftJoin('imunizacao_local_aplicacao', 'imunizacao_local_aplicacao.id', 'imunizacao_registro_aplicacao.local_aplicacao_id')
|
|
->leftJoin('sigtap.cid', 'cid.id', 'imunizacao_registro_aplicacao.cid_id')
|
|
->leftJoin('atencao_basica_vacinacao_paciente_item', 'atencao_basica_vacinacao_paciente_item.id', 'imunizacao_registro_aplicacao.ficha_id')
|
|
->leftJoin('atencao_basica_vacinacao_paciente', 'atencao_basica_vacinacao_paciente.id', 'atencao_basica_vacinacao_paciente_item.vacinacao_paciente_id')
|
|
->leftJoin('atencao_basica_ficha_vacinacao', 'atencao_basica_ficha_vacinacao.id', 'atencao_basica_vacinacao_paciente.vacinacao_id')
|
|
->leftJoin('geral_turno', 'geral_turno.id', 'atencao_basica_vacinacao_paciente.turno_id')
|
|
->leftJoin('atencao_basica_local_atendimento', 'atencao_basica_local_atendimento.id', 'atencao_basica_vacinacao_paciente.local_atendimento_id')
|
|
->leftJoin('sigtap.ocupacao', 'sigtap.ocupacao.id', DB::raw("COALESCE(imunizacao_registro_aplicacao.ocupacao_id, atencao_basica_ficha_vacinacao.ocupacao_id)"))
|
|
->leftJoin('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_ficha_vacinacao.equipe_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
|
|
->leftJoin('integracao_ria_documento_imunologico_rotina', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id', 'imunizacao_registro_aplicacao.id')
|
|
->where('imunizacao_registro_aplicacao.paciente_id', $pacienteId)
|
|
->get()
|
|
->map(function($query) use ($paciente) {
|
|
|
|
$dataAprazamento = null;
|
|
$proximaDoseId = null;
|
|
|
|
if ($paciente->cidadao->data_nascimento) {
|
|
|
|
$dataAplicacao = Carbon::create($query->data_aplicacao)->startOfDay();
|
|
$idade = $paciente->cidadao->data_nascimento->diff($dataAplicacao);
|
|
|
|
$regra = DB::table('imunizacao_esquema_vacinal_regra as regra')
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->where('regra.vacina_id', $query->vacina_id)
|
|
->where('regra.estrategia_id', $query->estrategia_id)
|
|
->where('regra.dose_id', $query->dose_id)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '<', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '<', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '=', $idade->m)
|
|
->where('faixa_etaria.inicio_dia', '<=', $idade->d)
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '>', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '>', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '=', $idade->m)
|
|
->where('faixa_etaria.fim_dia', '>=', $idade->d)
|
|
)
|
|
)
|
|
)
|
|
->select([
|
|
'regra.dias_aprazamento',
|
|
'proxima_regra.dose_id as proxima_dose_id',
|
|
])
|
|
->first();
|
|
|
|
if ($regra && !is_null($regra->dias_aprazamento)) {
|
|
|
|
$dataAprazamento = $dataAplicacao->addDays($regra->dias_aprazamento)->format('Y-m-d');
|
|
$proximaDoseId = $regra->proxima_dose_id;
|
|
}
|
|
}
|
|
|
|
return [
|
|
'id' => $query->id,
|
|
'unidade_id' => $query->unidade_id,
|
|
'unidade_nome_fantasia' => $query->unidade_nome_fantasia,
|
|
'unidade_cnes' => $query->unidade_cnes,
|
|
'sala_vacinacao_id' => $query->sala_vacinacao_id,
|
|
'sala_vacinacao_nome' => $query->sala_vacinacao_nome,
|
|
'aplicador_id' => $query->aplicador_id,
|
|
'aplicador_nome' => $query->aplicador_nome,
|
|
'aplicador_cns' => $query->aplicador_cns,
|
|
'data_registro' => $query->data_aplicacao,
|
|
'data_cadastro' => $query->data_cadastro,
|
|
'data_aprazamento' => $dataAprazamento,
|
|
'proxima_dose_id' => $proximaDoseId,
|
|
'vacina_id' => $query->vacina_id,
|
|
'vacina_nome' => $query->vacina_nome,
|
|
'vacina_abreviacao' => $query->vacina_abreviacao,
|
|
'vacina_sigla' => $query->vacina_sigla,
|
|
'vacina_sigla_nome' => $query->vacina_sigla_nome,
|
|
'vacina_sigla_abreviacao' => $query->vacina_sigla_abreviacao,
|
|
'vacina_abreviacao_nome' => $query->vacina_abreviacao_nome,
|
|
'vacina_sigla_abreviacao_nome' => $query->vacina_sigla_abreviacao_nome,
|
|
'lote' => [
|
|
'id' => $query->lote_id,
|
|
'lote' => $query->lote,
|
|
'data_validade_lote' => $query->data_validade_lote,
|
|
],
|
|
'produtor_id' => $query->produtor_id,
|
|
'produtor_nome' => $query->produtor_nome,
|
|
'grupo_atendimento_id' => $query->grupo_atendimento_id,
|
|
'grupo_atendimento_nome' => $query->grupo_atendimento_nome,
|
|
'dose_id' => $query->dose_id,
|
|
'dose_nome' => $query->dose_nome,
|
|
'estrategia_id' => $query->estrategia_id,
|
|
'estrategia_nome' => $query->estrategia_nome,
|
|
'via_administracao_id' => $query->via_administracao_id,
|
|
'via_administracao_nome' => $query->via_administracao_nome,
|
|
'local_aplicacao_id' => $query->local_aplicacao_id,
|
|
'local_aplicacao_nome' => $query->local_aplicacao_nome,
|
|
'cid_id' => $query->cid_id,
|
|
'cid_codigo' => $query->cid_codigo,
|
|
'cid_nome' => $query->cid_nome,
|
|
'comunicante_hanseniase' => $query->comunicante_hanseniase,
|
|
'gestante' => $query->gestante,
|
|
'puerpera' => $query->puerpera,
|
|
'imunizacao_advertida' => $query->imunizacao_advertida,
|
|
'viajante' => $query->viajante,
|
|
'ultimo_frasco' => $query->ultimo_frasco,
|
|
'observacao' => $query->observacao,
|
|
'registro_tipo' => $query->registro_tipo,
|
|
'ocupacao_id' => $query->ocupacao_id,
|
|
'ocupacao_nome' => $query->ocupacao_nome,
|
|
'equipe_id' => $query->equipe_id,
|
|
'equipe_nome' => $query->equipe_nome,
|
|
'turno_id' => $query->turno_id,
|
|
'turno_nome' => $query->turno_nome,
|
|
'local_atendimento_id' => $query->local_atendimento_id,
|
|
'local_atendimento_nome' => $query->local_atendimento_nome,
|
|
'exportado' => $query->exportado,
|
|
'status_ria' => $query->status_ria,
|
|
'ria_data_hora_envio' => $query->ria_data_hora_envio,
|
|
'ria_identificador_rnds' => is_null($query->ria_identificador_rnds)
|
|
? null
|
|
: basename(parse_url($query->ria_identificador_rnds, PHP_URL_PATH)),
|
|
'ria_usuario_atualizou' => (bool) $query->ria_usuario_atualizou,
|
|
'ria_atualizado' => (bool) $query->ria_atualizado,
|
|
];
|
|
});
|
|
}
|
|
|
|
public static function getRegistrosAtualizacao($pacienteId)
|
|
{
|
|
$paciente = Paciente::findOrFail($pacienteId);
|
|
|
|
return DB::table('imunizacao_registro_atualizacao')
|
|
->select([
|
|
'imunizacao_registro_atualizacao.id AS id',
|
|
'cadastro_unidade.id AS unidade_id',
|
|
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
|
|
'cadastro_unidade.cnes as unidade_cnes',
|
|
'imunizacao_sala_vacinacao.id AS sala_vacinacao_id',
|
|
DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS sala_vacinacao_nome"),
|
|
'cadastro_usuario.id AS aplicador_id',
|
|
'cadastro_cidadao.nome AS aplicador_nome',
|
|
'cadastro_cidadao.cns AS aplicador_cns',
|
|
DB::raw('DATE_FORMAT(imunizacao_registro_atualizacao.created_at, "%d/%m/%Y") AS data_cadastro'),
|
|
'imunizacao_registro_atualizacao.data_atualizacao as data_atualizacao',
|
|
'cadastro_vacina.id AS vacina_id',
|
|
'cadastro_vacina.nome AS vacina_nome',
|
|
'cadastro_vacina.abreviacao AS vacina_abreviacao',
|
|
'cadastro_vacina.sigla AS vacina_sigla',
|
|
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.nome) AS vacina_sigla_nome"),
|
|
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.abreviacao) AS vacina_sigla_abreviacao"),
|
|
DB::raw("CONCAT(cadastro_vacina.abreviacao, ' - ', cadastro_vacina.nome) AS vacina_abreviacao_nome"),
|
|
DB::raw("CONCAT(
|
|
cadastro_vacina.sigla, ' - ',
|
|
cadastro_vacina.abreviacao, ' - ',
|
|
cadastro_vacina.nome) AS vacina_sigla_abreviacao_nome"
|
|
),
|
|
'imunizacao_registro_atualizacao.lote',
|
|
'imunizacao_entrada_vacina.id as lote_id',
|
|
'imunizacao_entrada_vacina.data_validade_lote',
|
|
'imunizacao_grupo_atendimento.id AS grupo_atendimento_id',
|
|
'imunizacao_grupo_atendimento.nome AS grupo_atendimento_nome',
|
|
'imunizacao_estrategia.id as estrategia_id',
|
|
'imunizacao_estrategia.nome as estrategia_nome',
|
|
'imunizacao_dose.id AS dose_id',
|
|
'imunizacao_dose.nome AS dose_nome',
|
|
'imunizacao_registro_atualizacao.observacao',
|
|
'sigtap.ocupacao.id as ocupacao_id',
|
|
'sigtap.ocupacao.nome as ocupacao_nome',
|
|
'atencao_basica_ficha_vacinacao.equipe_id',
|
|
DB::raw("CONCAT('INE: ', atencao_basica_parametrizacao_area.numero_ine, ' - Área: ', atencao_basica_parametrizacao_area.descricao, ' - Microárea: ', atencao_basica_parametrizacao_microarea.descricao) AS equipe_nome"),
|
|
'atencao_basica_vacinacao_paciente.turno_id',
|
|
'geral_turno.nome as turno_nome',
|
|
'atencao_basica_vacinacao_paciente.local_atendimento_id',
|
|
'atencao_basica_local_atendimento.descricao as local_atendimento_nome',
|
|
DB::raw("IF(atencao_basica_ficha_vacinacao.uuid_ficha IS NOT NULL, TRUE, FALSE) as exportado"),
|
|
DB::raw("IF(integracao_ria_documento_imunologico_rotina.id IS NULL,
|
|
'pendente',
|
|
IF(EXISTS (
|
|
SELECT 1
|
|
FROM integracao_ria_documento_imunologico_rotina_resposta
|
|
WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id
|
|
), 'rejeitado', 'enviado')
|
|
) as status_ria"),
|
|
DB::raw("DATE_FORMAT(integracao_ria_documento_imunologico_rotina.data_hora_envio, '%d/%m/%Y %H:%i:%s') as ria_data_hora_envio"),
|
|
'integracao_ria_documento_imunologico_rotina.identificador_rnds as ria_identificador_rnds',
|
|
DB::raw('COALESCE(integracao_ria_documento_imunologico_rotina.usuario_atualizou, 0) as ria_usuario_atualizou'),
|
|
DB::raw('COALESCE(integracao_ria_documento_imunologico_rotina.atualizado, 0) as ria_atualizado'),
|
|
'sigtap.cid.id as cid_id',
|
|
'sigtap.cid.codigo as cid_codigo',
|
|
'sigtap.cid.nome as cid_nome'
|
|
])
|
|
->leftJoin('cadastro_usuario', 'cadastro_usuario.id', 'imunizacao_registro_atualizacao.aplicador_id')
|
|
->leftJoin('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
|
->leftJoin('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id')
|
|
->leftJoin('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
|
|
->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
|
->leftJoin('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_registro_atualizacao.vacina_id')
|
|
->leftJoin('imunizacao_grupo_atendimento', 'imunizacao_grupo_atendimento.id', 'imunizacao_registro_atualizacao.grupo_atendimento_id')
|
|
->leftJoin('imunizacao_estrategia', 'imunizacao_estrategia.id', 'imunizacao_registro_atualizacao.estrategia_id')
|
|
->leftJoin('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_atualizacao.dose_id')
|
|
->leftJoin('atencao_basica_vacinacao_paciente_item', 'atencao_basica_vacinacao_paciente_item.id', 'imunizacao_registro_atualizacao.ficha_id')
|
|
->leftJoin('imunizacao_entrada_vacina', 'atencao_basica_vacinacao_paciente_item.entrada_id', 'imunizacao_entrada_vacina.id')
|
|
->leftJoin('atencao_basica_vacinacao_paciente', 'atencao_basica_vacinacao_paciente.id', 'atencao_basica_vacinacao_paciente_item.vacinacao_paciente_id')
|
|
->leftJoin('atencao_basica_ficha_vacinacao', 'atencao_basica_ficha_vacinacao.id', 'atencao_basica_vacinacao_paciente.vacinacao_id')
|
|
->leftJoin('geral_turno', 'geral_turno.id', 'atencao_basica_vacinacao_paciente.turno_id')
|
|
->leftJoin('atencao_basica_local_atendimento', 'atencao_basica_local_atendimento.id', 'atencao_basica_vacinacao_paciente.local_atendimento_id')
|
|
->leftJoin('sigtap.ocupacao', 'sigtap.ocupacao.id', DB::raw("COALESCE(imunizacao_registro_atualizacao.ocupacao_id, atencao_basica_ficha_vacinacao.ocupacao_id)"))
|
|
->leftJoin('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_ficha_vacinacao.equipe_id')
|
|
->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
|
|
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
|
|
->leftJoin('integracao_ria_documento_imunologico_rotina', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id', 'imunizacao_registro_atualizacao.id')
|
|
->leftJoin('sigtap.cid','sigtap.cid.id', 'imunizacao_registro_atualizacao.cid_id')
|
|
->where('imunizacao_registro_atualizacao.paciente_id', $pacienteId)
|
|
->get()
|
|
->map(function($query) use ($paciente) {
|
|
|
|
$dataAprazamento = null;
|
|
$proximaDoseId = null;
|
|
|
|
if ($paciente->cidadao->data_nascimento) {
|
|
|
|
$dataAtualizacao = Carbon::create($query->data_atualizacao)->startOfDay();
|
|
$idade = $paciente->cidadao->data_nascimento->diff($dataAtualizacao);
|
|
|
|
$regra = DB::table('imunizacao_esquema_vacinal_regra as regra')
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->where('regra.vacina_id', $query->vacina_id)
|
|
->where('regra.estrategia_id', $query->estrategia_id)
|
|
->where('regra.dose_id', $query->dose_id)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '<', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '<', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '=', $idade->m)
|
|
->where('faixa_etaria.inicio_dia', '<=', $idade->d)
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '>', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '>', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '=', $idade->m)
|
|
->where('faixa_etaria.fim_dia', '>=', $idade->d)
|
|
)
|
|
)
|
|
)
|
|
->select([
|
|
'regra.dias_aprazamento',
|
|
'proxima_regra.dose_id as proxima_dose_id',
|
|
])
|
|
->first();
|
|
|
|
if ($regra && !is_null($regra->dias_aprazamento)) {
|
|
|
|
$dataAprazamento = $dataAtualizacao->addDays($regra->dias_aprazamento)->format('Y-m-d');
|
|
$proximaDoseId = $regra->proxima_dose_id;
|
|
}
|
|
}
|
|
|
|
return [
|
|
'id' => $query->id,
|
|
'unidade_id' => $query->unidade_id,
|
|
'unidade_nome_fantasia' => $query->unidade_nome_fantasia,
|
|
'unidade_cnes' => $query->unidade_cnes,
|
|
'sala_vacinacao_id' => $query->sala_vacinacao_id,
|
|
'sala_vacinacao_nome' => $query->sala_vacinacao_nome,
|
|
'aplicador_id' => $query->aplicador_id,
|
|
'aplicador_nome' => $query->aplicador_nome,
|
|
'aplicador_cns' => $query->aplicador_cns,
|
|
'data_registro' => $query->data_atualizacao,
|
|
'data_cadastro' => $query->data_cadastro,
|
|
'data_aprazamento' => $dataAprazamento,
|
|
'proxima_dose_id' => $proximaDoseId,
|
|
'vacina_id' => $query->vacina_id,
|
|
'vacina_nome' => $query->vacina_nome,
|
|
'vacina_abreviacao' => $query->vacina_abreviacao,
|
|
'vacina_sigla' => $query->vacina_sigla,
|
|
'lote' => [
|
|
'id' => $query->lote_id,
|
|
'lote' => $query->lote,
|
|
'data_validade_lote' => $query->data_validade_lote,
|
|
],
|
|
'vacina_sigla_nome' => $query->vacina_sigla_nome,
|
|
'vacina_sigla_abreviacao' => $query->vacina_sigla_abreviacao,
|
|
'vacina_abreviacao_nome' => $query->vacina_abreviacao_nome,
|
|
'vacina_sigla_abreviacao_nome' => $query->vacina_sigla_abreviacao_nome,
|
|
'produtor_id' => null,
|
|
'produtor_nome' => null,
|
|
'grupo_atendimento_id' => $query->grupo_atendimento_id,
|
|
'grupo_atendimento_nome' => $query->grupo_atendimento_nome,
|
|
'estrategia_id' => $query->estrategia_id,
|
|
'estrategia_nome' => $query->estrategia_nome,
|
|
'cid' =>[
|
|
'id' => $query->cid_id,
|
|
'codigo' => $query->cid_codigo,
|
|
'nome' => $query->cid_nome
|
|
],
|
|
'cid_codigo' => null,
|
|
'cid_nome' => null,
|
|
'dose_id' => $query->dose_id,
|
|
'dose_nome' => $query->dose_nome,
|
|
'comunicante_hanseniase' => null,
|
|
'gestante' => null,
|
|
'puerpera' => null,
|
|
'imunizacao_advertida' => null,
|
|
'viajante' => null,
|
|
'ultimo_frasco' => null,
|
|
'observacao' => $query->observacao,
|
|
'registro_tipo' => 'atualizacao',
|
|
'ocupacao_id' => $query->ocupacao_id,
|
|
'ocupacao_nome' => $query->ocupacao_nome,
|
|
'equipe_id' => $query->equipe_id,
|
|
'equipe_nome' => $query->equipe_nome,
|
|
'turno_id' => $query->turno_id,
|
|
'turno_nome' => $query->turno_nome,
|
|
'local_atendimento_id' => $query->local_atendimento_id,
|
|
'local_atendimento_nome' => $query->local_atendimento_nome,
|
|
'exportado' => $query->exportado,
|
|
'status_ria' => $query->status_ria,
|
|
'ria_data_hora_envio' => $query->ria_data_hora_envio,
|
|
'ria_identificador_rnds' => is_null($query->ria_identificador_rnds)
|
|
? null
|
|
: basename(parse_url($query->ria_identificador_rnds, PHP_URL_PATH)),
|
|
'ria_usuario_atualizou' => (bool) $query->ria_usuario_atualizou,
|
|
'ria_atualizado' => (bool) $query->ria_atualizado,
|
|
];
|
|
});
|
|
}
|
|
|
|
public static function getRegistrosAprazamento($pacienteId)
|
|
{
|
|
return DB::table('imunizacao_registro_aprazamento')
|
|
->select([
|
|
'imunizacao_registro_aprazamento.id AS id',
|
|
'imunizacao_registro_aprazamento.registro_aplicacao_id',
|
|
DB::raw('DATE_FORMAT(imunizacao_registro_aprazamento.data_aprazamento, "%d/%m/%Y") AS data_aprazamento'),
|
|
'cadastro_vacina.id AS vacina_id',
|
|
'cadastro_vacina.nome AS vacina_nome',
|
|
'cadastro_vacina.abreviacao AS vacina_abreviacao',
|
|
'cadastro_vacina.sigla AS vacina_sigla',
|
|
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.nome) AS vacina_sigla_nome"),
|
|
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.abreviacao) AS vacina_sigla_abreviacao"),
|
|
DB::raw("CONCAT(cadastro_vacina.abreviacao, ' - ', cadastro_vacina.nome) AS vacina_abreviacao_nome"),
|
|
DB::raw("CONCAT(
|
|
cadastro_vacina.sigla, ' - ',
|
|
cadastro_vacina.abreviacao, ' - ',
|
|
cadastro_vacina.nome) AS vacina_sigla_abreviacao_nome"
|
|
),
|
|
'imunizacao_dose.id AS dose_id',
|
|
'imunizacao_dose.nome AS dose_nome',
|
|
'imunizacao_registro_aprazamento.observacao',
|
|
])
|
|
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_registro_aprazamento.vacina_id')
|
|
->join('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_aprazamento.dose_id')
|
|
->whereNull('imunizacao_registro_aprazamento.registro_aplicacao_id')
|
|
->where('imunizacao_registro_aprazamento.paciente_id', $pacienteId)
|
|
->get();
|
|
}
|
|
|
|
private static function getUnidades()
|
|
{
|
|
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
|
|
|
|
$unidades = DB::table('cadastro_unidade')
|
|
->select([
|
|
'id',
|
|
'nome_fantasia',
|
|
])
|
|
->whereExists(function ($query) {
|
|
$query->select(DB::raw(1))
|
|
->from('imunizacao_sala_vacinacao')
|
|
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
|
|
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
|
|
->where('imunizacao_sala_vacinacao.ativo', true)
|
|
->where('imunizacao_sala_vacinacao.permite_aplicacao', true);
|
|
});
|
|
|
|
if ($salaVacinacaoLogada->responsavel == false) {
|
|
$unidades->where('id', $salaVacinacaoLogada->unidade_id ?? null);
|
|
}
|
|
|
|
return $unidades->orderBy('nome_fantasia')->get();
|
|
}
|
|
|
|
private static function getSalasVacinacao($unidadeId)
|
|
{
|
|
return DB::table('imunizacao_sala_vacinacao')
|
|
->select([
|
|
'imunizacao_sala_vacinacao.id',
|
|
DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS nome"),
|
|
'imunizacao_sala_vacinacao.cria_ficha_ab',
|
|
])
|
|
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
|
|
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
|
->where('imunizacao_sala_vacinacao.ativo', true)
|
|
->where('imunizacao_sala_vacinacao.permite_aplicacao', true)
|
|
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
|
|
->orderByRaw('CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END')
|
|
->get();
|
|
}
|
|
|
|
private static function getUsuario()
|
|
{
|
|
$current_lotacao = self::getCurrentLotacao();
|
|
|
|
$validaCnsPacienteAplicador = request()->cns;
|
|
|
|
$parametrizacao_ocupacao = ParametrizacaoOcupacao::all()->pluck('ocupacao_id');
|
|
|
|
if($parametrizacao_ocupacao->contains($current_lotacao->ocupacao_id)) {
|
|
|
|
if($validaCnsPacienteAplicador == $current_lotacao->usuario->cidadao->cns) {
|
|
throw new CnsException();
|
|
}
|
|
|
|
return [
|
|
'id' => $current_lotacao->usuario->id,
|
|
'cidadao_nome' => $current_lotacao->usuario->cidadao->nome,
|
|
'cidadao_cns' => $current_lotacao->usuario->cidadao->cns
|
|
];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static function getLotes($salaVacinacaoId, $vacinaId, $lote = null, $dataValidadeLote = null)
|
|
{
|
|
$loteAtual = DB::table('imunizacao_entrada_vacina')
|
|
->select([
|
|
'imunizacao_entrada_vacina.id',
|
|
'imunizacao_entrada_vacina.lote',
|
|
'imunizacao_entrada_vacina.data_validade_lote',
|
|
])
|
|
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
|
|
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
|
|
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
|
|
->where('imunizacao_entrada_vacina.lote', $lote)
|
|
->where('imunizacao_entrada_vacina.data_validade_lote', $dataValidadeLote)
|
|
->groupBy([
|
|
'imunizacao_entrada_vacina.lote',
|
|
'imunizacao_entrada_vacina.data_validade_lote',
|
|
]);
|
|
|
|
return DB::table('imunizacao_entrada_vacina')
|
|
->select([
|
|
'imunizacao_entrada_vacina.id',
|
|
'imunizacao_entrada_vacina.lote',
|
|
'imunizacao_entrada_vacina.data_validade_lote',
|
|
])
|
|
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
|
|
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
|
|
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
|
|
->groupBy([
|
|
'imunizacao_entrada_vacina.lote',
|
|
'imunizacao_entrada_vacina.data_validade_lote',
|
|
])
|
|
->havingRaw('
|
|
SUM(imunizacao_entrada_vacina.quantidade - COALESCE((
|
|
SELECT SUM(imunizacao_saida_vacina.quantidade)
|
|
FROM imunizacao_saida_vacina
|
|
WHERE imunizacao_saida_vacina.entrada_vacina_id = imunizacao_entrada_vacina.id
|
|
), 0)) > 0
|
|
')
|
|
->union($loteAtual)
|
|
->orderBy('data_validade_lote')
|
|
->get();
|
|
}
|
|
|
|
private static function getProdutores($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote)
|
|
{
|
|
return DB::table('imunizacao_produtor')
|
|
->select([
|
|
'id',
|
|
'nome',
|
|
])
|
|
->whereExists(function ($query) use ($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote) {
|
|
$query->select(DB::raw(1))
|
|
->from('imunizacao_entrada_vacina')
|
|
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
|
|
->whereColumn('imunizacao_entrada_vacina.produtor_id', 'imunizacao_produtor.id')
|
|
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
|
|
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
|
|
->where('imunizacao_entrada_vacina.lote', $lote)
|
|
->where('imunizacao_entrada_vacina.data_validade_lote', $dataValidadeLote)
|
|
->havingRaw('
|
|
SUM(imunizacao_entrada_vacina.quantidade - COALESCE((
|
|
SELECT SUM(imunizacao_saida_vacina.quantidade)
|
|
FROM imunizacao_saida_vacina
|
|
WHERE imunizacao_saida_vacina.entrada_vacina_id = imunizacao_entrada_vacina.id
|
|
), 0)) > 0
|
|
');
|
|
})
|
|
->orderBy('nome')
|
|
->get();
|
|
}
|
|
|
|
public static function getGruposAtendimento()
|
|
{
|
|
return DB::table('imunizacao_grupo_atendimento')
|
|
->select([
|
|
'id',
|
|
'nome',
|
|
])
|
|
->where('ativo', 1)
|
|
->orderBy('nome')
|
|
->get();
|
|
}
|
|
|
|
private static function getEntradaVacina($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote)
|
|
{
|
|
return DB::table('imunizacao_entrada_vacina')
|
|
->select([
|
|
'imunizacao_entrada_vacina.id',
|
|
])
|
|
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
|
|
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
|
|
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
|
|
->where('imunizacao_entrada_vacina.lote', $lote)
|
|
->where('imunizacao_entrada_vacina.data_validade_lote', $dataValidadeLote)
|
|
->havingRaw('
|
|
SUM(imunizacao_entrada_vacina.quantidade - COALESCE((
|
|
SELECT SUM(imunizacao_saida_vacina.quantidade)
|
|
FROM imunizacao_saida_vacina
|
|
WHERE imunizacao_saida_vacina.entrada_vacina_id = imunizacao_entrada_vacina.id
|
|
), 0)) > 0
|
|
')
|
|
->orderBy('imunizacao_entrada_vacina.id')
|
|
->first();
|
|
}
|
|
|
|
private static function storeFichaVacinacao($pacienteId, $aplicacao, $atualizacao = false) {
|
|
$ficha = FichaVacinacao::whereNull('uuid_ficha')
|
|
->where('usuario_id', $aplicacao['aplicador_id'])
|
|
->where('ocupacao_id', $aplicacao['ocupacao_id'])
|
|
->where('equipe_id', $aplicacao['equipe_id'])
|
|
->where('data_atendimento', $aplicacao['data_registro'])
|
|
->first();
|
|
|
|
if(!$ficha) {
|
|
$ficha = FichaVacinacao::create([
|
|
'usuario_id' => $aplicacao['aplicador_id'],
|
|
'ocupacao_id' => $aplicacao['ocupacao_id'],
|
|
'equipe_id' => $aplicacao['equipe_id'],
|
|
'sala_vacinacao_id' => $aplicacao['sala_vacinacao_id'],
|
|
'data_atendimento' => $atualizacao ? RegistroAtualizacao::find($aplicacao['id'])->created_at : $aplicacao['data_registro'],
|
|
]);
|
|
}
|
|
|
|
$paciente = VacinacaoPaciente::create([
|
|
'vacinacao_id' => $ficha->id,
|
|
'paciente_id' => $pacienteId,
|
|
'turno_id' => $aplicacao['turno_id'],
|
|
'local_atendimento_id' => $aplicacao['local_atendimento_id'],
|
|
'viajante' => $aplicacao['viajante'] ?? false,
|
|
'gestante' => $aplicacao['gestante'] ?? false,
|
|
'puerpera' => $aplicacao['puerpera'] ?? false,
|
|
'hanseniase' => $aplicacao['comunicante_hanseniase'] ?? false,
|
|
]);
|
|
|
|
$item = PacienteItem::create([
|
|
'vacinacao_paciente_id' => $paciente->id,
|
|
'vacina_id' => $aplicacao['vacina_id'],
|
|
'estrategia_id' => $aplicacao['estrategia_id'] ?? null,
|
|
'dose_id' => $aplicacao['dose_id'],
|
|
'grupo_id' => $aplicacao['grupo_atendimento_id'] ?? null,
|
|
'entrada_id' => $aplicacao['entrada_id'] ?? null,
|
|
'produtor_id' => $aplicacao['produtor_id'] ?? null,
|
|
'registro_anterior' => $atualizacao,
|
|
'data' => $atualizacao ? $aplicacao['data_registro'] : null
|
|
]);
|
|
|
|
return $item->id;
|
|
}
|
|
|
|
private static function updateFichaVacinacao($value, $ficha_id)
|
|
{
|
|
$item = PacienteItem::find($ficha_id);
|
|
$item->vacina_id = $value['vacina_id'];
|
|
$item->estrategia_id = $value['estrategia_id'] ?? null;
|
|
$item->dose_id = $value['dose_id'] ?? null;
|
|
$item->grupo_id = $value['grupo_atendimento_id'] ?? null;
|
|
$item->entrada_id = $value['entrada_id'] ?? null;
|
|
$item->produtor_id = $value['produtor_id'] ?? null;
|
|
$item->save();
|
|
|
|
$paciente = VacinacaoPaciente::find($item->vacinacao_paciente_id);
|
|
$paciente->turno_id = $value['turno_id'];
|
|
$paciente->local_atendimento_id = $value['local_atendimento_id'];
|
|
if(isset($value['viajante'])) {
|
|
$paciente->viajante = $value['viajante'];
|
|
}
|
|
if(isset($value['gestante'])) {
|
|
$paciente->gestante = $value['gestante'];
|
|
}
|
|
if(isset($value['puerpera'])) {
|
|
$paciente->puerpera = $value['puerpera'];
|
|
}
|
|
if(isset($value['comunicante_hanseniase'])) {
|
|
$paciente->hanseniase = $value['comunicante_hanseniase'];
|
|
}
|
|
$paciente->save();
|
|
}
|
|
|
|
public static function storeRegistrosAplicacao($pacienteId, $aplicacoes, $additionalParams = [])
|
|
{
|
|
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
|
|
|
|
RegistroAplicacao::where('paciente_id', $pacienteId)
|
|
->whereNotIn('id', $aplicacoes->filter(fn ($aplicacao) => isset($aplicacao['id']))->pluck('id'))
|
|
->get()
|
|
->map(function($query) {
|
|
if($query->saidaVacina) {
|
|
$entrada = Entrada::create([
|
|
'tipo_id' => EntradaTipo::ESTORNO,
|
|
'sala_vacinacao_id' => $query->saidaVacina->saida->sala_vacinacao_id,
|
|
'data_entrada' => Carbon::now()->format('Y-m-d'),
|
|
]);
|
|
|
|
$entrada->vacinas()->create([
|
|
'saida_vacina_id' => $query->saidaVacina->id,
|
|
'vacina_id' => $query->saidaVacina->vacina_id,
|
|
'produtor_id' => $query->saidaVacina->entradaVacinaOrigem->produtor_id,
|
|
'apresentacao_id' => $query->saidaVacina->entradaVacinaOrigem->apresentacao_id,
|
|
'quantidade' => $query->saidaVacina->quantidade,
|
|
'lote' => $query->saidaVacina->entradaVacinaOrigem->lote,
|
|
'data_validade_lote' => $query->saidaVacina->entradaVacinaOrigem->data_validade_lote,
|
|
]);
|
|
}
|
|
|
|
if($query->registroAprazamento) {
|
|
$query->registroAprazamento->delete();
|
|
}
|
|
|
|
$documentoImunologicoRotina = DocumentoImunologicoRotina::where('registro_aplicacao_id', $query->id)->first();
|
|
|
|
if (!is_null($documentoImunologicoRotina) && !is_null($documentoImunologicoRotina->identificador_rnds)) {
|
|
$documentoImunologicoRotina->update(['registro_aplicacao_id' => null, 'excluir' => true]);
|
|
}
|
|
|
|
$query->delete();
|
|
|
|
if($query->ficha_id) {
|
|
$ficha = PacienteItem::find($query->ficha_id);
|
|
if(is_null($ficha->vacinacaoPaciente->vacinacao->uuid_ficha)) {
|
|
$ficha->delete();
|
|
}
|
|
}
|
|
});
|
|
|
|
foreach ($aplicacoes as $value) {
|
|
if (isset($value['id'])) {
|
|
$registroAplicacao = RegistroAplicacao::find($value['id']);
|
|
|
|
if($registroAplicacao->ficha_id) {
|
|
self::updateFichaVacinacao($value, $registroAplicacao->ficha_id);
|
|
}
|
|
|
|
$registroAplicacao->aplicador_id = $value['aplicador_id'];
|
|
$registroAplicacao->ocupacao_id = $value['ocupacao_id'];
|
|
$registroAplicacao->grupo_atendimento_id = $value['grupo_atendimento_id'];
|
|
$registroAplicacao->dose_id = $value['dose_id'];
|
|
$registroAplicacao->estrategia_id = $value['estrategia_id'];
|
|
$registroAplicacao->via_administracao_id = $value['via_administracao_id'];
|
|
$registroAplicacao->local_aplicacao_id = $value['local_aplicacao_id'];
|
|
$registroAplicacao->cid_id = $value['cid_id'];
|
|
$registroAplicacao->data_aplicacao = Carbon::create($value['data_registro']);
|
|
$registroAplicacao->comunicante_hanseniase = $value['comunicante_hanseniase'];
|
|
$registroAplicacao->gestante = $value['gestante'];
|
|
$registroAplicacao->puerpera = $value['puerpera'];
|
|
$registroAplicacao->imunizacao_advertida = $value['imunizacao_advertida'];
|
|
$registroAplicacao->viajante = $value['viajante'];
|
|
$registroAplicacao->ultimo_frasco = $value['ultimo_frasco'];
|
|
$registroAplicacao->observacao = $value['observacao'];
|
|
|
|
if (trim($registroAplicacao->entradaVacina->lote) !== trim($value['lote'])) {
|
|
$entradaVacina = self::getEntradaVacina($value['sala_vacinacao_id'], $value['vacina_id'], $value['lote'], $value['data_validade_lote']);
|
|
|
|
if (!is_null($registroAplicacao->saida_vacina_id)) {
|
|
$entrada = Entrada::create([
|
|
'tipo_id' => EntradaTipo::ESTORNO,
|
|
'sala_vacinacao_id' => $registroAplicacao->saidaVacina->saida->sala_vacinacao_id,
|
|
'data_entrada' => Carbon::now()->format('Y-m-d'),
|
|
]);
|
|
|
|
$entrada->vacinas()->create([
|
|
'saida_vacina_id' => $registroAplicacao->saidaVacina->id,
|
|
'vacina_id' => $registroAplicacao->saidaVacina->vacina_id,
|
|
'produtor_id' => $registroAplicacao->saidaVacina->entradaVacinaOrigem->produtor_id,
|
|
'apresentacao_id' => $registroAplicacao->saidaVacina->entradaVacinaOrigem->apresentacao_id,
|
|
'quantidade' => $registroAplicacao->saidaVacina->quantidade,
|
|
'lote' => $registroAplicacao->saidaVacina->entradaVacinaOrigem->lote,
|
|
'data_validade_lote' => $registroAplicacao->saidaVacina->entradaVacinaOrigem->data_validade_lote,
|
|
]);
|
|
|
|
$saida = Saida::create([
|
|
'tipo_id' => SaidaTipo::APLICACAO,
|
|
'sala_vacinacao_id' => $value['sala_vacinacao_id'],
|
|
'data_saida' => Carbon::now()->format('Y-m-d'),
|
|
]);
|
|
|
|
$saidaVacina = SaidaVacina::create([
|
|
'saida_id' => $saida->id,
|
|
'entrada_vacina_id' => $entradaVacina->id,
|
|
'vacina_id' => $value['vacina_id'],
|
|
'quantidade' => 1,
|
|
]);
|
|
|
|
$registroAplicacao->saida_vacina_id = $saidaVacina->id;
|
|
$registroAplicacao->entrada_vacina_id = $entradaVacina->id;
|
|
} else {
|
|
$registroAplicacao->entrada_vacina_id = $entradaVacina->id;
|
|
}
|
|
}
|
|
|
|
$registroAplicacao->save();
|
|
|
|
if (isset($value['alterou']) && $value['alterou']) {
|
|
|
|
$documentoImunologicoRotina = DocumentoImunologicoRotina::where('registro_aplicacao_id', $registroAplicacao->id)->first();
|
|
|
|
if (!is_null($documentoImunologicoRotina)) {
|
|
$docParams = ['usuario_atualizou' => true];
|
|
|
|
if (!DocumentoImunologicoRotinaResposta::where('documento_imunologico_rotina_id', $documentoImunologicoRotina->id)->exists()) {
|
|
$docParams['alterar'] = true;
|
|
}
|
|
|
|
$documentoImunologicoRotina->update($docParams);
|
|
}
|
|
}
|
|
} else {
|
|
$ultimoFrasco = DataUtil::getBooleanValueFromStringBoolean($value['ultimo_frasco']);
|
|
|
|
$entradaVacina = self::getEntradaVacina($value['sala_vacinacao_id'], $value['vacina_id'], $value['lote'], $value['data_validade_lote']);
|
|
|
|
$ficha_id = null;
|
|
|
|
$params = [
|
|
'paciente_id' => $pacienteId,
|
|
'entrada_vacina_id' => $entradaVacina->id,
|
|
'aplicador_id' => $value['aplicador_id'],
|
|
'ocupacao_id' => $value['ocupacao_id'],
|
|
'grupo_atendimento_id' => $value['grupo_atendimento_id'],
|
|
'dose_id' => $value['dose_id'],
|
|
'estrategia_id' => $value['estrategia_id'],
|
|
'cid_id' => $value['cid_id'] ?? null,
|
|
'via_administracao_id' => $value['via_administracao_id'],
|
|
'local_aplicacao_id' => $value['local_aplicacao_id'],
|
|
'data_aplicacao' => Carbon::create($value['data_registro']),
|
|
'comunicante_hanseniase' => $value['comunicante_hanseniase'],
|
|
'gestante' => $value['gestante'],
|
|
'puerpera' => $value['puerpera'],
|
|
'imunizacao_advertida' => $value['imunizacao_advertida'],
|
|
'viajante' => $value['viajante'],
|
|
'ultimo_frasco' => $value['ultimo_frasco'],
|
|
'observacao' => $value['observacao'],
|
|
'ficha_id' => $ficha_id,
|
|
'pre_atendimento_id' => $additionalParams['pre_atendimento_id'] ?? null,
|
|
];
|
|
|
|
if ($ultimoFrasco) {
|
|
$saida = Saida::create([
|
|
'tipo_id' => SaidaTipo::APLICACAO,
|
|
'sala_vacinacao_id' => $value['sala_vacinacao_id'],
|
|
'data_saida' => Carbon::now()->format('Y-m-d'),
|
|
]);
|
|
|
|
$saidaVacina = SaidaVacina::create([
|
|
'saida_id' => $saida->id,
|
|
'entrada_vacina_id' => $entradaVacina->id,
|
|
'vacina_id' => $value['vacina_id'],
|
|
'quantidade' => 1,
|
|
]);
|
|
|
|
$params['saida_vacina_id'] = $saidaVacina->id;
|
|
}
|
|
|
|
$registroAplicacao = RegistroAplicacao::create($params);
|
|
|
|
if (isset($value['aprazamento_id'])) {
|
|
RegistroAprazamento::find($value['aprazamento_id'])->update(['registro_aplicacao_id' => $registroAplicacao->id]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function storeRegistrosAtualizacao($pacienteId, $atualizacoes, $additionalParams = [])
|
|
{
|
|
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
|
|
|
|
RegistroAtualizacao::where('paciente_id', $pacienteId)
|
|
->whereNotIn('id', $atualizacoes->filter(fn ($atualizacao) => isset($atualizacao['id']))->pluck('id'))
|
|
->get()
|
|
->map(function($query) {
|
|
$documentoImunologicoRotina = DocumentoImunologicoRotina::where('registro_atualizacao_id', $query->id)->first();
|
|
|
|
if (!is_null($documentoImunologicoRotina) && !is_null($documentoImunologicoRotina->identificador_rnds)) {
|
|
$documentoImunologicoRotina->update(['registro_atualizacao_id' => null, 'excluir' => true]);
|
|
}
|
|
|
|
$query->delete();
|
|
|
|
if($query->ficha_id) {
|
|
$ficha = PacienteItem::find($query->ficha_id);
|
|
if(is_null($ficha->vacinacaoPaciente->vacinacao->uuid_ficha)) {
|
|
$ficha->delete();
|
|
}
|
|
}
|
|
});
|
|
|
|
foreach ($atualizacoes as $value) {
|
|
if (isset($value['id'])) {
|
|
if($salaVacinacaoLogada->cria_ficha_ab) {
|
|
$ficha_id = RegistroAtualizacao::find($value['id'])->ficha_id;
|
|
|
|
if($ficha_id != null){
|
|
|
|
self::updateFichaVacinacao($value, $ficha_id);
|
|
}
|
|
}
|
|
|
|
$registroAtualizacao = RegistroAtualizacao::find($value['id']);
|
|
|
|
$registroAtualizacao->update([
|
|
'sala_vacinacao_id' => $value['sala_vacinacao_id'],
|
|
'aplicador_id' => $value['aplicador_id'],
|
|
'ocupacao_id' => $value['ocupacao_id'],
|
|
'vacina_id' => $value['vacina_id'],
|
|
'grupo_atendimento_id' => $value['grupo_atendimento_id'] ?? null,
|
|
'dose_id' => $value['dose_id'],
|
|
'estrategia_id' => $value['estrategia_id'] ?? null,
|
|
'cid_id' => $value['cid_id'] ?? null,
|
|
'data_atualizacao' => Carbon::create($value['data_registro']),
|
|
'lote' => isset($value['lote']['lote']) ? strtoupper($value['lote']['lote']) : 'N/A',
|
|
'observacao' => $value['observacao'] ?? null,
|
|
]);
|
|
|
|
if (isset($value['alterou']) && $value['alterou']) {
|
|
|
|
$documentoImunologicoRotina = DocumentoImunologicoRotina::where('registro_atualizacao_id', $registroAtualizacao->id)->first();
|
|
|
|
if (!is_null($documentoImunologicoRotina)) {
|
|
$docParams = ['usuario_atualizou' => true];
|
|
|
|
if (!DocumentoImunologicoRotinaResposta::where('documento_imunologico_rotina_id', $documentoImunologicoRotina->id)->exists()) {
|
|
$docParams['alterar'] = true;
|
|
}
|
|
|
|
$documentoImunologicoRotina->update($docParams);
|
|
}
|
|
}
|
|
} else {
|
|
$ficha_id = null;
|
|
|
|
$atualizacao = RegistroAtualizacao::create([
|
|
'paciente_id' => $pacienteId,
|
|
'sala_vacinacao_id' => $value['sala_vacinacao_id'],
|
|
'aplicador_id' => $value['aplicador_id'],
|
|
'ocupacao_id' => $value['ocupacao_id'],
|
|
'vacina_id' => $value['vacina_id'],
|
|
'grupo_atendimento_id' => $value['grupo_atendimento_id'] ?? null,
|
|
'dose_id' => $value['dose_id'],
|
|
'estrategia_id' => $value['estrategia_id'] ?? null,
|
|
'cid_id' => $value['cid_id'] ?? null,
|
|
'data_atualizacao' => Carbon::create($value['data_registro']),
|
|
'lote' => strtoupper($value['lote']),
|
|
'observacao' => $value['observacao'],
|
|
'pre_atendimento_id' => $additionalParams['pre_atendimento_id'] ?? null,
|
|
])->fresh();
|
|
}
|
|
}
|
|
}
|
|
|
|
private static function storeRegistrosAprazamento($pacienteId, $aprazamentos)
|
|
{
|
|
RegistroAprazamento::where('paciente_id', $pacienteId)
|
|
->whereNull('registro_aplicacao_id')
|
|
->whereNotIn('id', $aprazamentos->filter(fn ($aprazamento) => isset($aprazamento['id']))->pluck('id'))
|
|
->delete();
|
|
|
|
foreach ($aprazamentos as $value) {
|
|
if (isset($value['id']) && is_numeric($value['id'])) {
|
|
RegistroAprazamento::find($value['id'])->update([
|
|
'vacina_id' => $value['vacina_id'],
|
|
'dose_id' => $value['dose_id'],
|
|
'data_aprazamento' => Carbon::createFromFormat('d/m/Y', $value['data_aprazamento']),
|
|
'observacao' => $value['observacao'],
|
|
]);
|
|
} else {
|
|
RegistroAprazamento::create([
|
|
'paciente_id' => $pacienteId,
|
|
'vacina_id' => $value['vacina_id'],
|
|
'dose_id' => $value['dose_id'],
|
|
'data_aprazamento' => Carbon::createFromFormat('d/m/Y', $value['data_aprazamento']),
|
|
'observacao' => $value['observacao'],
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static 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;
|
|
}
|
|
|
|
private static function getEstrategias($pacienteId, $dataRegistroAtual, $vacinaId)
|
|
{
|
|
$dataNascimento = Paciente::findOrFail($pacienteId)->cidadao->data_nascimento;
|
|
|
|
if (is_null($dataNascimento)) {
|
|
|
|
return collect();
|
|
}
|
|
|
|
$dataRegistroAtual = Carbon::createFromFormat('d/m/Y', $dataRegistroAtual);
|
|
$idade = $dataNascimento->diff($dataRegistroAtual);
|
|
|
|
return DB::table('imunizacao_estrategia as estrategia')
|
|
->whereExists(fn ($q) => $q
|
|
->selectRaw(1)
|
|
->from('imunizacao_esquema_vacinal_regra as regra')
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->whereColumn('regra.estrategia_id', 'estrategia.id')
|
|
->where('regra.vacina_id', $vacinaId)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '<', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '<', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '=', $idade->m)
|
|
->where('faixa_etaria.inicio_dia', '<=', $idade->d)
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '>', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '>', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '=', $idade->m)
|
|
->where('faixa_etaria.fim_dia', '>=', $idade->d)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
->select(
|
|
'estrategia.id',
|
|
'estrategia.nome'
|
|
)
|
|
->orderBy('estrategia.nome')
|
|
->get();
|
|
}
|
|
|
|
private static function getDosesAprazamento($pacienteId, $dataRegistroAtual, $vacinaId)
|
|
{
|
|
$dataNascimento = Paciente::findOrFail($pacienteId)->cidadao->data_nascimento;
|
|
|
|
if (is_null($dataNascimento)) {
|
|
|
|
return collect();
|
|
}
|
|
|
|
$dataRegistroAtual = Carbon::createFromFormat('d/m/Y', $dataRegistroAtual)->startOfDay();
|
|
$idade = $dataNascimento->diff($dataRegistroAtual);
|
|
|
|
$doses = DB::table('imunizacao_dose as dose')
|
|
->whereExists(fn ($q) => $q
|
|
->selectRaw(1)
|
|
->from('imunizacao_esquema_vacinal_regra as regra')
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->whereColumn('regra.dose_id', 'dose.id')
|
|
->where('regra.vacina_id', $vacinaId)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '<', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '<', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '=', $idade->m)
|
|
->where('faixa_etaria.inicio_dia', '<=', $idade->d)
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '>', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '>', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '=', $idade->m)
|
|
->where('faixa_etaria.fim_dia', '>=', $idade->d)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
->select(
|
|
'dose.id',
|
|
'dose.nome',
|
|
)
|
|
->orderBy('dose.nome')
|
|
->get();
|
|
|
|
return $doses;
|
|
}
|
|
|
|
private static function getDoses($pacienteId, $dataRegistroAtual, $vacinaId, $estrategiaId, $editingDoseId = null)
|
|
{
|
|
$dataNascimento = Paciente::findOrFail($pacienteId)->cidadao->data_nascimento;
|
|
|
|
if (is_null($dataNascimento)) {
|
|
|
|
return collect();
|
|
}
|
|
|
|
$dataRegistroAtual = Carbon::createFromFormat('d/m/Y', $dataRegistroAtual)->startOfDay();
|
|
$idade = $dataNascimento->diff($dataRegistroAtual);
|
|
|
|
$doses = DB::table('imunizacao_dose as dose')
|
|
->join('imunizacao_esquema_vacinal_regra as regra', 'regra.dose_id', 'dose.id')
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->where('regra.vacina_id', $vacinaId)
|
|
->where('regra.estrategia_id', $estrategiaId)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '<', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '<', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '=', $idade->m)
|
|
->where('faixa_etaria.inicio_dia', '<=', $idade->d)
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '>', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '>', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '=', $idade->m)
|
|
->where('faixa_etaria.fim_dia', '>=', $idade->d)
|
|
)
|
|
)
|
|
)
|
|
->select(
|
|
'dose.id',
|
|
'dose.nome',
|
|
'regra.dias_aprazamento',
|
|
'proxima_regra.dose_id as proxima_dose_id',
|
|
DB::raw("IF(EXISTS(
|
|
SELECT 1
|
|
FROM imunizacao_esquema_vacinal_regra as regra_anterior
|
|
WHERE regra_anterior.proxima_regra_id = regra.id
|
|
), 1, 0) as has_dose_anterior")
|
|
)
|
|
->orderBy('dose.nome')
|
|
->get();
|
|
|
|
$registrosExcluidos = collect(request()->get('registros_excluidos', []));
|
|
|
|
$dataNascimentoFormatada = $dataNascimento->format('Y-m-d');
|
|
|
|
$dosesAplicadas = DB::table('imunizacao_registro_aplicacao as aplicacao')
|
|
->join('imunizacao_entrada_vacina as entrada_vacina', 'entrada_vacina.id', 'aplicacao.entrada_vacina_id')
|
|
->join('imunizacao_esquema_vacinal_regra as regra', fn ($j) => $j
|
|
->on('regra.vacina_id', 'entrada_vacina.vacina_id')
|
|
->whereColumn('regra.estrategia_id', 'aplicacao.estrategia_id')
|
|
->whereColumn('regra.dose_id', 'aplicacao.dose_id')
|
|
)
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->leftJoin('imunizacao_dose as proxima_dose', 'proxima_dose.id', 'proxima_regra.dose_id')
|
|
->whereNotIn('aplicacao.id', $registrosExcluidos->where('registro_tipo', 'aplicacao')->pluck('id'))
|
|
->where('aplicacao.paciente_id', $pacienteId)
|
|
->where('entrada_vacina.vacina_id', $vacinaId)
|
|
->where('aplicacao.estrategia_id', $estrategiaId)
|
|
->whereRaw("(
|
|
(
|
|
(faixa_etaria.inicio_ano < TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao))
|
|
OR (
|
|
faixa_etaria.inicio_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao)
|
|
AND faixa_etaria.inicio_mes < (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao) % 12)
|
|
)
|
|
OR (
|
|
faixa_etaria.inicio_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao)
|
|
AND faixa_etaria.inicio_mes = (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao) % 12)
|
|
AND faixa_etaria.inicio_dia <= DATEDIFF(
|
|
aplicacao.data_aplicacao,
|
|
DATE_ADD(
|
|
DATE_ADD('{$dataNascimentoFormatada}',
|
|
INTERVAL TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao) YEAR
|
|
),
|
|
INTERVAL (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao) % 12) MONTH
|
|
)
|
|
)
|
|
)
|
|
)
|
|
AND
|
|
(
|
|
(faixa_etaria.fim_ano > TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao))
|
|
OR (
|
|
faixa_etaria.fim_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao)
|
|
AND faixa_etaria.fim_mes > (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao) % 12)
|
|
)
|
|
OR (
|
|
faixa_etaria.fim_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao)
|
|
AND faixa_etaria.fim_mes = (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao) % 12)
|
|
AND faixa_etaria.fim_dia >= DATEDIFF(
|
|
aplicacao.data_aplicacao,
|
|
DATE_ADD(
|
|
DATE_ADD('{$dataNascimentoFormatada}',
|
|
INTERVAL TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao) YEAR
|
|
),
|
|
INTERVAL (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', aplicacao.data_aplicacao) % 12) MONTH
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)")
|
|
->select(
|
|
'aplicacao.data_aplicacao as data',
|
|
'aplicacao.dose_id',
|
|
'regra.dias_aprazamento',
|
|
'proxima_regra.dose_id as proxima_dose_id'
|
|
)
|
|
->unionAll(DB::table('imunizacao_registro_atualizacao as atualizacao')
|
|
->join('imunizacao_esquema_vacinal_regra as regra', fn ($j) => $j
|
|
->on('regra.vacina_id', 'atualizacao.vacina_id')
|
|
->whereColumn('regra.estrategia_id', 'atualizacao.estrategia_id')
|
|
->whereColumn('regra.dose_id', 'atualizacao.dose_id')
|
|
)
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->leftJoin('imunizacao_dose as proxima_dose', 'proxima_dose.id', 'proxima_regra.dose_id')
|
|
->whereNotIn('atualizacao.id', $registrosExcluidos->where('registro_tipo', 'atualizacao')->pluck('id'))
|
|
->where('atualizacao.paciente_id', $pacienteId)
|
|
->where('atualizacao.vacina_id', $vacinaId)
|
|
->where('atualizacao.estrategia_id', $estrategiaId)
|
|
->whereRaw("(
|
|
(
|
|
(faixa_etaria.inicio_ano < TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao))
|
|
OR (
|
|
faixa_etaria.inicio_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao)
|
|
AND faixa_etaria.inicio_mes < (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao) % 12)
|
|
)
|
|
OR (
|
|
faixa_etaria.inicio_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao)
|
|
AND faixa_etaria.inicio_mes = (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao) % 12)
|
|
AND faixa_etaria.inicio_dia <= DATEDIFF(
|
|
atualizacao.data_atualizacao,
|
|
DATE_ADD(
|
|
DATE_ADD('{$dataNascimentoFormatada}',
|
|
INTERVAL TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao) YEAR
|
|
),
|
|
INTERVAL (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao) % 12) MONTH
|
|
)
|
|
)
|
|
)
|
|
)
|
|
AND
|
|
(
|
|
(faixa_etaria.fim_ano > TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao))
|
|
OR (
|
|
faixa_etaria.fim_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao)
|
|
AND faixa_etaria.fim_mes > (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao) % 12)
|
|
)
|
|
OR (
|
|
faixa_etaria.fim_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao)
|
|
AND faixa_etaria.fim_mes = (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao) % 12)
|
|
AND faixa_etaria.fim_dia >= DATEDIFF(
|
|
atualizacao.data_atualizacao,
|
|
DATE_ADD(
|
|
DATE_ADD('{$dataNascimentoFormatada}',
|
|
INTERVAL TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao) YEAR
|
|
),
|
|
INTERVAL (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', atualizacao.data_atualizacao) % 12) MONTH
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)")
|
|
->select(
|
|
'atualizacao.data_atualizacao as data',
|
|
'atualizacao.dose_id',
|
|
'regra.dias_aprazamento',
|
|
'proxima_regra.dose_id as proxima_dose_id'
|
|
)
|
|
)
|
|
->get();
|
|
|
|
collect(request()->get('registros_nao_salvos', []))->each(function ($registro) use ($dosesAplicadas, $vacinaId, $estrategiaId, $dataNascimento) {
|
|
|
|
$dataNascimentoFormatada = $dataNascimento->format('Y-m-d');
|
|
|
|
$regra = DB::table('imunizacao_esquema_vacinal_regra as regra')
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->leftJoin('imunizacao_dose as proxima_dose', 'proxima_dose.id', 'proxima_regra.dose_id')
|
|
->where('regra.vacina_id', $vacinaId)
|
|
->where('regra.estrategia_id', $estrategiaId)
|
|
->where('regra.dose_id', $registro['dose_id'])
|
|
->whereRaw("(
|
|
(
|
|
(faixa_etaria.inicio_ano < TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', '{$registro['data']}'))
|
|
OR (
|
|
faixa_etaria.inicio_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', '{$registro['data']}')
|
|
AND faixa_etaria.inicio_mes < (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', '{$registro['data']}') % 12)
|
|
)
|
|
OR (
|
|
faixa_etaria.inicio_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', '{$registro['data']}')
|
|
AND faixa_etaria.inicio_mes = (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', '{$registro['data']}') % 12)
|
|
AND faixa_etaria.inicio_dia <= DATEDIFF(
|
|
'{$registro['data']}',
|
|
DATE_ADD(
|
|
DATE_ADD('{$dataNascimentoFormatada}',
|
|
INTERVAL TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', '{$registro['data']}') YEAR
|
|
),
|
|
INTERVAL (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', '{$registro['data']}') % 12) MONTH
|
|
)
|
|
)
|
|
)
|
|
)
|
|
AND
|
|
(
|
|
(faixa_etaria.fim_ano > TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', '{$registro['data']}'))
|
|
OR (
|
|
faixa_etaria.fim_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', '{$registro['data']}')
|
|
AND faixa_etaria.fim_mes > (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', '{$registro['data']}') % 12)
|
|
)
|
|
OR (
|
|
faixa_etaria.fim_ano = TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', '{$registro['data']}')
|
|
AND faixa_etaria.fim_mes = (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', '{$registro['data']}') % 12)
|
|
AND faixa_etaria.fim_dia >= DATEDIFF(
|
|
'{$registro['data']}',
|
|
DATE_ADD(
|
|
DATE_ADD('{$dataNascimentoFormatada}',
|
|
INTERVAL TIMESTAMPDIFF(YEAR, '{$dataNascimentoFormatada}', '{$registro['data']}') YEAR
|
|
),
|
|
INTERVAL (TIMESTAMPDIFF(MONTH, '{$dataNascimentoFormatada}', '{$registro['data']}') % 12) MONTH
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)")
|
|
->select(
|
|
'regra.dias_aprazamento',
|
|
'proxima_regra.dose_id as proxima_dose_id'
|
|
)
|
|
->first();
|
|
|
|
$dosesAplicadas->push((object) [
|
|
'data' => $registro['data'],
|
|
'dose_id' => $registro['dose_id'],
|
|
'dias_aprazamento' => $regra->dias_aprazamento,
|
|
'proxima_dose_id' => $regra->proxima_dose_id,
|
|
]);
|
|
});
|
|
|
|
if (!is_null($editingDoseId)) {
|
|
|
|
$dosesAplicadas = $dosesAplicadas->filter(fn ($da) => $da->dose_id != $editingDoseId)->values();
|
|
}
|
|
|
|
return $doses
|
|
->filter(function ($dose) use ($dosesAplicadas, $dataRegistroAtual) {
|
|
|
|
if ($dosesAplicadas->where('dose_id', $dose->id)->isNotEmpty()) {
|
|
|
|
return false;
|
|
}
|
|
|
|
$doseAnteriorAplicada = $dosesAplicadas->where('proxima_dose_id', $dose->id)->first();
|
|
|
|
if ($doseAnteriorAplicada) {
|
|
|
|
$dataAplicacaoAnterior = Carbon::create($doseAnteriorAplicada->data);
|
|
|
|
if ($dataRegistroAtual < $dataAplicacaoAnterior) {
|
|
|
|
return false;
|
|
}
|
|
|
|
if (!is_null($doseAnteriorAplicada->dias_aprazamento)
|
|
&& $dataAplicacaoAnterior->copy()->addDays($doseAnteriorAplicada->dias_aprazamento) > $dataRegistroAtual
|
|
) {
|
|
|
|
return false;
|
|
}
|
|
}
|
|
else if ((bool) $dose->has_dose_anterior) {
|
|
|
|
return false;
|
|
}
|
|
|
|
if ($dosePosteriorAplicada = $dosesAplicadas->where('dose_id', $dose->proxima_dose_id)->first()) {
|
|
|
|
$dataAplicacaoPosterior = Carbon::create($dosePosteriorAplicada->data);
|
|
|
|
if ($dataRegistroAtual > $dataAplicacaoPosterior) {
|
|
|
|
return false;
|
|
}
|
|
|
|
if (!is_null($dose->dias_aprazamento)
|
|
&& $dataRegistroAtual->copy()->addDays($dose->dias_aprazamento) > $dataAplicacaoPosterior
|
|
) {
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
})
|
|
->values()
|
|
->map(fn ($d) => (object) ['id' => $d->id, 'nome' => $d->nome, 'dias_aprazamento' => $d->dias_aprazamento]);
|
|
}
|
|
|
|
private static function getProximaDose($pacienteId, $dataRegistroAtual, $vacinaId, $estrategiaId, $editingDoseId = null)
|
|
{
|
|
$dataNascimento = Paciente::findOrFail($pacienteId)->cidadao->data_nascimento;
|
|
|
|
if (is_null($dataNascimento)) {
|
|
|
|
return collect();
|
|
}
|
|
|
|
$dataRegistroAtual = Carbon::createFromFormat('d/m/Y', $dataRegistroAtual)->startOfDay();
|
|
$idade = $dataNascimento->diff($dataRegistroAtual);
|
|
|
|
$doses = DB::table('imunizacao_dose as dose')
|
|
->join('imunizacao_esquema_vacinal_regra as regra', 'regra.dose_id', 'dose.id')
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->where('regra.vacina_id', $vacinaId)
|
|
->where('regra.estrategia_id', $estrategiaId)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '<', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '<', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '=', $idade->m)
|
|
->where('faixa_etaria.inicio_dia', '<=', $idade->d)
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '>', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '>', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '=', $idade->m)
|
|
->where('faixa_etaria.fim_dia', '>=', $idade->d)
|
|
)
|
|
)
|
|
)
|
|
->select(
|
|
'dose.id',
|
|
'dose.nome',
|
|
'regra.dias_aprazamento',
|
|
'proxima_regra.dose_id as proxima_dose_id',
|
|
DB::raw("IF(EXISTS(
|
|
SELECT 1
|
|
FROM imunizacao_esquema_vacinal_regra as regra_anterior
|
|
WHERE regra_anterior.proxima_regra_id = regra.id
|
|
), 1, 0) as has_dose_anterior")
|
|
)
|
|
->orderBy('dose.nome')
|
|
->get();
|
|
|
|
$registrosExcluidos = collect(request()->get('registros_excluidos', []));
|
|
|
|
$dosesAplicadas = DB::table('imunizacao_registro_aplicacao as aplicacao')
|
|
->join('imunizacao_entrada_vacina as entrada_vacina', 'entrada_vacina.id', 'aplicacao.entrada_vacina_id')
|
|
->join('imunizacao_esquema_vacinal_regra as regra', fn ($j) => $j
|
|
->on('regra.vacina_id', 'entrada_vacina.vacina_id')
|
|
->whereColumn('regra.estrategia_id', 'aplicacao.estrategia_id')
|
|
->whereColumn('regra.dose_id', 'aplicacao.dose_id')
|
|
)
|
|
->join('imunizacao_dose as dose', 'dose.id', 'regra.dose_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->leftJoin('imunizacao_dose as proxima_dose', 'proxima_dose.id', 'proxima_regra.dose_id')
|
|
->whereNotIn('aplicacao.id', $registrosExcluidos->where('registro_tipo', 'aplicacao')->pluck('id'))
|
|
->where('aplicacao.paciente_id', $pacienteId)
|
|
->where('entrada_vacina.vacina_id', $vacinaId)
|
|
->where('aplicacao.estrategia_id', $estrategiaId)
|
|
->select(
|
|
'aplicacao.data_aplicacao as data',
|
|
'aplicacao.dose_id',
|
|
'dose.nome as dose_nome',
|
|
'regra.dias_aprazamento',
|
|
'proxima_regra.dose_id as proxima_dose_id'
|
|
)
|
|
->unionAll(DB::table('imunizacao_registro_atualizacao as atualizacao')
|
|
->join('imunizacao_esquema_vacinal_regra as regra', fn ($j) => $j
|
|
->on('regra.vacina_id', 'atualizacao.vacina_id')
|
|
->whereColumn('regra.estrategia_id', 'atualizacao.estrategia_id')
|
|
->whereColumn('regra.dose_id', 'atualizacao.dose_id')
|
|
)
|
|
->join('imunizacao_dose as dose', 'dose.id', 'regra.dose_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->leftJoin('imunizacao_dose as proxima_dose', 'proxima_dose.id', 'proxima_regra.dose_id')
|
|
->whereNotIn('atualizacao.id', $registrosExcluidos->where('registro_tipo', 'atualizacao')->pluck('id'))
|
|
->where('atualizacao.paciente_id', $pacienteId)
|
|
->where('atualizacao.vacina_id', $vacinaId)
|
|
->where('atualizacao.estrategia_id', $estrategiaId)
|
|
->select(
|
|
'atualizacao.data_atualizacao as data',
|
|
'atualizacao.dose_id',
|
|
'dose.nome as dose_nome',
|
|
'regra.dias_aprazamento',
|
|
'proxima_regra.dose_id as proxima_dose_id'
|
|
)
|
|
)
|
|
->get();
|
|
|
|
collect(request()->get('registros_nao_salvos', []))->each(function ($registro) use ($dosesAplicadas, $vacinaId, $estrategiaId, $dataNascimento) {
|
|
|
|
$regra = DB::table('imunizacao_esquema_vacinal_regra as regra')
|
|
->join('imunizacao_dose as dose', 'dose.id', 'regra.dose_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->leftJoin('imunizacao_dose as proxima_dose', 'proxima_dose.id', 'proxima_regra.dose_id')
|
|
->where('regra.vacina_id', $vacinaId)
|
|
->where('regra.estrategia_id', $estrategiaId)
|
|
->where('regra.dose_id', $registro['dose_id'])
|
|
->select(
|
|
'regra.dias_aprazamento',
|
|
'dose.nome as dose_nome',
|
|
'proxima_regra.dose_id as proxima_dose_id'
|
|
)
|
|
->first();
|
|
|
|
$dosesAplicadas->push((object) [
|
|
'data' => $registro['data'],
|
|
'dose_id' => (int) $registro['dose_id'],
|
|
'dose_nome' => $regra->dose_nome,
|
|
'dias_aprazamento' => $regra->dias_aprazamento,
|
|
'proxima_dose_id' => $regra->proxima_dose_id,
|
|
]);
|
|
});
|
|
|
|
if (!is_null($editingDoseId)) {
|
|
|
|
$dosesAplicadas = $dosesAplicadas->filter(fn ($da) => $da->dose_id != $editingDoseId)->values();
|
|
}
|
|
|
|
$dosesAplicadasAux = collect();
|
|
|
|
$dosesAplicadas->sortByDesc('data')->each(function ($doseAplicada) use ($dosesAplicadasAux) {
|
|
if ($dosesAplicadasAux->where('dose_id', $doseAplicada->dose_id)->isNotEmpty()) {
|
|
return;
|
|
}
|
|
|
|
$dosesAplicadasAux->push($doseAplicada);
|
|
});
|
|
|
|
$dosesAplicadas = $dosesAplicadasAux->sortBy('data')->values();
|
|
|
|
$proximasDoses = collect();
|
|
|
|
$dosesAplicadas
|
|
->filter(function ($doseAplicada) use ($dosesAplicadas, $dataRegistroAtual) {
|
|
if (is_null($doseAplicada->proxima_dose_id)) {
|
|
return false;
|
|
}
|
|
|
|
if ($dosesAplicadas->where('dose_id', $doseAplicada->proxima_dose_id)->isNotEmpty()) {
|
|
return false;
|
|
}
|
|
|
|
$dataAplicacao = Carbon::create($doseAplicada->data);
|
|
|
|
if ($dataRegistroAtual < $dataAplicacao) {
|
|
return false;
|
|
}
|
|
|
|
if (!is_null($doseAplicada->dias_aprazamento)
|
|
&& $dataAplicacao->copy()->addDays($doseAplicada->dias_aprazamento) > $dataRegistroAtual
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
})
|
|
->each(function ($doseAplicada) use ($vacinaId, $estrategiaId, $proximasDoses, $doses, $dosesAplicadas) {
|
|
$proximaDose = $doses->where('id', $doseAplicada->proxima_dose_id)->first();
|
|
|
|
if ($proximaDose && !self::hasDosePosteriorAplicada($vacinaId, $estrategiaId, $dosesAplicadas, $proximaDose)) {
|
|
$proximasDoses->push((object) [
|
|
'id' => $proximaDose->id,
|
|
'nome' => $proximaDose->nome,
|
|
'dose_anterior_nome' => $doseAplicada->dose_nome,
|
|
]);
|
|
}
|
|
});
|
|
|
|
return $proximasDoses;
|
|
}
|
|
|
|
private static function getProximoAprazamento($pacienteId, $dataRegistroAtual, $vacinaId, $estrategiaId, $doseId)
|
|
{
|
|
$dataNascimento = Paciente::findOrFail($pacienteId)->cidadao->data_nascimento;
|
|
|
|
if (is_null($dataNascimento)) {
|
|
|
|
return ['aprazamento' => null];
|
|
}
|
|
|
|
$dataRegistroAtual = Carbon::createFromFormat('d/m/Y', $dataRegistroAtual)->startOfDay();
|
|
$idade = $dataNascimento->diff($dataRegistroAtual);
|
|
|
|
$regra = DB::table('imunizacao_esquema_vacinal_regra as regra')
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->leftJoin('imunizacao_dose as proxima_dose', 'proxima_dose.id', 'proxima_regra.dose_id')
|
|
->where('regra.vacina_id', $vacinaId)
|
|
->where('regra.estrategia_id', $estrategiaId)
|
|
->where('regra.dose_id', $doseId)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '<', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '<', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '=', $idade->m)
|
|
->where('faixa_etaria.inicio_dia', '<=', $idade->d)
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '>', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '>', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '=', $idade->m)
|
|
->where('faixa_etaria.fim_dia', '>=', $idade->d)
|
|
)
|
|
)
|
|
)
|
|
->select(
|
|
'regra.dias_aprazamento',
|
|
'proxima_regra.dose_id as proxima_dose_id',
|
|
'proxima_dose.nome as proxima_dose_nome'
|
|
)
|
|
->first();
|
|
|
|
if ($regra && !is_null($regra->dias_aprazamento) && !is_null($regra->proxima_dose_id)) {
|
|
$vacina = Vacina::findOrFail($vacinaId);
|
|
|
|
return [
|
|
'aprazamento' => [
|
|
'data_aprazamento' => $dataRegistroAtual->copy()->addDays($regra->dias_aprazamento)->format('d/m/Y'),
|
|
'vacina_id' => $vacina->id,
|
|
'vacina_nome' => $vacina->nome,
|
|
'vacina_abreviacao' => $vacina->abreviacao,
|
|
'vacina_sigla' => $vacina->sigla,
|
|
'vacina_sigla_nome' => "{$vacina->sigla} - {$vacina->nome}",
|
|
'vacina_sigla_abreviacao' => "{$vacina->sigla} - {$vacina->abreviacao}",
|
|
'vacina_abreviacao_nome' => "{$vacina->abreviacao} - {$vacina->nome}",
|
|
'vacina_sigla_abreviacao_nome' => "{$vacina->sigla} - {$vacina->abreviacao} - {$vacina->nome}",
|
|
'dose_id' => $regra->proxima_dose_id,
|
|
'dose_nome' => $regra->proxima_dose_nome,
|
|
'observacao' => null
|
|
]
|
|
];
|
|
}
|
|
|
|
return ['aprazamento' => null];
|
|
}
|
|
|
|
private static function hasDosePosteriorAplicada($vacinaId, $estrategiaId, $dosesAplicadas, $dose)
|
|
{
|
|
if (is_null($dose->proxima_dose_id)) {
|
|
return false;
|
|
}
|
|
|
|
if ($dosesAplicadas->where('dose_id', $dose->proxima_dose_id)->isNotEmpty()) {
|
|
return true;
|
|
}
|
|
|
|
$proximaDose = DB::table('imunizacao_dose as dose')
|
|
->join('imunizacao_esquema_vacinal_regra as regra', 'regra.dose_id', 'dose.id')
|
|
->leftJoin('imunizacao_esquema_vacinal_regra as proxima_regra', 'proxima_regra.id', 'regra.proxima_regra_id')
|
|
->where('regra.vacina_id', $vacinaId)
|
|
->where('regra.estrategia_id', $estrategiaId)
|
|
->where('regra.dose_id', $dose->proxima_dose_id)
|
|
->select(
|
|
'proxima_regra.dose_id as proxima_dose_id',
|
|
)
|
|
->orderBy('regra.id')
|
|
->first();
|
|
|
|
return self::hasDosePosteriorAplicada($vacinaId, $estrategiaId, $dosesAplicadas, $proximaDose);
|
|
}
|
|
|
|
private static function getSugestacaoViaAdministracaoLocalAplicacao($pacienteId, $dataRegistroAtual, $vacinaId, $estrategiaId, $doseId)
|
|
{
|
|
$dataNascimento = Paciente::findOrFail($pacienteId)->cidadao->data_nascimento;
|
|
|
|
$viaAdministracaoId = ImunizacaoViaAdministracao::SEM_REGISTRO_NO_SISTEMA_DE_INFORMACAO_DE_ORIGEM;
|
|
$localAplicacaoId = ImunizacaoLocalAplicacao::SEM_REGISTRO_NO_SISTEMA_DE_INFORMACAO_DE_ORIGEM;
|
|
|
|
if (!is_null($dataNascimento)) {
|
|
|
|
$dataRegistroAtual = Carbon::createFromFormat('d/m/Y', $dataRegistroAtual);
|
|
$idade = $dataNascimento->diff($dataRegistroAtual);
|
|
|
|
$regra = DB::table('imunizacao_esquema_vacinal_regra as regra')
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->where('regra.vacina_id', $vacinaId)
|
|
->where('regra.estrategia_id', $estrategiaId)
|
|
->where('regra.dose_id', $doseId)
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '<', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '<', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '=', $idade->m)
|
|
->where('faixa_etaria.inicio_dia', '<=', $idade->d)
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '>', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '>', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '=', $idade->m)
|
|
->where('faixa_etaria.fim_dia', '>=', $idade->d)
|
|
)
|
|
)
|
|
)
|
|
->select(
|
|
'regra.via_administracao_id',
|
|
'regra.local_aplicacao_id'
|
|
)
|
|
->first();
|
|
|
|
if (!is_null($regra)) {
|
|
|
|
$viaAdministracaoId = $regra->via_administracao_id;
|
|
$localAplicacaoId = $regra->local_aplicacao_id;
|
|
}
|
|
}
|
|
|
|
return [
|
|
'via_administracao_id' => $viaAdministracaoId,
|
|
'local_aplicacao_id' => $localAplicacaoId,
|
|
];
|
|
}
|
|
|
|
public static function getOcupacoes($request)
|
|
{
|
|
$salaVacinacao = SalaVacinacao::findOrFail($request['sala_vacinacao_id']);
|
|
|
|
return DB::table('sigtap.ocupacao AS ocupacao')
|
|
->whereExists(fn ($q) => $q
|
|
->selectRaw(1)
|
|
->from('cadastro_lotacao AS lotacao')
|
|
->whereColumn('lotacao.ocupacao_id', 'ocupacao.id')
|
|
->where('lotacao.ativo', true)
|
|
->whereNull('lotacao.deleted_at')
|
|
->where('lotacao.usuario_id', $request['usuario_id'])
|
|
->where('lotacao.infraestrutura_id', $salaVacinacao->infraestrutura_id)
|
|
)
|
|
->select(
|
|
'ocupacao.id',
|
|
'ocupacao.nome',
|
|
DB::raw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) AS codigo_nome")
|
|
)
|
|
->orderByRaw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)")
|
|
->get();
|
|
}
|
|
}
|