185 lines
8.4 KiB
PHP
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();
|
|
}
|
|
}
|