self::getAdditionalsData(), ]; } public static function create() { $entrada = null; if (request()->get('tipo_movimentacao') === 'estorno') { $entrada = Entrada::find(request()->get('entrada_id')); } return [ 'additionals' => self::getAdditionalsData(), 'form' => self::getFormData($entrada), 'model' => self::getModelData($entrada), ]; } public static function store($request) { self::validate($request); if ($request['tipo_movimentacao'] === 'entrada') { DB::transaction(function() use ($request) { $entrada = Entrada::create([ 'tipo_id' => EntradaTipo::MANUAL, 'sala_vacinacao_id' => $request['sala_vacinacao_id'], 'data_entrada' => Carbon::createFromFormat('d/m/Y', $request['data_entrada']), 'origem' => $request['origem'], ]); $vacinas = []; foreach ($request->get('vacinas') as $vacina) { $vacinas[] = [ 'vacina_id' => $vacina['vacina_id'], 'produtor_id' => $vacina['produtor_id'], 'apresentacao_id' => $vacina['apresentacao_id'], 'quantidade' => $vacina['quantidade'], 'lote' => $vacina['lote'], 'data_validade_lote' => Carbon::createFromFormat('d/m/Y', $vacina['data_validade_lote']), ]; } $entrada->vacinas()->createMany($vacinas); }); } else if ($request['tipo_movimentacao'] === 'estorno') { DB::transaction(function() use ($request) { $saida = Saida::create([ 'sala_vacinacao_id' => $request->sala_vacinacao_id, 'tipo_id' => SaidaTipo::ESTORNO, 'data_saida' => Carbon::now()->format('Y-m-d'), ]); foreach ($request['vacinas'] as $entradaVacinaId) { $entradaVacina = EntradaVacina::findOrFail($entradaVacinaId); $saida->vacinas()->create([ 'entrada_vacina_id' => $entradaVacina->id, 'vacina_id' => $entradaVacina->vacina_id, 'quantidade' => $entradaVacina->quantidade, ]); } }); } } public static function datatable() { $salaVacinacaoLogada = self::getSalaVacinacaoLogada(); $datatable = DB::table('imunizacao_entrada') ->select([ 'imunizacao_entrada.id', 'cadastro_unidade.nome_fantasia AS unidade_nome', DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS infraestrutura_nome"), DB::raw("DATE_FORMAT(imunizacao_entrada.data_entrada, '%d/%m/%Y') AS data_entrada"), 'imunizacao_entrada.origem', ]) ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('imunizacao_entrada.tipo_id', EntradaTipo::MANUAL) ->where('imunizacao_sala_vacinacao.ativo', true) ->whereExists(function ($query) { $query->select(DB::raw(1)) ->from('imunizacao_entrada_vacina') ->whereColumn('imunizacao_entrada_vacina.entrada_id', 'imunizacao_entrada.id') ->whereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('imunizacao_saida_vacina') ->whereColumn('imunizacao_saida_vacina.entrada_vacina_id', 'imunizacao_entrada_vacina.id'); }); }); if ($salaVacinacaoLogada && !$salaVacinacaoLogada->responsavel) { $datatable->where('imunizacao_sala_vacinacao.id', $salaVacinacaoLogada->id); } return $datatable; } public static function list() { switch (request()->get('listar')) { case 'salas_vacinacao': return self::getSalasVacinacao(request()->get('unidade_id')); break; case 'produtores': return self::getProdutores(request()->get('vacina_id')); break; case 'apresentacoes': return self::getApresentacoes(request()->get('vacina_id'), request()->get('produtor_id')); break; case 'produtores_e_apresentacoes': return self::getProdutoresEApresentacoes(); break; } } private static function validate($request) { $rules = []; switch (request()->get('tipo_movimentacao')) { case 'entrada': $rules = [ 'sala_vacinacao_id' => [ 'required', 'integer', 'exists:\App\Models\Imunizacao\SalaVacinacao,id', ], 'data_entrada' => [ 'required', 'date_format:d/m/Y', 'before_or_equal:now', ], 'origem' => [ 'required', 'string', 'between:3,100', ], 'vacinas.*.vacina_id' => [ 'required', 'integer', 'exists:\App\Models\Cadastro\Vacina,id', ], 'vacinas.*.produtor_id' => [ 'required', 'integer', 'exists:\App\Models\Imunizacao\Produtor,id', ], 'vacinas.*.apresentacao_id' => [ 'required', 'integer', 'exists:\App\Models\Imunizacao\Apresentacao,id', ], 'vacinas.*.quantidade' => [ 'required', 'integer', 'between:1,99999999', ], 'vacinas.*.lote' => [ 'required', 'string', 'between:1,30', ], 'vacinas.*.data_validade_lote' => [ 'required', 'date_format:d/m/Y', 'after_or_equal:data_entrada', ], ]; break; case 'estorno': $rules = [ 'sala_vacinacao_id' => [ 'required', 'integer', 'exists:\App\Models\Imunizacao\SalaVacinacao,id', ], 'vacinas' => [ 'required', 'array', ], ]; break; } return $request->validate($rules); } 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($entrada = null) { $response = []; switch (request()->get('tipo_movimentacao')) { case 'entrada': $response = [ 'unidades' => self::getUnidades(), 'salas_vacinacao' => self::getSalasVacinacao(auth()->payload()->get('unidade_id')), 'produtores' => [], 'apresentacoes' => [], ]; break; case 'estorno': $response = [ 'unidades' => self::getUnidades(), 'salas_vacinacao' => self::getSalasVacinacao($entrada->salaVacinacao->infraestrutura->unidade_id), ]; break; } return $response; } private static function getModelData($entrada = null) { $response = []; switch (request()->get('tipo_movimentacao')) { case 'entrada': $response = [ 'id' => null, 'unidade_id' => auth()->payload()->get('unidade_id'), 'sala_vacinacao_id' => self::getSalaVacinacaoLogada()->id ?? null, 'data_entrada' => null, 'origem' => null, 'vacinas' => [], ]; break; case 'estorno': $response = [ 'unidade_id' => $entrada->salaVacinacao->infraestrutura->unidade_id, 'sala_vacinacao_id' => $entrada->sala_vacinacao_id, 'vacinas' => self::getEntradasVacina($entrada->id)->map(function($query) { return [ 'id' => $query->id, 'selecionada' => false, 'vacina_nome' => $query->vacina_nome, 'vacina_abreviacao' => $query->vacina_abreviacao, 'vacina_sigla' => $query->vacina_sigla, 'vacina_sigla_nome' => $query->vacina_sigla . ' - ' . $query->vacina_nome, 'vacina_sigla_abreviacao' => $query->vacina_sigla . ' - ' . $query->vacina_abreviacao, 'vacina_abreviacao_nome' => $query->vacina_abreviacao . ' - ' . $query->vacina_nome, 'vacina_sigla_abreviacao_nome' => $query->vacina_sigla . ' - ' . $query->vacina_abreviacao . ' - ' . $query->vacina_nome, 'quantidade' => $query->quantidade, 'lote' => $query->lote, 'data_validade_lote' => $query->data_validade_lote, ]; }), ]; break; } return $response; } private static function getSalaVacinacaoLogada() { return DB::table('imunizacao_sala_vacinacao') ->select([ 'imunizacao_sala_vacinacao.id', 'cadastro_infraestrutura.unidade_id', 'imunizacao_sala_vacinacao.responsavel', ]) ->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 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); }); if ($salaVacinacaoLogada && $salaVacinacaoLogada->responsavel === false) { $unidades->where('id', auth()->payload()->get('unidade_id')); } 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"), ]) ->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('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 getParametrizacao() { return DB::table('imunizacao_parametrizacao') ->select([ 'parametrizacao_descricao_vacina_id', ]) ->first(); } private static function getProdutores($vacinaId) { return DB::table('imunizacao_produtor') ->select([ 'id', 'nome' ]) ->whereExists(function ($query) use ($vacinaId) { $query->select(DB::raw(1)) ->from('imunizacao_vacina_produtor_apresentacao') ->whereColumn('imunizacao_vacina_produtor_apresentacao.produtor_id', 'imunizacao_produtor.id') ->where('imunizacao_vacina_produtor_apresentacao.vacina_id', $vacinaId); }) ->orderBy('nome') ->get(); } private static function getApresentacoes($vacinaId, $produtorId) { return DB::table('imunizacao_apresentacao') ->select([ 'id', 'nome' ]) ->whereExists(function ($query) use ($vacinaId, $produtorId) { $query->select(DB::raw(1)) ->from('imunizacao_vacina_produtor_apresentacao') ->whereColumn('imunizacao_vacina_produtor_apresentacao.apresentacao_id', 'imunizacao_apresentacao.id') ->where('imunizacao_vacina_produtor_apresentacao.vacina_id', $vacinaId) ->where('imunizacao_vacina_produtor_apresentacao.produtor_id', $produtorId); }) ->orderBy('id') ->get(); } private static function getProdutoresEApresentacoes() { return [ 'produtores' => DB::table('imunizacao_produtor') ->select([ 'id', 'nome' ]) ->orderBy('nome') ->get(), 'apresentacoes' => DB::table('imunizacao_apresentacao') ->select([ 'id', 'nome' ]) ->orderBy('id') ->get(), ]; } private static function getEntradasVacina($entradaId) { return DB::table('imunizacao_entrada_vacina') ->select([ 'imunizacao_entrada_vacina.id', 'cadastro_vacina.nome AS vacina_nome', 'cadastro_vacina.abreviacao AS vacina_abreviacao', 'cadastro_vacina.sigla AS vacina_sigla', 'imunizacao_entrada_vacina.quantidade', 'imunizacao_entrada_vacina.lote', DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS data_validade_lote"), ]) ->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_entrada_vacina.vacina_id') ->whereNotExists(function ($query) { $query->select(DB::raw(1)) ->from('imunizacao_saida_vacina') ->whereColumn('imunizacao_saida_vacina.entrada_vacina_id', 'imunizacao_entrada_vacina.id'); }) ->where('entrada_id', $entradaId) ->get(); } }