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