This commit is contained in:
306
api/app/Services/Almoxarifado/Relatorios/EntradaService.php
Normal file
306
api/app/Services/Almoxarifado/Relatorios/EntradaService.php
Normal file
@@ -0,0 +1,306 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Almoxarifado\Relatorios;
|
||||
|
||||
use App\Enums\Almoxarifado\EntradaTipo as EntradaTipoEnum;
|
||||
use App\Enums\Cadastro\Estabelecimento\SetorTipo;
|
||||
use App\Enums\Cadastro\Grupo\GrupoTipo;
|
||||
use App\Models\Almoxarifado\DocumentoTipo;
|
||||
use App\Models\Almoxarifado\Entrada;
|
||||
use App\Models\Almoxarifado\EntradaTipo;
|
||||
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 EntradaService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
$totalizadores = (object) ['quantidade' => 0];
|
||||
|
||||
if(request()->tipo_data == 'entrada') {
|
||||
$tipo_data = 'almoxarifado_entrada.finalizada_em';
|
||||
} else {
|
||||
$tipo_data = 'almoxarifado_entrada_documento.data';
|
||||
}
|
||||
|
||||
$consulta = DB::table('almoxarifado_entrada')
|
||||
->join(
|
||||
'almoxarifado_entrada_item',
|
||||
'almoxarifado_entrada_item.entrada_id',
|
||||
'almoxarifado_entrada.id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_material',
|
||||
'cadastro_material.id',
|
||||
'almoxarifado_entrada_item.material_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_apresentacao',
|
||||
'cadastro_apresentacao.id',
|
||||
'cadastro_material.apresentacao_id'
|
||||
)
|
||||
->join(
|
||||
'almoxarifado_entrada_tipo',
|
||||
'almoxarifado_entrada_tipo.id',
|
||||
'almoxarifado_entrada.tipo_id'
|
||||
)
|
||||
->join(
|
||||
'cadastro_grupo',
|
||||
'cadastro_grupo.id',
|
||||
'cadastro_material.grupo_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_unidade',
|
||||
'cadastro_unidade.id',
|
||||
'cadastro_infraestrutura.unidade_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'almoxarifado_entrada_documento',
|
||||
'almoxarifado_entrada_documento.entrada_id',
|
||||
'almoxarifado_entrada.id'
|
||||
)
|
||||
->leftJoin(
|
||||
'almoxarifado_documento_tipo',
|
||||
'almoxarifado_documento_tipo.id',
|
||||
'almoxarifado_entrada_documento.tipo_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_fornecedor',
|
||||
'cadastro_fornecedor.id',
|
||||
'almoxarifado_entrada_documento.fornecedor_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_subgrupo',
|
||||
'cadastro_subgrupo.id',
|
||||
'cadastro_material.subgrupo_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'cadastro_unidade_medida as apresentacao_unidade_medida',
|
||||
'apresentacao_unidade_medida.id',
|
||||
'cadastro_material.apresentacao_unidade_medida_id'
|
||||
)
|
||||
->when(request()->periodo['start'], fn ($q, $data) => $q
|
||||
->where($tipo_data, '>=', Carbon::createFromFormat('d/m/Y', $data)
|
||||
->setTime(0, 0, 0))
|
||||
)
|
||||
->when(request()->periodo['end'], fn ($q, $data) => $q
|
||||
->where($tipo_data, '<=', Carbon::createFromFormat('d/m/Y', $data)
|
||||
->setTime(23, 59, 59))
|
||||
)
|
||||
->when(
|
||||
request()->unidade_id,
|
||||
fn ($q, $id) => $q->where('cadastro_infraestrutura.unidade_id', $id)
|
||||
)
|
||||
->when(
|
||||
request()->infraestrutura_id,
|
||||
fn ($q, $id) => $q->where('cadastro_centro_custo.infraestrutura_id', $id)
|
||||
)
|
||||
->when(
|
||||
request()->centro_custo_id,
|
||||
fn ($q, $id) => $q->where('almoxarifado_entrada.centro_custo_id', $id)
|
||||
)
|
||||
->when(
|
||||
request()->grupo_id,
|
||||
fn ($q, $id) => $q->where('cadastro_material.grupo_id', $id)
|
||||
)
|
||||
->when(
|
||||
request()->grupo_id,
|
||||
fn ($q, $id) => $q->where('cadastro_material.grupo_id', $id)
|
||||
)
|
||||
->when(
|
||||
request()->subgrupo_id,
|
||||
fn ($q, $id) => $q->where('cadastro_material.subgrupo_id', $id)
|
||||
)
|
||||
->when(
|
||||
request()->fornecedor_id,
|
||||
fn ($q, $id) => $q->where('almoxarifado_entrada_documento.fornecedor_id', $id)
|
||||
)
|
||||
->when(
|
||||
request()->tipo_documento_id,
|
||||
fn ($q, $id) => $q->where('almoxarifado_entrada_documento.tipo_id', $id)
|
||||
)
|
||||
->when(
|
||||
request()->numero_pedido,
|
||||
fn ($q, $id) => $q->where('almoxarifado_entrada_documento.numero_pedido', $id)
|
||||
)
|
||||
->when(
|
||||
request()->material_id,
|
||||
fn ($q, $id) => $q->where('almoxarifado_entrada_item.material_id', $id)
|
||||
)
|
||||
->when(
|
||||
request()->tipo_entrada_id,
|
||||
fn ($q, $id) => $q->where('almoxarifado_entrada.tipo_id', $id)
|
||||
)
|
||||
->when(
|
||||
request()->sort_field,
|
||||
fn ($q, $campo) => $q->orderBy($campo, request()->sort_direction ?? 'asc')
|
||||
)
|
||||
->whereNull('almoxarifado_entrada_item.estornado_em')
|
||||
->select(
|
||||
'almoxarifado_entrada_documento.data',
|
||||
'almoxarifado_entrada.finalizada_em',
|
||||
'almoxarifado_entrada_tipo.nome as entrada',
|
||||
'almoxarifado_documento_tipo.nome as documento',
|
||||
'almoxarifado_entrada_documento.numero_pedido',
|
||||
'almoxarifado_entrada_documento.numero',
|
||||
'cadastro_fornecedor.nome_fantasia',
|
||||
'cadastro_grupo.nome as grupo',
|
||||
'cadastro_subgrupo.nome as subgrupo',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
) . " as material"),
|
||||
'cadastro_material.codigo_material' ,
|
||||
'almoxarifado_entrada_item.lote',
|
||||
'almoxarifado_entrada_item.validade_lote',
|
||||
'almoxarifado_entrada_item.quantidade' ,
|
||||
'almoxarifado_entrada_item.valor_unitario' ,
|
||||
DB::raw("almoxarifado_entrada_item.quantidade * almoxarifado_entrada_item.valor_unitario as valor_total"),
|
||||
'cadastro_unidade.nome_fantasia AS unidade',
|
||||
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura")
|
||||
)
|
||||
->get();
|
||||
|
||||
$totalizadores = [
|
||||
'valor_unitario' => $consulta->sum('valor_unitario'),
|
||||
'total' => $consulta->sum('valor_total'),
|
||||
];
|
||||
|
||||
return ['consulta' => $consulta, 'totalizadores' => $totalizadores];
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
return [
|
||||
'additionals' => [],
|
||||
'form' => [
|
||||
'fornecedores' => Fornecedor::orderBy('nome_fantasia')->get(['id', 'nome_fantasia']),
|
||||
'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::
|
||||
whereNull('grupo_tipo_id')
|
||||
->orWhere('grupo_tipo_id', '<>', GrupoTipo::EXAME)
|
||||
->orderBy('nome')
|
||||
->get()
|
||||
->map(fn ($grupo) => [
|
||||
'id' => $grupo->id,
|
||||
'nome' => $grupo->nome,
|
||||
'subgrupos' => $grupo->subgrupos()->orderBy('nome')->get(['id', 'nome'])
|
||||
]),
|
||||
'tipos_documento' => DocumentoTipo::orderBy('nome')->get(['id', 'nome']),
|
||||
'tipos' => EntradaTipo::orderBy('nome')->get(['id', 'nome']),
|
||||
'tipo_data' => ['documento' => 'Documento', 'entrada' => 'Entrada'],
|
||||
],
|
||||
'model' => [
|
||||
'periodo' => [
|
||||
'start' => null,
|
||||
'end' => null,
|
||||
],
|
||||
'tipo_data' => null,
|
||||
'unidade_id' => null,
|
||||
'infraestrutura_id' => null,
|
||||
'centro_custo_id' => null,
|
||||
'grupo_id' => null,
|
||||
'subgrupo_id' => null,
|
||||
'numero' => null,
|
||||
'data' => null,
|
||||
'data_documento' => null,
|
||||
'tipo_entrada_id' => null,
|
||||
'tipo_documento_id' => null,
|
||||
'numero_documento' => null,
|
||||
'fornecedor_id' => null,
|
||||
'material_id' => null,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public static function getPrintExportData()
|
||||
{
|
||||
$resultado = self::index();
|
||||
$itens = $resultado['consulta'];
|
||||
|
||||
$itens->each(function ($item) {
|
||||
$item->finalizada_em = (new Carbon($item->finalizada_em))->format('d/m/Y');
|
||||
$item->data = (new Carbon($item->data))->format('d/m/Y');
|
||||
$item->validade_lote = (new Carbon($item->validade_lote))->format('d/m/Y');
|
||||
$item->valor_unitario = number_format($item->valor_unitario, 2, ',', '.');
|
||||
$item->valor_total = number_format($item->valor_total, 2, ',', '.');
|
||||
$item->quantidade = number_format($item->quantidade, 2, ',', '.');
|
||||
});
|
||||
|
||||
$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);
|
||||
$fornecedor = Fornecedor::find(request()->fornecedor_id);
|
||||
$numero_documento = request()->numero_documento;
|
||||
$tipo_documento = DocumentoTipo::find(request()->tipo_documento_id);
|
||||
$tipo_entrada = EntradaTipo::find(request()->tipo_entrada_id);
|
||||
$material = Material::find(request()->material_id['id'] ?? null);
|
||||
|
||||
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',
|
||||
'colunas' => collect(request()->selectedCols),
|
||||
'itens' => $itens,
|
||||
'totalizadores' => $resultado['totalizadores'],
|
||||
'fornecedor' => $fornecedor->nome_fantasia ?? 'Todos',
|
||||
'tipo_documento' => $tipo_documento->nome ?? 'Todos',
|
||||
'tipo_entrada' => $tipo_entrada->nome ?? 'Todos',
|
||||
'material' => $material->descricao_completa ?? 'Todos',
|
||||
'numero_documento' => $numero_documento ?? 'Todos',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user