[ 'vacina_id' => null, 'unidade_id' => null ], 'form' => [ 'vacinas' => self::getVacinas(), 'unidades' => self::getUnidades() ], 'additionals' => [ 'parametrizacao' => self::getParametrizacao() ] ]; } private static function getParametrizacao() { $parametrizacao = Parametrizacao::first(); return [ 'parametrizacaoDescricaoVacinaId' => $parametrizacao->parametrizacao_descricao_vacina_id ]; } public static function list() { return $entradas = DB::table('imunizacao_entrada_vacina as imunizacao_entrada_vacina') ->select([ 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"), 'cadastro_vacina.sigla AS vacina_sigla', 'cadastro_vacina.id AS vacina_id', 'cadastro_vacina.abreviacao AS vacina_abreviacao', 'cadastro_vacina.nome AS vacinaNome', 'imunizacao_apresentacao.nome AS apresentacao_nome', 'imunizacao_entrada_vacina.lote AS entrada_vacina_lote', DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS entrada_vacina_data_validade_lote"), DB::raw(" SUM(imunizacao_entrada_vacina.quantidade - COALESCE(( SELECT SUM(isv.quantidade) FROM imunizacao_saida_vacina isv WHERE isv.entrada_vacina_id = imunizacao_entrada_vacina.id ), 0)) AS estoque ") ]) ->join('cadastro_vacina', 'cadastro_vacina.id', '=', 'imunizacao_entrada_vacina.vacina_id') ->join('imunizacao_produtor', 'imunizacao_produtor.id', '=', 'imunizacao_entrada_vacina.produtor_id') ->join('imunizacao_apresentacao', 'imunizacao_apresentacao.id', '=', 'imunizacao_entrada_vacina.apresentacao_id') ->join('imunizacao_entrada', 'imunizacao_entrada.id', '=', 'imunizacao_entrada_vacina.entrada_id') ->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') ->when(request()->unidade_id, fn($q) => $q->where('cadastro_unidade.id', request()->unidade_id)) ->when(request()->vacina_id, fn($q) => $q->where('imunizacao_entrada_vacina.vacina_id', request()->vacina_id)) ->groupBy([ 'cadastro_vacina.id', 'imunizacao_entrada_vacina.lote', ]) ->havingRaw('estoque > 0') ->orderBy('imunizacao_entrada_vacina.lote') ->get()->groupBy('vacina_id') ->map(function ($itensVacina) { $primeiroItem = $itensVacina->first(); $estoqueTotal = $itensVacina->sum('estoque'); $lotes = $itensVacina->pluck('entrada_vacina_lote')->unique()->implode(', '); $validades = $itensVacina->pluck('entrada_vacina_data_validade_lote')->unique()->implode(', '); return [ 'vacina_id' => $primeiroItem->vacina_id, 'vacina_nome' => $primeiroItem->vacinaNome, 'vacina_abreviacao' => $primeiroItem->vacina_abreviacao, 'vacina_sigla' => $primeiroItem->vacina_sigla, 'unidade_nome_fantasia' => $primeiroItem->unidade_nome_fantasia, 'infraestrutura_nome' => $primeiroItem->infraestrutura_nome, 'apresentacao_nome' => $itensVacina->pluck('apresentacao_nome')->unique()->implode(', '), 'entrada_vacina_lote' => $lotes, 'entrada_vacina_data_validade_lote' => $validades, 'vacina_sigla_nome' => "$primeiroItem->vacina_sigla - $primeiroItem->vacinaNome", 'vacina_sigla_abreviacao' => "$primeiroItem->vacina_sigla - $primeiroItem->vacina_abreviacao", 'vacina_abreviacao_nome' => "$primeiroItem->vacina_abreviacao - $primeiroItem->vacinaNome", 'vacina_sigla_abreviacao_nome' => "$primeiroItem->vacina_sigla - $primeiroItem->vacina_abreviacao - $primeiroItem->vacinaNome", 'estoque' => (int) $estoqueTotal, ]; }) ->values(); } public static function getEstoque() { $entradas = DB::table('imunizacao_entrada_vacina as imunizacao_entrada_vacina') ->select([ 'imunizacao_entrada_vacina.lote', DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') as validade"), DB::raw("SUM(imunizacao_entrada_vacina.quantidade - COALESCE( (SELECT SUM(isv.quantidade) FROM imunizacao_saida_vacina isv WHERE isv.entrada_vacina_id = imunizacao_entrada_vacina.id ), 0)) as estoque"), 'cu.id as unidade_id', 'cu.nome_fantasia as unidade' ]) ->join('imunizacao_entrada as ie', 'ie.id', '=', 'imunizacao_entrada_vacina.entrada_id') ->join('imunizacao_sala_vacinacao as isv', 'isv.id', '=', 'ie.sala_vacinacao_id') ->join('cadastro_infraestrutura as ci', 'ci.id', '=', 'isv.infraestrutura_id') ->join('cadastro_unidade as cu', 'cu.id', '=', 'ci.unidade_id') ->where('imunizacao_entrada_vacina.vacina_id', request()->vacina_id) ->when(request()->unidade_id, function($query) { $query->where('cu.id', request()->unidade_id); }) ->groupBy([ 'imunizacao_entrada_vacina.lote', DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y')"), 'cu.id', 'cu.nome_fantasia' ]) ->havingRaw('estoque > 0') ->orderBy('imunizacao_entrada_vacina.lote') ->get() ->map(function($item) { $item->estoque = (int)$item->estoque; return $item; }); $vacina = Vacina::find(request()->vacina_id); $vacina_nome = $vacina->nome; $vacina_sigla = $vacina->sigla; $vacina_abreviacao = $vacina->abreviacao; return [ 'entradas' => $entradas, '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", 'total' => $entradas->sum('estoque') ]; } private static function getVacinas() { return EntradaVacina::with('vacina') ->groupBy('vacina_id') ->get() ->map(function($entrada_vacina) { $vacina_nome = $entrada_vacina->vacina->nome; $vacina_sigla = $entrada_vacina->vacina->sigla; $vacina_abreviacao = $entrada_vacina->vacina->abreviacao; return [ 'vacina_id' => $entrada_vacina->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", ]; }); } public static function getUnidades() { return EntradaVacina::with('entrada.salaVacinacao.infraestrutura.unidade') ->when(request()->vacina_id, function($query) { $query->where('vacina_id', request()->vacina_id); }) ->get() ->groupBy('entrada.salaVacinacao.infraestrutura.unidade_id') ->map(function($entrada_vacina) { return [ 'id' => $entrada_vacina[0]->entrada->salaVacinacao->infraestrutura->unidade_id ?? null, 'nome_fantasia' => $entrada_vacina[0]->entrada->salaVacinacao->infraestrutura->unidade->nome_fantasia ?? null ]; }); } }