init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,474 @@
<?php
namespace App\Services\PortalDivulgacao;
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 Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class PosicaoEstoqueService extends Service
{
public static function index()
{
$materiais = collect();
DB::table('cadastro_material')
->select([
'cadastro_material.id AS material_id',
'cadastro_material.codigo_material AS material_codigo',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " AS material_descricao"),
'cadastro_apresentacao.nome AS apresentacao',
'unidade.id AS unidade_id',
'unidade.nome_fantasia AS unidade_nome',
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 quantidade
"),
])
->join('almoxarifado_parametrizacao_portal_divulgacao_item', 'almoxarifado_parametrizacao_portal_divulgacao_item.material_id', 'cadastro_material.id')
->join('almoxarifado_parametrizacao_portal_divulgacao_grupo', 'almoxarifado_parametrizacao_portal_divulgacao_grupo.id', 'almoxarifado_parametrizacao_portal_divulgacao_item.parametrizacao_portal_divulgacao_grupo_id')
->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'almoxarifado_parametrizacao_portal_divulgacao_grupo.centro_custo_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id')
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
->leftJoin('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_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')
->leftJoin('almoxarifado_entrada_item', function ($join) {
$join->on('almoxarifado_entrada_item.material_id', 'cadastro_material.id')
->whereExists(function ($query) {
$query
->select(DB::raw(1))
->from('almoxarifado_entrada')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_entrada.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereColumn('almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
->whereColumn('almoxarifado_parametrizacao_portal_divulgacao_grupo.centro_custo_id', 'almoxarifado_entrada.centro_custo_id')
->where('almoxarifado_entrada.finalizada', true)
->when(request()->query('unidade_id'), fn ($q, $id) => $q->where('cadastro_infraestrutura.unidade_id', $id));
});
})
->when(request()->query('material_id'), fn ($q, $id) => $q->where('cadastro_material.id', $id))
->when(request()->query('unidade_id'), fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->where(function ($query) {
$query->where(function ($query) {
$query
->whereExists(function ($query) {
$query
->select(DB::raw(1))
->from('almoxarifado_parametrizacao_portal_divulgacao_item')
->whereColumn('almoxarifado_parametrizacao_portal_divulgacao_item.material_id', 'cadastro_material.id')
->join('almoxarifado_parametrizacao_portal_divulgacao_grupo', 'almoxarifado_parametrizacao_portal_divulgacao_grupo.id', 'almoxarifado_parametrizacao_portal_divulgacao_item.parametrizacao_portal_divulgacao_grupo_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_parametrizacao_portal_divulgacao_grupo.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->when(request()->query('unidade_id'), fn ($q, $id) => $q->where('cadastro_infraestrutura.unidade_id', $id))
->where(function ($sub) {
$sub->whereNotExists(function ($q) {
$q->select(DB::raw(1))
->from('almoxarifado_parametrizacao_portal_divulgacao_subgrupo as subg')
->whereColumn('subg.parametrizacao_portal_divulgacao_grupo_id', 'almoxarifado_parametrizacao_portal_divulgacao_grupo.id');
})
->orWhereExists(function ($q) {
$q->select(DB::raw(1))
->from('almoxarifado_parametrizacao_portal_divulgacao_subgrupo as subg')
->join('almoxarifado_parametrizacao_portal_divulgacao_item as item2', 'item2.parametrizacao_portal_divulgacao_grupo_id', 'subg.parametrizacao_portal_divulgacao_grupo_id')
->whereColumn('item2.material_id', 'cadastro_material.id')
->whereColumn('subg.parametrizacao_portal_divulgacao_grupo_id', 'almoxarifado_parametrizacao_portal_divulgacao_grupo.id');
});
});
});
});
})
->groupBy([
'cadastro_material.id',
'cadastro_material.codigo_material',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
)),
'cadastro_apresentacao.nome',
'unidade.id',
'unidade.nome_fantasia',
])
->havingRaw("
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) > 0
")
->get()
->each(function ($query) use ($materiais) {
$material = (object) [
'material_id' => $query->material_id,
'material_codigo' => $query->material_codigo,
'material_descricao' => $query->material_descricao,
'estoque_disponivel' => 0,
'apresentacao' => $query->apresentacao ?? null,
'unidade' => $query->unidade_nome ?? null,
];
$materiais->push($material);
$material->estoque_disponivel += $query->quantidade;
$material;
});
$materiais = $materiais
->sortBy([
['unidade', 'asc'],
['material_descricao', 'asc'],
])
->values();
return [
'materiais' => $materiais,
'data_atual' => Carbon::now()->format('d/m/Y'),
];
}
public static function list()
{
$data = (object) [
'form' => [],
'model' => [],
];
$params = self::getParams();
$sets = [
'unidade' => function () use ($data, $params) {
$unidadesData = self::getUnidadesData($params);
$data->form['unidades'] = $unidadesData['form'];
$data->model['unidade_id'] = $params->unidade_id = $unidadesData['model'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $params->infraestrutura_id = $infraestruturasData['model'];
},
'centro_custo' => function () use ($data, $params) {
$centrosDeCustoData = self::getCentrosDeCustoData($params);
$data->form['centros_custo'] = $centrosDeCustoData['form'];
$data->model['centro_custo_id'] = $params->centro_custo_id = $centrosDeCustoData['model'];
},
'grupo' => function () use ($data, $params) {
$gruposData = self::getGruposData($params);
$data->form['grupos'] = $gruposData['form'];
$data->model['grupo_id'] = $params->grupo_id = $gruposData['model'];
},
'subgrupo' => function () use ($data, $params) {
$subgruposData = self::getSubgruposData($params);
$data->form['subgrupos'] = $subgruposData['form'];
$data->model['subgrupo_id'] = $params->subgrupo_id = $subgruposData['model'];
},
'material' => function () use ($data) {
$data->model['material'] = null;
},
'status' => function () use ($data, $params) {
$statusData = self::getStatusData();
$data->form['status'] = $statusData['form'];
$data->model['status'] = $params->status = $statusData['model'];
},
];
$load = is_null(request()->load_from);
foreach ($sets as $field => $set) {
if ($load) {
$set();
}
else if ($field === request()->load_from) {
$load = true;
}
}
foreach ($data as $property => $itens) {
if (empty($itens)) {
unset($data->{$property});
}
}
return $data;
}
private static function getParams()
{
$params = (object) request()->only([
'unidade_id',
'infraestrutura_id',
'centro_custo_id',
'grupo_id',
'subgrupo_id',
]);
return $params;
}
private static function getUnidadesData()
{
$unidades = Unidade::whereHas('infraestruturas.centrosCusto', function($q) {
$q->has('almoxarifadoParametrizacoesPortalDivulgacaoGrupo');
})
->orderBy('nome_fantasia')
->get(['id', 'nome_fantasia']);
return ['form' => $unidades, 'model' => null];
}
private static function getInfraestruturasData($params)
{
$infraestruturas = collect();
$id = null;
if (!is_null($params->unidade_id)) {
$infraestruturas = Infraestrutura::setEagerLoads([])
->where('unidade_id', $params->unidade_id)
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
->get(['id', 'nome', 'principal', 'unidade_id'])
->map(fn ($i) => ['id' => $i->id, 'nome' => $i->nome])
->sortBy('nome')
->values();
if ($infraestruturas->count() === 1) {
$id = $infraestruturas->first()['id'];
}
}
return ['form' => $infraestruturas, 'model' => $id];
}
private static function getCentrosDeCustoData($params)
{
$centrosCusto = collect();
$id = null;
if (!is_null($params->infraestrutura_id)) {
$centrosCusto = CentroCusto::setEagerLoads([])
->where('infraestrutura_id', $params->infraestrutura_id)
->where(fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
->get(['id', 'setor_id'])
->map(fn ($cc) => [
'id' => $cc->id,
'setor_nome' => $cc->setor()->setEagerLoads([])->first('nome')->nome
])
->sortBy('setor_nome')
->values();
if ($centrosCusto->count() === 1) {
$id = $centrosCusto->first()['id'];
}
}
return ['form' => $centrosCusto, 'model' => $id];
}
private static function setWhereForFilterCentroCusto($query)
{
return $query->has('almoxarifadoParametrizacoesPortalDivulgacaoGrupo');
}
private static function getGruposData($params)
{
$grupos = collect();
$id = null;
if (!is_null($params->unidade_id)) {
$grupos = Grupo::setEagerLoads([])
->whereHas('almoxarifadoParametrizacoesPortalDivulgacaoGrupo', fn ($q) => self::setWhereForFilterControlePermissaoGrupo($q, $params))
->orderBy('nome')
->get(['id', 'nome']);
}
return ['form' => $grupos, 'model' => $id];
}
private static function getSubgruposData($params)
{
$subgrupos = collect();
$id = null;
if (!is_null($params->grupo_id)) {
$subgrupos = Subgrupo::setEagerLoads([])
->where('grupo_id', $params->grupo_id)
->whereHas('almoxarifadoParametrizacoesControleEstoqueSubgrupo.parametrizacaoControleEstoqueGrupo', fn ($q) =>
self::setWhereForFilterControlePermissaoGrupo($q, $params)
)
->orderBy('nome')
->get(['id', 'nome']);
}
return ['form' => $subgrupos, 'model' => $id];
}
private static function getStatusData()
{
$status = [
['value' => 'abaixo_minimo', 'text' => 'Abaixo do mínimo'],
['value' => 'acima_maximo', 'text' => 'Acima do máximo'],
['value' => 'normal', 'text' => 'Normal'],
['value' => 'zerado', 'text' => 'Zerado'],
];
return ['form' => $status, 'model' => null];
}
public static function setWhereForFilterControlePermissaoGrupo($query, $params)
{
$query->where('centro_custo_id', $params->centro_custo_id);
}
public static function autocompleteMaterial()
{
$materiais = DB::table('cadastro_material')
->select(
'cadastro_material.id',
'cadastro_material.codigo_material',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " as descricao"),
)
->distinct()
->join(
'cadastro_apresentacao',
'cadastro_apresentacao.id',
'cadastro_material.apresentacao_id'
)
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'cadastro_material.apresentacao_unidade_medida_id'
)
->where('cadastro_material.deleted_at', null)
->where(function ($query) {
$query->where(function ($query) {
$query
->whereExists(function ($query) {
$query
->select(DB::raw(1))
->from('almoxarifado_parametrizacao_portal_divulgacao_item')
->whereColumn('almoxarifado_parametrizacao_portal_divulgacao_item.material_id', 'cadastro_material.id')
->join('almoxarifado_parametrizacao_portal_divulgacao_grupo', 'almoxarifado_parametrizacao_portal_divulgacao_grupo.id', 'almoxarifado_parametrizacao_portal_divulgacao_item.parametrizacao_portal_divulgacao_grupo_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_parametrizacao_portal_divulgacao_grupo.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->when(request()->query('unidade_id'), fn ($q, $id) => $q->where('cadastro_infraestrutura.unidade_id', $id))
->where(function ($sub) {
$sub->whereNotExists(function ($q) {
$q->select(DB::raw(1))
->from('almoxarifado_parametrizacao_portal_divulgacao_subgrupo as subg')
->whereColumn('subg.parametrizacao_portal_divulgacao_grupo_id', 'almoxarifado_parametrizacao_portal_divulgacao_grupo.id');
})
->orWhereExists(function ($q) {
$q->select(DB::raw(1))
->from('almoxarifado_parametrizacao_portal_divulgacao_subgrupo as subg')
->join('almoxarifado_parametrizacao_portal_divulgacao_item as item2', 'item2.parametrizacao_portal_divulgacao_grupo_id', 'subg.parametrizacao_portal_divulgacao_grupo_id')
->whereColumn('item2.material_id', 'cadastro_material.id')
->whereColumn('subg.parametrizacao_portal_divulgacao_grupo_id', 'almoxarifado_parametrizacao_portal_divulgacao_grupo.id');
});
});
});
});
})
->groupBy([
'cadastro_material.id',
'cadastro_material.codigo_material',
'descricao',
'cadastro_apresentacao.nome',
]);
return $materiais;
}
public static function getPrintData()
{
$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 [
'unidade_nome_fantasia' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura_nome' => $infraestrutura->nome ?? 'Todos',
'setor_nome' => $centroCusto->setor->nome ?? 'Todos',
'grupo_nome' => $grupo->nome ?? 'Todos',
'subgrupo_nome' => $subgrupo->nome ?? 'Todos',
'material_descricao' => $material->descricao_completa ?? 'Todos',
'itens' => self::index()['materiais'],
'colunas' => collect(request()->selectedCols),
];
}
}