This commit is contained in:
@@ -0,0 +1,258 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Almoxarifado\Relatorios;
|
||||
|
||||
use App\Models\Cadastro\Estabelecimento\CentroCusto;
|
||||
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
|
||||
use App\Models\Cadastro\Estabelecimento\Unidade;
|
||||
use App\Models\Cadastro\Grupo\Grupo;
|
||||
use App\Models\Cadastro\Material\Material;
|
||||
use App\Models\Cadastro\Subgrupo\Subgrupo;
|
||||
use App\Services\Cadastro\Material\MaterialService;
|
||||
use App\Services\Service;
|
||||
use App\Utils\DataUtil;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class ValidadeMaterialService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
$totalizadores = (object) ['quantidade' => 0];
|
||||
|
||||
$validadeMaterialBuilder = DB::table('almoxarifado_entrada_item')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_entrada.centro_custo_id')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_material', 'cadastro_material.id', 'almoxarifado_entrada_item.material_id')
|
||||
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
|
||||
->join('cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id')
|
||||
->leftJoin(
|
||||
'cadastro_unidade_medida as apresentacao_unidade_medida',
|
||||
'apresentacao_unidade_medida.id',
|
||||
'cadastro_material.apresentacao_unidade_medida_id'
|
||||
)
|
||||
->leftJoin('cadastro_subgrupo', 'cadastro_subgrupo.id', 'cadastro_material.subgrupo_id')
|
||||
->whereNull('almoxarifado_entrada_item.estornado_em')
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->whereNotNull('almoxarifado_entrada_item.lote')
|
||||
->when(request()->periodo['start'], fn ($q, $data) => $q
|
||||
->where('almoxarifado_entrada_item.validade_lote', '>=', Carbon::createFromFormat('d/m/Y', $data)
|
||||
->setTime(0, 0, 0))
|
||||
)
|
||||
->when(request()->periodo['end'], fn ($q, $data) => $q
|
||||
->where('almoxarifado_entrada_item.validade_lote', '<=', Carbon::createFromFormat('d/m/Y', $data)
|
||||
->setTime(23, 59, 59))
|
||||
)
|
||||
->when(request()->query('unidade_id'), fn ($q, $id) => $q->where('cadastro_infraestrutura.unidade_id', $id))
|
||||
->when(request()->query('infraestrutura_id'), fn ($q, $id) => $q->where('cadastro_infraestrutura.id', $id))
|
||||
->when(request()->query('centro_custo_id'), fn ($q, $id) => $q->where('cadastro_centro_custo.id', $id))
|
||||
->when(request()->query('grupo_id'), fn ($q, $id) => $q->where('cadastro_grupo.id', $id))
|
||||
->when(request()->query('subgrupo_id'), fn ($q, $id) => $q->where('cadastro_subgrupo.id', $id))
|
||||
->when(request()->query('material_id'), fn ($q, $id) => $q->where('cadastro_material.id', $id))
|
||||
->when(request()->query('situacao'), fn ($q, $situacao) => $q
|
||||
->whereRaw("IF((DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1) > 0, 1, 2) = {$situacao}")
|
||||
)
|
||||
->groupBy(
|
||||
'cadastro_material.id',
|
||||
'cadastro_material.codigo_material',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
)),
|
||||
'almoxarifado_entrada_item.lote',
|
||||
'almoxarifado_entrada_item.validade_lote',
|
||||
'cadastro_grupo.nome',
|
||||
'cadastro_subgrupo.nome',
|
||||
DB::raw("DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1")
|
||||
)
|
||||
->select(
|
||||
'cadastro_material.id',
|
||||
'cadastro_material.codigo_material',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
) . " AS descricao"),
|
||||
'almoxarifado_entrada_item.lote',
|
||||
DB::raw("almoxarifado_entrada_item.validade_lote AS validade"),
|
||||
DB::raw("IF((DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1) > 0, 'A Vencer', 'Vencido') AS situacao"),
|
||||
'cadastro_grupo.nome AS grupo',
|
||||
'cadastro_subgrupo.nome AS subgrupo',
|
||||
DB::raw("DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1 AS tempo_validade"),
|
||||
DB::raw("COALESCE(SUM(
|
||||
COALESCE(almoxarifado_entrada_item.quantidade, 0)
|
||||
-
|
||||
COALESCE((
|
||||
SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida)
|
||||
FROM almoxarifado_saida_item_entrada_item
|
||||
JOIN almoxarifado_saida_item
|
||||
ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id
|
||||
JOIN almoxarifado_saida
|
||||
ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id
|
||||
WHERE almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id
|
||||
AND almoxarifado_saida.finalizada = 1
|
||||
), 0)
|
||||
), 0) AS estoque")
|
||||
);
|
||||
|
||||
self::setOrderBy($validadeMaterialBuilder);
|
||||
|
||||
$validadeMaterialBuilder->havingRaw('estoque > 0');
|
||||
|
||||
$entradasItens = $validadeMaterialBuilder->get();
|
||||
|
||||
$totalizadores = [
|
||||
'total' => $entradasItens->sum('estoque'),
|
||||
];
|
||||
|
||||
return ['entradas_itens' => $entradasItens, 'totalizadores' => $totalizadores];
|
||||
}
|
||||
|
||||
private static function setOrderBy($builder)
|
||||
{
|
||||
|
||||
if (is_null(request()->sortBy)) {
|
||||
|
||||
$builder->orderBy('almoxarifado_entrada_item.id');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$columns = [
|
||||
'validade' => 'almoxarifado_entrada_item.validade_lote',
|
||||
'codigo_material' => 'cadastro_material.codigo_material',
|
||||
'descricao' => MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
),
|
||||
'lote' => 'almoxarifado_entrada_item.lote',
|
||||
'tempo_validade' => DB::raw("DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1"),
|
||||
'situacao' => DB::raw("IF((DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1) > 0, 'A Vencer', 'Vencido')"),
|
||||
'estoque' => DB::raw("COALESCE(SUM(
|
||||
COALESCE(almoxarifado_entrada_item.quantidade, 0)
|
||||
-
|
||||
COALESCE((
|
||||
SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida)
|
||||
FROM almoxarifado_saida_item_entrada_item
|
||||
JOIN almoxarifado_saida_item
|
||||
ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id
|
||||
JOIN almoxarifado_saida
|
||||
ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id
|
||||
WHERE almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id
|
||||
AND almoxarifado_saida.finalizada = 1
|
||||
), 0)
|
||||
), 0)"),
|
||||
'grupo' => 'cadastro_grupo.nome',
|
||||
'subgrupo' => 'cadastro_subgrupo.nome'
|
||||
];
|
||||
|
||||
$column = $columns[request()->sortBy];
|
||||
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC';
|
||||
|
||||
$builder->orderByRaw("{$column} {$direction}, almoxarifado_entrada_item.id");
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
|
||||
$now = Carbon::now();
|
||||
$dataAtual = $now->format('d/m/Y');
|
||||
$dataValidade = $now->addDays(90)->format('d/m/Y');
|
||||
$currentLotacao = self::getCurrentLotacao();
|
||||
|
||||
return [
|
||||
'additionals' => [],
|
||||
'form' => [
|
||||
'data_atual' => request()->dispensacao == 'true' ? $dataAtual : null,
|
||||
'data_validade' => request()->dispensacao == 'true' ? $dataValidade : null,
|
||||
'unidades' => Unidade::orderBy('nome_fantasia')
|
||||
->whereHas('infraestruturas', function ($query) {
|
||||
|
||||
$query->whereHas('centrosCusto');
|
||||
})
|
||||
->get()
|
||||
->map(fn ($unidade) => [
|
||||
'id' => $unidade->id,
|
||||
'nome_fantasia' => $unidade->nome_fantasia,
|
||||
'infraestruturas' => $unidade->infraestruturas()
|
||||
->whereHas('centrosCusto')
|
||||
->get()
|
||||
->sortBy('nome')
|
||||
->map(fn ($infraestrutura) => [
|
||||
'id' => $infraestrutura->id,
|
||||
'nome' => $infraestrutura->nome,
|
||||
'centros_custo' => $infraestrutura->centrosCusto()
|
||||
->get()
|
||||
->map(fn ($centroCusto) => [
|
||||
'id' => $centroCusto->id,
|
||||
'setor_nome' => $centroCusto->setor->nome,
|
||||
])
|
||||
->sortBy('setor_nome')
|
||||
->values()
|
||||
])
|
||||
->values()
|
||||
]),
|
||||
'grupos' => Grupo::orderBy('nome')
|
||||
->get()
|
||||
->map(fn ($grupo) => [
|
||||
'id' => $grupo->id,
|
||||
'nome' => $grupo->nome,
|
||||
'subgrupos' => $grupo->subgrupos()->orderBy('nome')->get(['id', 'nome'])
|
||||
]),
|
||||
'situacoes' => [
|
||||
['text' => 'A vencer', 'value' => '1'],
|
||||
['text' => 'Vencido', 'value' => '2'],
|
||||
],
|
||||
],
|
||||
'model' => [
|
||||
'periodo' => [
|
||||
'start' => null,
|
||||
'end' => null,
|
||||
],
|
||||
'unidade_id' => request()->dispensacao == 'true' ? $currentLotacao->infraestrutura->unidade->id : null,
|
||||
'infraestrutura_id' => null,
|
||||
'centro_custo_id' => null,
|
||||
'grupo_id' => null,
|
||||
'subgrupo_id' => null,
|
||||
'material' => null,
|
||||
'situacao' => null,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public static function getPrintExportData()
|
||||
{
|
||||
$resultado = self::index();
|
||||
$itens = $resultado['entradas_itens'];
|
||||
|
||||
$itens->each(function ($item) {
|
||||
|
||||
$item->validade = (new Carbon($item->validade))->format('d/m/Y');
|
||||
$item->situacao = $item->tempo_validade > 0 ? 'A vencer' : 'Vencido';
|
||||
});
|
||||
|
||||
$unidade = Unidade::find(request()->unidade_id);
|
||||
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
|
||||
$centroCusto = CentroCusto::find(request()->centro_custo_id);
|
||||
$grupo = Grupo::find(request()->grupo_id);
|
||||
$subgrupo = Subgrupo::find(request()->subgrupo_id);
|
||||
$material = Material::find(request()->material_id);
|
||||
|
||||
return [
|
||||
'inicio' => request()->periodo['start'],
|
||||
'fim' => request()->periodo['end'],
|
||||
'unidade' => $unidade->nome_fantasia ?? 'Todas',
|
||||
'infraestrutura' => $infraestrutura->nome ?? 'Todas',
|
||||
'setor' => $centroCusto->setor->nome ?? 'Todos',
|
||||
'grupo' => $grupo->nome ?? 'Todos',
|
||||
'subgrupo' => $subgrupo->nome ?? 'Todos',
|
||||
'material' => $material->descricao_completa ?? 'Todos',
|
||||
'colunas' => collect(request()->selectedCols),
|
||||
'itens' => $itens,
|
||||
'totalizadores' => $resultado['totalizadores'],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user