Files
rkm-conectasus-ci-sandbox/api/app/Services/Imunizacao/RelatorioPosicaoEstoqueService.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

185 lines
8.4 KiB
PHP

<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Imunizacao\Parametrizacao;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
class RelatorioPosicaoEstoqueService extends Service
{
public static function index()
{
$params = self::getParams();
$parametrizacao = Parametrizacao::first();
return DB::table('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.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();
}
}