self::getAdditionalsData(), ]; } public static function create() { $campanha = CadastroCampanhaService::show(request()->get('campanha_id')); $form = self::getFormData($campanha); return [ 'additionals' => self::getAdditionalsData(), 'form' => $form, 'model' => self::getModelData($campanha, $form), ]; } public static function store($request) { self::validate($request); DB::transaction(function() use ($request) { $entradaVacina = self::getEntradaVacina($request['sala_vacinacao_id'], $request['vacina_id'], $request['lote'], $request['data_validade_lote']); $saida = Saida::create([ 'tipo_id' => SaidaTipo::APLICACAO, 'sala_vacinacao_id' => $request['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' => $request['vacina_id'], 'quantidade' => 1, ]); RegistroAplicacao::create([ 'paciente_id' => $request['paciente_id'], 'saida_vacina_id' => $saidaVacina->id, 'aplicador_id' => $request['aplicador_id'], 'grupo_atendimento_id' => $request['grupo_atendimento_id'], 'dose_id' => $request['dose_id'], 'estrategia_id' => $request['estrategia_id'], 'cid_id' => $request['cid_id'], 'campanha_id' => $request['campanha_id'], 'data_aplicacao' => Carbon::createFromFormat('d/m/Y', $request['data_aplicacao']), 'comunicante_hanseniase' => $request['comunicante_hanseniase'], 'gestante' => $request['gestante'], 'puerpera' => $request['puerpera'], 'imunizacao_advertida' => $request['imunizacao_advertida'], 'viajante' => $request['viajante'], 'ultimo_frasco' => $request['ultimo_frasco'], 'observacao' => $request['observacao'], ]); }); } public static function show($id) { return Campanha::find($id); } public static function datatable() { return DB::table('imunizacao_campanha') ->select([ 'imunizacao_campanha.id', 'imunizacao_campanha.nome', DB::raw("DATE_FORMAT(imunizacao_campanha.periodo_de, '%d/%m/%Y') AS periodo_de"), DB::raw("DATE_FORMAT(imunizacao_campanha.periodo_ate, '%d/%m/%Y') AS periodo_ate"), '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" ), ]) ->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_campanha.vacina_id') ->whereRaw('imunizacao_campanha.periodo_de <= CURRENT_DATE') ->whereRaw('imunizacao_campanha.periodo_ate >= CURRENT_DATE'); } 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 'lotes': return self::getLotes(request()->get('sala_vacinacao_id'), request()->get('vacina_id')); break; case 'produtores': return self::getProdutores(request()->get('sala_vacinacao_id'), request()->get('vacina_id'), request()->get('lote'), request()->get('data_validade_lote')); break; default: return []; break; } } private static function validate($request) { return $request->validate([ 'campanha_id' => [ 'required', 'integer', 'exists:\App\Models\Imunizacao\Campanha,id', ], 'paciente_id' => [ 'required', 'integer', 'exists:\App\Models\Cadastro\SujeitoAtencao\Paciente,id', ], 'sala_vacinacao_id' => [ 'required', 'integer', 'exists:\App\Models\Imunizacao\SalaVacinacao,id', ], 'aplicador_id' => [ 'required', 'integer', 'exists:\App\Models\Cadastro\SujeitoAtencao\Usuario,id', ], 'vacina_id' => [ 'required', 'integer', 'exists:\App\Models\Cadastro\Vacina,id', ], 'grupo_atendimento_id' => [ 'required', 'integer', 'exists:\App\Models\Imunizacao\GrupoAtendimento,id', ], 'dose_id' => [ 'required', 'integer', 'exists:\App\Models\Imunizacao\Dose,id', ], 'estrategia_id' => [ 'required', 'integer', 'exists:\App\Models\Imunizacao\Estrategia,id', ], 'cid_id' => [ 'nullable', 'integer', ], 'data_aplicacao' => [ 'required', 'date_format:d/m/Y', 'before_or_equal:now', ], 'lote' => [ 'required', 'string', ], 'data_validade_lote' => [ 'required', 'date', ], 'comunicante_hanseniase' => [ 'required', 'boolean', ], 'gestante' => [ 'required', 'boolean', ], 'puerpera' => [ 'required', 'boolean', ], 'imunizacao_advertida' => [ 'required', 'boolean', ], 'viajante' => [ 'required', 'boolean', ], 'observacao' => [ 'nullable', 'string', 'between:1,5000', ], ]); } private static function getAdditionalsData() { return [ 'data_atual' => Carbon::now()->format('Y-m-d'), 'parametrizacao' => self::getParametrizacao(), 'sala_vacinacao_logada' => self::getSalaVacinacaoLogada(), ]; } private static function getFormData($campanha) { $salaVacinacaoLogada = self::getSalaVacinacaoLogada(); $unidades = self::getUnidades(); $salasVacinacao = self::getSalasVacinacao($salaVacinacaoLogada->unidade_id ?? null); return [ 'unidades' => $unidades, 'salas_vacinacao' => $salasVacinacao, 'lotes' => self::getLotes($salaVacinacaoLogada->id ?? null, $campanha->vacina_id) ?? [], 'doses' => [], 'produtores' => [], 'grupos_atendimento' => self::getGruposAtendimento(), 'estrategias' => [], ]; } private static function getModelData($campanha, $form) { $salaVacinacaoLogada = self::getSalaVacinacaoLogada(); return [ 'paciente' => null, 'unidade_id' => $salaVacinacaoLogada && $salaVacinacaoLogada->permite_aplicacao ? $salaVacinacaoLogada->unidade_id : null, 'sala_vacinacao_id' => $salaVacinacaoLogada && $salaVacinacaoLogada->permite_aplicacao ? $salaVacinacaoLogada->id : null, 'aplicador' => null, 'data_aplicacao' => Carbon::now()->format('Y-m-d'), 'vacina' => [ 'id' => $campanha->vacina_id, 'nome' => $campanha->vacina->nome, 'abreviacao' => $campanha->vacina->abreviacao, 'sigla' => $campanha->vacina->sigla, 'sigla_nome' => $campanha->vacina->sigla . ' - ' . $campanha->vacina->nome, 'sigla_abreviacao' => $campanha->vacina->sigla . ' - ' . $campanha->vacina->abreviacao, 'abreviacao_nome' => $campanha->vacina->abreviacao . ' - ' . $campanha->vacina->nome, 'sigla_abreviacao_nome' => $campanha->vacina->sigla . ' - ' . $campanha->vacina->abreviacao . ' - ' . $campanha->vacina->nome, ], 'lote' => null, 'produtor_id' => null, 'grupo_atendimento_id' => GrupoAtendimento::POPULACAO_GERAL, 'dose_id' => null, 'estrategia_id' => null, 'cid_id' => null, 'comunicante_hanseniase' => false, 'gestante' => false, 'puerpera' => false, 'imunizacao_advertida' => false, 'viajante' => false, 'observacao' => null, ]; } public static function getPaciente($id) { $paciente = DB::table('cadastro_paciente') ->select([ 'cadastro_cidadao.data_nascimento AS cidadao_data_nascimento', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->whereNull('cadastro_paciente.deleted_at') ->where('cadastro_paciente.id', $id) ->first(); return [ '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'), ]; } private 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', ]) ->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(); } private static function getParametrizacao() { return DB::table('imunizacao_parametrizacao') ->select([ 'parametrizacao_descricao_vacina_id', 'perfil_campanha', 'usa_ultimo_frasco', 'aprazamento_dias_antes', 'aprazamento_dias_depois', 'aprazamento_ativo', ]) ->first(); } private static function getUnidades() { $salaVacinacaoLogada = self::getSalaVacinacaoLogada(); $unidades = DB::table('cadastro_unidade') ->select([ 'id', 'nome_fantasia', ]) ->when($salaVacinacaoLogada && $salaVacinacaoLogada->responsavel == false, function ($query) use ($salaVacinacaoLogada) { $query->where('id', $salaVacinacaoLogada->unidade_id); }) ->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); }); 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 getLotes($salaVacinacaoId, $vacinaId) { return DB::table('imunizacao_entrada_vacina') ->select([ '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 ') ->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', ]) ->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(); } }