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.abreviacao AS vacina_abreviacao', 'cadastro_vacina.nome AS vacina_nome', 'imunizacao_produtor.nome AS produtor_nome', '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(imunizacao_saida_vacina.quantidade) FROM imunizacao_saida_vacina WHERE imunizacao_saida_vacina.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($params->unidade_id, fn ($q, $unidadeId) => $q->where('cadastro_unidade.id', $unidadeId)) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('cadastro_infraestrutura.id', $infraestruturaId)) ->groupBy([ 'cadastro_unidade.nome_fantasia', DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)"), 'cadastro_vacina.sigla', 'cadastro_vacina.abreviacao', 'cadastro_vacina.nome', 'imunizacao_entrada_vacina.lote', DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y')"), ]) ->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() ->map(function($query) use ($parametrizacao) { switch($parametrizacao->parametrizacao_descricao_vacina_id ?? null) { case ParametrizacaoDescricaoVacina::DESCRICAO: $query->vacina = $query->vacina_nome; break; case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA: $query->vacina = $query->vacina_abreviacao; break; case ParametrizacaoDescricaoVacina::SIGLA: $query->vacina = $query->vacina_sigla; break; case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO: $query->vacina = "$query->vacina_sigla - $query->vacina_nome"; break; case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA: $query->vacina = "$query->vacina_sigla - $query->vacina_abreviacao"; break; case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO: $query->vacina = "$query->vacina_abreviacao - $query->vacina_nome"; break; case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO: $query->vacina = "$query->vacina_sigla - $query->vacina_abreviacao - $query->vacina_nome"; break; default: $query->vacina = $query->vacina_nome; break; } return $query; }); } public static function create() { return [ 'form' => [ 'unidades' => self::getUnidades(), 'infraestruturas' => [], ], 'model' => [ 'unidade_id' => null, 'infraestrutura_id' => null, ], ]; } public static function list() { $params = self::getParams(); switch (request()->listar) { case 'unidades': { return ['unidades' => self::getUnidades($params)]; } case 'infraestruturas': { return ['infraestruturas' => self::getInfraestruturas($params)]; } } } public static function getPrintData() { $unidade = Unidade::find(request()->get('unidade_id')); $infraestrutura = Infraestrutura::find(request()->get('infraestrutura_id')); return [ 'unidade_nome_fantasia' => $unidade->nome_fantasia ?? 'Todas', 'infraestrutura_nome' => $infraestrutura->nome ?? 'Todos', 'itens' => self::index(), 'colunas' => collect(request()->selected_cols), ]; } private static function getParams() { return (object) [ 'unidade_id' => request()->get('unidade_id'), 'infraestrutura_id' => request()->get('infraestrutura_id'), ]; } private static function getUnidades() { return DB::table('cadastro_unidade') ->select([ 'cadastro_unidade.id', 'cadastro_unidade.nome_fantasia', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('imunizacao_entrada_vacina') ->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') ->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id') ) ->orderBy('cadastro_unidade.nome_fantasia') ->get(); } private static function getInfraestruturas($params) { return DB::table('cadastro_infraestrutura') ->select([ 'cadastro_infraestrutura.id', DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome"), ]) ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('cadastro_infraestrutura.unidade_id', $params->unidade_id) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('imunizacao_entrada_vacina') ->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id') ->whereColumn('imunizacao_sala_vacinacao.infraestrutura_id', 'cadastro_infraestrutura.id') ) ->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)') ->get(); } }