This commit is contained in:
200
api/app/Services/Imunizacao/ConsultaEstoqueService.php
Normal file
200
api/app/Services/Imunizacao/ConsultaEstoqueService.php
Normal file
@@ -0,0 +1,200 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Imunizacao;
|
||||
|
||||
use App\Models\Cadastro\Vacina;
|
||||
use App\Models\Imunizacao\EntradaVacina;
|
||||
use App\Models\Imunizacao\Parametrizacao;
|
||||
use App\Models\Imunizacao\SaidaVacina;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class ConsultaEstoqueService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
return [
|
||||
'model' => [
|
||||
'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
|
||||
];
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user