This commit is contained in:
184
api/app/Services/Imunizacao/RelatorioPosicaoEstoqueService.php
Normal file
184
api/app/Services/Imunizacao/RelatorioPosicaoEstoqueService.php
Normal file
@@ -0,0 +1,184 @@
|
||||
<?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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user