Files
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

395 lines
16 KiB
PHP

<?php
namespace App\Services\Almoxarifado\Relatorios;
use App\Enums\Almoxarifado\SaidaTipo as SaidaTipoEnum;
use App\Enums\Cadastro\Estabelecimento\SetorTipo;
use App\Models\Almoxarifado\SaidaTipo;
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\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class EstornoSaidaService extends Service
{
public static function index()
{
$totalizadores = (object) ['quantidade' => 0];
$periodo = [
'start' => Carbon::createFromFormat('d/m/Y', request()->periodo['start'])->setTime(0, 0, 0),
'end' => Carbon::createFromFormat('d/m/Y', request()->periodo['end'])->setTime(23, 59, 59)
];
$estornos = DB::table('almoxarifado_saida_item_entrada_item as saida_item_entrada_item')
->join(
'almoxarifado_saida_item as saida_item',
'saida_item.id',
'saida_item_entrada_item.saida_item_id'
)
->join(
'almoxarifado_saida as saida',
'saida.id',
'saida_item.saida_id'
)
->join(
'cadastro_centro_custo as saida_centro_custo',
'saida_centro_custo.id',
'saida.created_centro_custo_id'
)
->join(
'cadastro_infraestrutura as saida_infraestrutura',
'saida_infraestrutura.id',
'saida_centro_custo.infraestrutura_id'
)
->join(
'almoxarifado_saida_tipo as saida_tipo',
'saida_tipo.id',
'saida.tipo_id'
)
->join(
'cadastro_material as material',
'material.id',
'saida_item.material_id'
)
->join(
'cadastro_apresentacao as apresentacao',
'apresentacao.id',
'material.apresentacao_id'
)
->join(
'cadastro_grupo as grupo',
'grupo.id',
'material.grupo_id'
)
->join(
'cadastro_lotacao as saida_item_lotacao',
'saida_item_lotacao.id',
'saida_item.created_lotacao_id'
)
->join(
'cadastro_usuario as saida_item_usuario',
'saida_item_usuario.id',
'saida_item_lotacao.usuario_id'
)
->join(
'cadastro_cidadao as saida_item_cidadao',
'saida_item_cidadao.id',
'saida_item_usuario.cidadao_id'
)
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'material.apresentacao_unidade_medida_id'
)
->leftJoin(
'almoxarifado_entrada_item as entrada_item_estorno',
'entrada_item_estorno.id',
'saida_item_entrada_item.entrada_item_estornado_id'
)
->leftJoin(
'cadastro_lotacao as entrada_item_estorno_lotacao',
'entrada_item_estorno_lotacao.id',
'entrada_item_estorno.created_lotacao_id'
)
->leftJoin(
'cadastro_usuario as entrada_item_estorno_usuario',
'entrada_item_estorno_usuario.id',
'entrada_item_estorno_lotacao.usuario_id'
)
->leftJoin(
'cadastro_cidadao as entrada_item_estorno_cidadao',
'entrada_item_estorno_cidadao.id',
'entrada_item_estorno_usuario.cidadao_id'
)
->leftJoin(
'almoxarifado_saida_baixa as saida_baixa',
'saida_baixa.saida_id',
'saida.id'
)
->leftJoin(
'cadastro_lotacao as saida_baixa_lotacao',
'saida_baixa_lotacao.id',
'saida_baixa.usuario_solicitante_id'
)
->leftJoin(
'cadastro_usuario as saida_baixa_usuario',
'saida_baixa_usuario.id',
'saida_baixa_lotacao.usuario_id'
)
->leftJoin(
'cadastro_cidadao as saida_baixa_cidadao',
'saida_baixa_cidadao.id',
'saida_baixa_usuario.cidadao_id'
)
->leftJoin(
'almoxarifado_motivo_baixa as saida_baixa_motivo',
'saida_baixa_motivo.id',
'saida_baixa.motivo_id'
)
->leftJoin(
'almoxarifado_saida_requisicao as saida_requisicao',
'saida_requisicao.saida_id',
'saida.id'
)
->leftJoin(
'cadastro_lotacao as saida_requisicao_lotacao',
'saida_requisicao_lotacao.id',
'saida_requisicao.usuario_id'
)
->leftJoin(
'cadastro_usuario as saida_requisicao_usuario',
'saida_requisicao_usuario.id',
'saida_requisicao_lotacao.usuario_id'
)
->leftJoin(
'cadastro_cidadao as saida_requisicao_cidadao',
'saida_requisicao_cidadao.id',
'saida_requisicao_usuario.cidadao_id'
)
->leftJoin(
'almoxarifado_saida_transferencia as saida_transferencia',
'saida_transferencia.saida_id',
'saida.id'
)
->leftJoin(
'cadastro_lotacao as saida_transferencia_lotacao',
'saida_transferencia_lotacao.id',
'saida_transferencia.usuario_id'
)
->leftJoin(
'cadastro_usuario as saida_transferencia_usuario',
'saida_transferencia_usuario.id',
'saida_transferencia_lotacao.usuario_id'
)
->leftJoin(
'cadastro_cidadao as saida_transferencia_cidadao',
'saida_transferencia_cidadao.id',
'saida_transferencia_usuario.cidadao_id'
)
->leftJoin(
'cadastro_subgrupo as subgrupo',
'subgrupo.id',
'material.subgrupo_id'
)
->where('saida.finalizada', true)
->whereNotNull('saida_item.estornado_em')
->whereBetween('saida_item.estornado_em', $periodo)
->when(
request()->unidade_id,
fn ($q, $id) => $q->where('saida_infraestrutura.unidade_id', $id)
)
->when(
request()->infraestrutura_id,
fn ($q, $id) => $q->where('saida_centro_custo.infraestrutura_id', $id)
)
->when(
request()->centro_custo_id,
fn ($q, $id) => $q->where('saida.created_centro_custo_id', $id)
)
->when(
request()->tipo_saida_id,
fn ($q, $id) => $q->where('saida.tipo_id', $id)
)
->when(
request()->usuario_requisitante_id,
fn ($q, $id) => $q->where(function ($query) use ($id) {
$query->where('saida_requisicao.usuario_id', $id)
->orWhere('saida_transferencia.usuario_id', $id)
->orWhere('saida_baixa.usuario_solicitante_id', $id);
})
)
->when(
request()->grupo_id,
fn ($q, $id) => $q->where('material.grupo_id', $id)
)
->when(
request()->subgrupo_id,
fn ($q, $id) => $q->where('material.subgrupo_id', $id)
)
->when(
request()->material_id,
fn ($q, $id) => $q->where('saida_item.material_id', $id)
)
->select(
'saida_item.estornado_em as data_hora_estorno',
'saida_item.created_at as data_saida',
DB::raw("CONCAT(
saida_tipo.nome,
IF(saida.tipo_id = " . SaidaTipoEnum::BAIXA . ",
CONCAT(' (', saida_baixa_motivo.descricao, ')'),
''
)
) as tipo_saida"),
'material.codigo_material',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'material',
'apresentacao',
'apresentacao_unidade_medida'
) . " as material"),
'entrada_item_estorno.lote as lote',
'entrada_item_estorno.validade_lote as validade',
'grupo.nome as grupo',
'subgrupo.nome as subgrupo',
'saida_requisicao.numero as numero_requisicao',
DB::raw("(
CASE
WHEN saida.tipo_id = " . SaidaTipoEnum::MANUAL . "
THEN saida_requisicao_cidadao.nome
WHEN saida.tipo_id = " . SaidaTipoEnum::TRANSFERENCIA . "
THEN saida_transferencia_cidadao.nome
WHEN saida.tipo_id = " . SaidaTipoEnum::BAIXA . "
THEN saida_baixa_cidadao.nome
END
) as usuario_requisitante"),
'entrada_item_estorno_cidadao.nome as usuario_estorno',
'saida_item_cidadao.nome as usuario_saida',
'saida_item_entrada_item.quantidade_saida as quantidade'
)
->get();
$estornos->each(fn ($e) => $totalizadores->quantidade += $e->quantidade);
return compact('estornos', 'totalizadores');
}
public static function list()
{
$centroCustoLogado = self::getCurrentCentroCusto();
$unidadeLogadaId = $centroCustoLogado->infraestrutura->unidade_id;
$infraestruturaLogadaId = $centroCustoLogado->infraestrutura_id;
$centroCustoLogadoId = $centroCustoLogado->id;
$isAlmoxarifado = $centroCustoLogado->setor->tipo_id === SetorTipo::ALMOXARIFADO;
$data = [
'additionals' => [
'data_atual' => Carbon::now()->format('d/m/Y'),
'is_almoxarifado' => $isAlmoxarifado,
],
'form' => [
'unidades' => Unidade::orderBy('nome_fantasia')
->when($isAlmoxarifado,
fn ($query) => $query->whereHas('infraestruturas', fn ($q) => $q->whereHas('centrosCusto')),
fn ($query) => $query->where('id', $unidadeLogadaId)
)
->get()
->map(fn ($unidade) => (object) [
'id' => $unidade->id,
'nome_fantasia' => $unidade->nome_fantasia,
'infraestruturas' => $unidade->infraestruturas()
->when($isAlmoxarifado,
fn ($q) => $q->whereHas('centrosCusto'),
fn ($q) => $q->where('id', $infraestruturaLogadaId)
)
->get()
->sortBy('nome')
->map(fn ($infraestrutura) => (object) [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'centros_custo' => $infraestrutura->centrosCusto()
->when(!$isAlmoxarifado, fn ($q) => $q->where('id', $centroCustoLogadoId))
->get()
->map(fn ($centroCusto) => (object) [
'id' => $centroCusto->id,
'setor_nome' => $centroCusto->setor->nome,
])
->sortBy('setor_nome')
->values()
])
->values()
]),
'tipos_saida' => SaidaTipo::query()
->when($isAlmoxarifado,
fn ($q) => $q->whereIn('id', [
SaidaTipoEnum::MANUAL,
SaidaTipoEnum::BAIXA,
SaidaTipoEnum::TRANSFERENCIA,
]),
fn ($q) => $q->where('id', SaidaTipoEnum::BAIXA)
)
->orderBy('nome')
->get(['id', 'nome']),
'grupos' => Grupo::orderBy('nome')
->get()
->map(fn ($grupo) => (object) [
'id' => $grupo->id,
'nome' => $grupo->nome,
'subgrupos' => $grupo->subgrupos()->orderBy('nome')->get(['id', 'nome'])
])
],
];
$unidade = $isAlmoxarifado ? null : $data['form']['unidades']->first();
$infraestrutura = $isAlmoxarifado ? null : $unidade->infraestruturas->first();
$centroCusto = $isAlmoxarifado ? null : $infraestrutura->centros_custo->first();
$tipoSaida = $isAlmoxarifado ? null : $data['form']['tipos_saida']->first();
$data['model'] = [
'periodo' => [
'start' => null,
'end' => null,
],
'unidade_id' => $unidade->id ?? null,
'infraestrutura_id' => $infraestrutura->id ?? null,
'centro_custo_id' => $centroCusto->id ?? null,
'tipo_saida_id' => $tipoSaida->id ?? null,
'usuario_requisitante' => null,
'grupo_id' => null,
'subgrupo_id' => null,
'material' => null,
];
return $data;
}
public static function getPrintExportData()
{
$resultado = self::index();
$itens = $resultado['estornos'];
$itens->each(function ($item) {
$item->data_hora_estorno = (new Carbon($item->data_hora_estorno))->format('d/m/Y H:i');
$item->data_saida = (new Carbon($item->data_saida))->format('d/m/Y');
if (!is_null($item->validade)) {
$item->validade = (new Carbon($item->validade))->format('d/m/Y');
}
});
$unidade = Unidade::find(request()->unidade_id);
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
$centroCusto = CentroCusto::find(request()->centro_custo_id);
$tipoSaida = SaidaTipo::find(request()->tipo_saida_id);
$usuarioRequisitante = Usuario::find(request()->usuario_requisitante_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',
'tipoSaida' => $tipoSaida->nome ?? 'Todos',
'usuarioRequisitante' => $usuarioRequisitante->cidadao->nome ?? 'Todos',
'grupo' => $grupo->nome ?? 'Todos',
'subgrupo' => $subgrupo->nome ?? 'Todos',
'material' => $material->descricao_completa ?? 'Todos',
'colunas' => collect(request()->selectedCols),
'itens' => $itens,
'totalizadores' => $resultado['totalizadores'],
];
}
}