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

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();
}
}