273 lines
11 KiB
PHP
273 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Almoxarifado\Relatorios;
|
|
|
|
use App\Enums\Cadastro\Estabelecimento\SetorTipo;
|
|
use App\Models\Cadastro\Estabelecimento\CentroCusto;
|
|
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
|
|
use App\Models\Cadastro\Estabelecimento\Unidade;
|
|
use App\Models\Cadastro\Fornecedor\Fornecedor;
|
|
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 EstornoEntradaService 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_entrada_item as entrada_item')
|
|
->join(
|
|
'almoxarifado_entrada as entrada',
|
|
'entrada.id',
|
|
'entrada_item.entrada_id'
|
|
)
|
|
->join(
|
|
'cadastro_centro_custo as entrada_centro_custo',
|
|
'entrada_centro_custo.id',
|
|
'entrada.created_centro_custo_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as entrada_infraestrutura',
|
|
'entrada_infraestrutura.id',
|
|
'entrada_centro_custo.infraestrutura_id'
|
|
)
|
|
->join(
|
|
'almoxarifado_entrada_documento as entrada_documento',
|
|
'entrada_documento.entrada_id',
|
|
'entrada.id'
|
|
)
|
|
->join(
|
|
'almoxarifado_documento_tipo as documento_tipo',
|
|
'documento_tipo.id',
|
|
'entrada_documento.tipo_id'
|
|
)
|
|
->join(
|
|
'cadastro_fornecedor as fornecedor',
|
|
'fornecedor.id',
|
|
'entrada_documento.fornecedor_id'
|
|
)
|
|
->join(
|
|
'cadastro_material as material',
|
|
'material.id',
|
|
'entrada_item.material_id'
|
|
)
|
|
->join(
|
|
'cadastro_apresentacao as apresentacao',
|
|
'apresentacao.id',
|
|
'material.apresentacao_id'
|
|
)
|
|
->join(
|
|
'cadastro_grupo as grupo',
|
|
'grupo.id',
|
|
'material.grupo_id'
|
|
)
|
|
->leftJoin(
|
|
'cadastro_subgrupo as subgrupo',
|
|
'subgrupo.id',
|
|
'material.subgrupo_id'
|
|
)
|
|
->join(
|
|
'almoxarifado_saida_item as saida_item',
|
|
'saida_item.id',
|
|
'entrada_item.saida_item_estornado_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'
|
|
)
|
|
->join(
|
|
'almoxarifado_saida_item_entrada_item as saida_item_entrada_item',
|
|
fn ($join) => $join->on('saida_item_entrada_item.entrada_item_id', 'entrada_item.id')
|
|
->whereColumn('saida_item_entrada_item.saida_item_id', 'entrada_item.saida_item_estornado_id')
|
|
)
|
|
->leftJoin(
|
|
'cadastro_unidade_medida as apresentacao_unidade_medida',
|
|
'apresentacao_unidade_medida.id',
|
|
'material.apresentacao_unidade_medida_id'
|
|
)
|
|
->where('entrada.finalizada', true)
|
|
->whereNotNull('entrada_item.estornado_em')
|
|
->whereBetween('entrada_item.estornado_em', $periodo)
|
|
->when(
|
|
request()->unidade_id,
|
|
fn ($q, $id) => $q->where('entrada_infraestrutura.unidade_id', $id)
|
|
)
|
|
->when(
|
|
request()->infraestrutura_id,
|
|
fn ($q, $id) => $q->where('entrada_centro_custo.infraestrutura_id', $id)
|
|
)
|
|
->when(
|
|
request()->centro_custo_id,
|
|
fn ($q, $id) => $q->where('entrada.created_centro_custo_id', $id)
|
|
)
|
|
->when(
|
|
request()->fornecedor_id,
|
|
fn ($q, $id) => $q->where('entrada_documento.fornecedor_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('entrada_item.material_id', $id)
|
|
)
|
|
->select(
|
|
'entrada_item.estornado_em as data_hora_estorno',
|
|
'material.codigo_material',
|
|
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
|
'material',
|
|
'apresentacao',
|
|
'apresentacao_unidade_medida'
|
|
) . " as material"),
|
|
'entrada_item.lote as lote',
|
|
'entrada_item.validade_lote as validade',
|
|
'grupo.nome as grupo',
|
|
'subgrupo.nome as subgrupo',
|
|
'entrada_documento.data as data_documento',
|
|
'entrada_documento.numero as numero_documento',
|
|
'documento_tipo.nome as tipo_documento',
|
|
'fornecedor.nome_fantasia as fornecedor',
|
|
'saida_item_cidadao.nome as usuario_estorno',
|
|
'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()
|
|
{
|
|
return [
|
|
'additionals' => [
|
|
'data_atual' => Carbon::now()->format('d/m/Y')
|
|
],
|
|
'form' => [
|
|
'unidades' => Unidade::orderBy('nome_fantasia')
|
|
->whereHas('infraestruturas', function ($query) {
|
|
|
|
$query->whereHas('centrosCusto', function ($query) {
|
|
|
|
$query->whereHas('setor', fn ($q) => $q->where('tipo_id', SetorTipo::ALMOXARIFADO));
|
|
});
|
|
})
|
|
->get()
|
|
->map(fn ($unidade) => [
|
|
'id' => $unidade->id,
|
|
'nome_fantasia' => $unidade->nome_fantasia,
|
|
'infraestruturas' => $unidade->infraestruturas()
|
|
->whereHas('centrosCusto', function ($query) {
|
|
|
|
$query->whereHas('setor', fn ($q) => $q->where('tipo_id', SetorTipo::ALMOXARIFADO));
|
|
})
|
|
->get()
|
|
->sortBy('nome')
|
|
->map(fn ($infraestrutura) => [
|
|
'id' => $infraestrutura->id,
|
|
'nome' => $infraestrutura->nome,
|
|
'centros_custo' => $infraestrutura->centrosCusto()
|
|
->whereHas('setor', fn ($q) => $q->where('tipo_id', SetorTipo::ALMOXARIFADO))
|
|
->get()
|
|
->map(fn ($centroCusto) => [
|
|
'id' => $centroCusto->id,
|
|
'setor_nome' => $centroCusto->setor->nome,
|
|
])
|
|
->sortBy('setor_nome')
|
|
->values()
|
|
])
|
|
->values()
|
|
]),
|
|
'fornecedores' => Fornecedor::orderBy('nome_fantasia')->get(['id', 'nome_fantasia']),
|
|
'grupos' => Grupo::orderBy('nome')
|
|
->get()
|
|
->map(fn ($grupo) => [
|
|
'id' => $grupo->id,
|
|
'nome' => $grupo->nome,
|
|
'subgrupos' => $grupo->subgrupos()->orderBy('nome')->get(['id', 'nome'])
|
|
])
|
|
],
|
|
'model' => [
|
|
'periodo' => [
|
|
'start' => null,
|
|
'end' => null,
|
|
],
|
|
'unidade_id' => null,
|
|
'infraestrutura_id' => null,
|
|
'centro_custo_id' => null,
|
|
'fornecedor_id' => null,
|
|
'grupo_id' => null,
|
|
'subgrupo_id' => null,
|
|
'material' => null,
|
|
],
|
|
];
|
|
}
|
|
|
|
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_documento = (new Carbon($item->data_documento))->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);
|
|
$fornecedor = Fornecedor::find(request()->fornecedor_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',
|
|
'fornecedor' => $fornecedor->nome_fantasia ?? 'Todos',
|
|
'grupo' => $grupo->nome ?? 'Todos',
|
|
'subgrupo' => $subgrupo->nome ?? 'Todos',
|
|
'material' => $material->descricao_completa ?? 'Todos',
|
|
'colunas' => collect(request()->selectedCols),
|
|
'itens' => $itens,
|
|
'totalizadores' => $resultado['totalizadores'],
|
|
];
|
|
}
|
|
}
|