Files
rkm-conectasus-ci-sandbox/api/app/Services/Almoxarifado/Relatorios/ConsumoFinanceiroService.php
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

241 lines
10 KiB
PHP

<?php
namespace App\Services\Almoxarifado\Relatorios;
use App\Models\Almoxarifado\DocumentoTipo;
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 ConsumoFinanceiroService extends Service
{
public static function index()
{
$totalizadores = (object) ['quantidade' => 0];
$consulta = $query = DB::table('almoxarifado_saida_item')
->join(
'cadastro_material',
'almoxarifado_saida_item.material_id',
'cadastro_material.id'
)
->join(
'cadastro_apresentacao',
'cadastro_apresentacao.id',
'cadastro_material.apresentacao_id'
)
->join(
'almoxarifado_saida_item_entrada_item',
'almoxarifado_saida_item.id',
'almoxarifado_saida_item_entrada_item.saida_item_id'
)
->join(
'almoxarifado_saida',
'almoxarifado_saida_item.saida_id',
'almoxarifado_saida.id'
)
->join(
'almoxarifado_entrada_item',
'almoxarifado_saida_item_entrada_item.entrada_item_id',
'almoxarifado_entrada_item.id'
)
->leftJoin(
'almoxarifado_saida_requisicao',
'almoxarifado_saida.id',
'almoxarifado_saida_requisicao.saida_id'
)
->join(
'cadastro_centro_custo',
'cadastro_centro_custo.id',
'almoxarifado_saida.centro_custo_id'
)
->join(
'cadastro_setor',
'cadastro_setor.id',
'cadastro_centro_custo.setor_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_centro_custo.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_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_material.subgrupo_id',
'cadastro_subgrupo.id'
)
->select(
DB::raw("DATE_FORMAT(almoxarifado_saida_item.created_at, '%d/%m/%Y') as data"),
'cadastro_material.codigo_material',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " AS descricao"),
'almoxarifado_entrada_item.valor_unitario AS valor_unitario',
'almoxarifado_saida_item_entrada_item.quantidade_saida AS quantidade',
DB::raw('almoxarifado_entrada_item.valor_unitario * almoxarifado_saida_item_entrada_item.quantidade_saida AS valor_total'),
'cadastro_grupo.nome AS grupo',
'cadastro_subgrupo.nome AS subgrupo',
'cadastro_unidade.nome_fantasia AS unidade',
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura')
)
->whereNull('almoxarifado_saida_item.estornado_em')
->when(request()->periodo['start'], fn ($q, $data) => $q
->where('almoxarifado_saida_item.created_at', '>=', Carbon::createFromFormat('d/m/Y', $data)
->setTime(0, 0, 0))
)
->when(request()->periodo['end'], fn ($q, $data) => $q
->where('almoxarifado_saida_item.created_at', '<=', 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))
->select(
DB::raw("DATE_FORMAT(almoxarifado_saida_item.created_at, '%d/%m/%Y') as data"),
'cadastro_material.codigo_material',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " AS descricao"),
'almoxarifado_entrada_item.valor_unitario AS valor_unitario',
'almoxarifado_saida_item_entrada_item.quantidade_saida as quantidade',
DB::raw('almoxarifado_entrada_item.valor_unitario * almoxarifado_saida_item_entrada_item.quantidade_saida AS valor_total'),
'cadastro_grupo.nome AS grupo',
'cadastro_subgrupo.nome AS subgrupo',
'cadastro_unidade.nome_fantasia AS unidade',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura"),
)
->get();
$totalizadores = [
'total' => number_format($consulta->sum('valor_total'), 2, ',', '.'),
];
$consulta = $consulta->map(function ($item) use ($totalizadores) {
$item->valor_total = number_format($item->valor_total, 2, ',', '.');
$item->valor_unitario = number_format($item->valor_unitario, 2, ',', '.');
return $item;
});
return ['consulta' => $consulta, 'totalizadores' => $totalizadores];
}
public static function list()
{
$centroCustoLogado = self::getCurrentCentroCusto();
return [
'additionals' => [],
'form' => [
'tipos_documento' => DocumentoTipo::orderBy('nome')->get(['id', 'nome']),
'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'])
]),
],
'model' => [
'periodo' => [
'start' => null,
'end' => null,
],
'unidade_id' => null,
'infraestrutura_id' => null,
'centro_custo_id' => null,
'grupo_id' => null,
'subgrupo_id' => null,
'tipo_documento_id' => null,
'material_id' => null,
],
];
}
public static function getPrintExportData()
{
$resultado = self::index();
$itens = $resultado['consulta'];
$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['id'] ?? null);
$tipo_documento = DocumentoTipo::find(request()->tipo_documento_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',
'colunas' => collect(request()->selectedCols),
'itens' => $itens,
'totalizadores' => $resultado['totalizadores'],
'tipo_documento' => $tipo_documento->nome ?? 'Todos',
'material' => $material->descricao_completa ?? 'Todos',
];
}
}