870 lines
38 KiB
PHP
870 lines
38 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Almoxarifado\Relatorios;
|
|
|
|
use App\Enums\Almoxarifado\MotivoBaixaTipo;
|
|
use App\Enums\Almoxarifado\RequisicaoRespostaStatus;
|
|
use App\Enums\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\Services\Cadastro\Material\MaterialService;
|
|
use App\Services\Service;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class ConsumoMedioMensalService extends Service
|
|
{
|
|
public static function index()
|
|
{
|
|
$totalizadores = (object) [
|
|
'total' => 0,
|
|
'saldo_atual' => 0,
|
|
];
|
|
|
|
$periodo = is_null(request()->periodo) ? null : [
|
|
'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)
|
|
];
|
|
|
|
$intervaloMeses = $periodo['end']->copy()->floorMonth()
|
|
->diffInMonths($periodo['start']->copy()->floorMonth()) + 1;
|
|
|
|
$isCalculoEspecifico = request()->tipo_calculo === 'especifico';
|
|
|
|
$whereSaida = function ($query) use ($periodo) {
|
|
|
|
$query->where('saida.finalizada', true)
|
|
->whereBetween('saida.created_at', $periodo)
|
|
->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura_saida_almoxarifado.unidade_id', $id))
|
|
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('infraestrutura_saida_almoxarifado.id', $id))
|
|
->when(request()->centro_custo_id, fn ($q, $id) => $q->where('centro_custo_saida_almoxarifado.id', $id))
|
|
->where(fn ($q) => $q
|
|
->when(is_null(request()->unidade_requisitante_id)
|
|
&& is_null(request()->infraestrutura_requisitante_id)
|
|
&& is_null(request()->centro_custo_requisitante_id),
|
|
fn ($q) => $q
|
|
->where('saida.tipo_id', SaidaTipo::DISPENSACAO_FARMACIA)
|
|
->orWhere(function ($query) {
|
|
|
|
$query->where('saida.tipo_id', SaidaTipo::BAIXA)
|
|
->whereExists(function ($query) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('almoxarifado_saida_baixa as baixa')
|
|
->join(
|
|
'almoxarifado_motivo_baixa as motivo',
|
|
'motivo.id',
|
|
'baixa.motivo_id'
|
|
)
|
|
->whereColumn('baixa.saida_id', 'saida.id')
|
|
->where('motivo.tipo_id', MotivoBaixaTipo::CONSUMO_INTERNO);
|
|
});
|
|
})
|
|
)
|
|
->orWhere(function ($query) {
|
|
|
|
$query->where('saida.tipo_id', SaidaTipo::MANUAL)
|
|
->whereExists(function ($query) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('almoxarifado_saida_requisicao as requisicao')
|
|
->join(
|
|
'cadastro_centro_custo as centro_custo',
|
|
'centro_custo.id',
|
|
'requisicao.centro_custo_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura',
|
|
'infraestrutura.id',
|
|
'centro_custo.infraestrutura_id'
|
|
)
|
|
->whereColumn('requisicao.saida_id', 'saida.id')
|
|
->when(request()->unidade_requisitante_id, fn ($q, $id) => $q
|
|
->where('infraestrutura.unidade_id', $id))
|
|
->when(request()->infraestrutura_requisitante_id, fn ($q, $id) => $q
|
|
->where('infraestrutura.id', $id))
|
|
->when(request()->centro_custo_requisitante_id, fn ($q, $id) => $q
|
|
->where('centro_custo.id', $id));
|
|
});
|
|
})
|
|
->orWhere(function ($query) {
|
|
|
|
$query->where('saida.tipo_id', SaidaTipo::REQUISICAO)
|
|
->whereExists(function ($query) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('almoxarifado_requisicao_resposta_item as resposta_item')
|
|
->join(
|
|
'almoxarifado_requisicao_resposta as resposta',
|
|
'resposta.id',
|
|
'resposta_item.requisicao_resposta_id'
|
|
)
|
|
->join(
|
|
'almoxarifado_requisicao as requisicao',
|
|
'requisicao.id',
|
|
'resposta.requisicao_id'
|
|
)
|
|
->join(
|
|
'cadastro_centro_custo as centro_custo',
|
|
'centro_custo.id',
|
|
'requisicao.created_centro_custo_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura',
|
|
'infraestrutura.id',
|
|
'centro_custo.infraestrutura_id'
|
|
)
|
|
->whereColumn('resposta_item.saida_item_id', 'saida_item.id')
|
|
->where('resposta.status_id', RequisicaoRespostaStatus::RECEBIDA)
|
|
->when(request()->unidade_requisitante_id, fn ($q, $id) => $q
|
|
->where('infraestrutura.unidade_id', $id))
|
|
->when(request()->infraestrutura_requisitante_id, fn ($q, $id) => $q
|
|
->where('infraestrutura.id', $id))
|
|
->when(request()->centro_custo_requisitante_id, fn ($q, $id) => $q
|
|
->where('centro_custo.id', $id))
|
|
->whereExists(function ($query) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('almoxarifado_requisicao_resposta_item_recebimento as recebimento')
|
|
->whereColumn('recebimento.requisicao_resposta_item_id', 'resposta_item.id')
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('controlava_estoque')
|
|
->orWhere('controlava_estoque', false)
|
|
)
|
|
->where('quantidade', '>', 0)
|
|
);
|
|
});
|
|
});
|
|
})
|
|
);
|
|
};
|
|
|
|
$materiais = DB::table('cadastro_material as material')
|
|
->join(
|
|
'cadastro_grupo as grupo',
|
|
'grupo.id',
|
|
'material.grupo_id'
|
|
)
|
|
->join(
|
|
'cadastro_apresentacao as apresentacao',
|
|
'apresentacao.id',
|
|
'material.apresentacao_id'
|
|
)
|
|
->leftJoin(
|
|
'cadastro_subgrupo as subgrupo',
|
|
'subgrupo.id',
|
|
'material.subgrupo_id'
|
|
)
|
|
->leftJoin(
|
|
'cadastro_unidade_medida as apresentacao_unidade_medida',
|
|
'apresentacao_unidade_medida.id',
|
|
'material.apresentacao_unidade_medida_id'
|
|
)
|
|
->whereExists(function ($query) use ($whereSaida) {
|
|
|
|
$query->select(DB::raw(1))
|
|
->from('almoxarifado_saida_item as saida_item')
|
|
->join(
|
|
'almoxarifado_saida as saida',
|
|
'saida.id',
|
|
'saida_item.saida_id'
|
|
)
|
|
->join(
|
|
'cadastro_centro_custo as centro_custo_saida_almoxarifado',
|
|
'centro_custo_saida_almoxarifado.id',
|
|
'saida.centro_custo_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura_saida_almoxarifado',
|
|
'infraestrutura_saida_almoxarifado.id',
|
|
'centro_custo_saida_almoxarifado.infraestrutura_id'
|
|
)
|
|
->whereColumn('saida_item.material_id', 'material.id')
|
|
->whereNull('saida_item.estornado_em')
|
|
->where($whereSaida);
|
|
})
|
|
->when(request()->grupo_id, fn ($q, $id) => $q->where('grupo.id', $id))
|
|
->when(request()->subgrupo_id, fn ($q, $id) => $q->where('subgrupo.id', $id))
|
|
->when(request()->material_id, fn ($q, $id) => $q->where('material.id', $id))
|
|
->select(DB::raw("
|
|
material.codigo_material,
|
|
" . MaterialService::getDescricaoCompletaRaw(
|
|
'material',
|
|
'apresentacao',
|
|
'apresentacao_unidade_medida'
|
|
) . " as material,
|
|
grupo.nome as grupo,
|
|
subgrupo.nome as subgrupo
|
|
"))
|
|
->when($isCalculoEspecifico, function ($query) use ($whereSaida) {
|
|
|
|
$query->addSelect([
|
|
'meses_consumo' => function ($query) use ($whereSaida) {
|
|
|
|
$query->select(DB::raw("COUNT(DISTINCT CONCAT(
|
|
EXTRACT(YEAR FROM saida.created_at),
|
|
EXTRACT(MONTH FROM saida.created_at)
|
|
))"))
|
|
->from('almoxarifado_saida_item as saida_item')
|
|
->join(
|
|
'almoxarifado_saida as saida',
|
|
'saida.id',
|
|
'saida_item.saida_id'
|
|
)
|
|
->join(
|
|
'cadastro_centro_custo as centro_custo_saida_almoxarifado',
|
|
'centro_custo_saida_almoxarifado.id',
|
|
'saida.centro_custo_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura_saida_almoxarifado',
|
|
'infraestrutura_saida_almoxarifado.id',
|
|
'centro_custo_saida_almoxarifado.infraestrutura_id'
|
|
)
|
|
->whereColumn('saida_item.material_id', 'material.id')
|
|
->whereNull('saida_item.estornado_em')
|
|
->where($whereSaida);
|
|
},
|
|
]);
|
|
})
|
|
->addSelect([
|
|
'total' => function ($query) use ($whereSaida) {
|
|
|
|
$query->select(DB::raw("COALESCE(SUM(
|
|
IF(saida.tipo_id = " . SaidaTipo::REQUISICAO . ",
|
|
(
|
|
SELECT COALESCE(SUM(recebimento.quantidade), 0)
|
|
FROM almoxarifado_requisicao_resposta_item_recebimento as recebimento
|
|
JOIN almoxarifado_requisicao_resposta_item as resposta_item
|
|
ON resposta_item.id = recebimento.requisicao_resposta_item_id
|
|
WHERE resposta_item.saida_item_id = saida_item.id
|
|
),
|
|
(
|
|
SELECT COALESCE(SUM(saida_item_entrada_item.quantidade_saida), 0)
|
|
FROM almoxarifado_saida_item_entrada_item as saida_item_entrada_item
|
|
WHERE saida_item_entrada_item.saida_item_id = saida_item.id
|
|
)
|
|
)
|
|
), 0)"))
|
|
->from('almoxarifado_saida_item as saida_item')
|
|
->join(
|
|
'almoxarifado_saida as saida',
|
|
'saida.id',
|
|
'saida_item.saida_id'
|
|
)
|
|
->join(
|
|
'cadastro_centro_custo as centro_custo_saida_almoxarifado',
|
|
'centro_custo_saida_almoxarifado.id',
|
|
'saida.centro_custo_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura_saida_almoxarifado',
|
|
'infraestrutura_saida_almoxarifado.id',
|
|
'centro_custo_saida_almoxarifado.infraestrutura_id'
|
|
)
|
|
->whereColumn('saida_item.material_id', 'material.id')
|
|
->whereNull('saida_item.estornado_em')
|
|
->where($whereSaida);
|
|
},
|
|
'saldo_atual' => function ($query) {
|
|
|
|
$query->select(DB::raw("
|
|
COALESCE(SUM(
|
|
COALESCE(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 = entrada_item.id
|
|
AND almoxarifado_saida.finalizada = 1
|
|
), 0)
|
|
), 0)
|
|
"))
|
|
->from('almoxarifado_entrada_item as entrada_item')
|
|
->join(
|
|
'almoxarifado_entrada as entrada',
|
|
'entrada.id',
|
|
'entrada_item.entrada_id'
|
|
)
|
|
->join(
|
|
'cadastro_centro_custo as centro_custo',
|
|
'centro_custo.id',
|
|
'entrada.centro_custo_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura',
|
|
'infraestrutura.id',
|
|
'centro_custo.infraestrutura_id'
|
|
)
|
|
->whereColumn('entrada_item.material_id', 'material.id')
|
|
->where('entrada.finalizada', true)
|
|
->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
|
|
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('infraestrutura.id', $id))
|
|
->when(request()->centro_custo_id, fn ($q, $id) => $q->where('centro_custo.id', $id));
|
|
}
|
|
])
|
|
->orderByRaw(MaterialService::getDescricaoCompletaRaw(
|
|
'material',
|
|
'apresentacao',
|
|
'apresentacao_unidade_medida'
|
|
))
|
|
->get();
|
|
|
|
$materiais->each(function ($material) use ($totalizadores, $intervaloMeses, $isCalculoEspecifico) {
|
|
|
|
$media = $material->total / ($isCalculoEspecifico ? $material->meses_consumo : $intervaloMeses);
|
|
$material->media = number_format($media, 2, ',', '.');
|
|
|
|
$totalizadores->total += $material->total;
|
|
$totalizadores->saldo_atual += $material->saldo_atual;
|
|
});
|
|
|
|
return compact('materiais', 'totalizadores');
|
|
}
|
|
|
|
public static function list()
|
|
{
|
|
$data = (object) [
|
|
'additionals' => [],
|
|
'form' => [],
|
|
'model' => [],
|
|
];
|
|
|
|
$params = self::getParams();
|
|
|
|
$sets = [
|
|
'periodo' => function () use ($data) {
|
|
|
|
$data->model['periodo'] = ['start' => null, 'end' => null];
|
|
},
|
|
'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'];
|
|
},
|
|
'unidade_requisitante' => function () use ($data, $params) {
|
|
|
|
$unidadesRequisitantesData = self::getUnidadesRequisitantesData($params);
|
|
|
|
$data->form['unidades_requisitantes'] = $unidadesRequisitantesData['form'];
|
|
$data->model['unidade_requisitante_id'] = $params->unidade_requisitante_id = $unidadesRequisitantesData['model'];
|
|
},
|
|
'infraestrutura_requisitante' => function () use ($data, $params) {
|
|
|
|
$infraestruturasRequisitantesData = self::getInfraestruturasRequisitantesData($params);
|
|
|
|
$data->form['infraestruturas_requisitantes'] = $infraestruturasRequisitantesData['form'];
|
|
$data->model['infraestrutura_requisitante_id'] = $params->infraestrutura_requisitante_id = $infraestruturasRequisitantesData['model'];
|
|
},
|
|
'centro_custo_requisitante' => function () use ($data, $params) {
|
|
|
|
$centrosDeCustoRequisitantesData = self::getCentrosDeCustoRequisitantesData($params);
|
|
|
|
$data->form['centros_custo_requisitantes'] = $centrosDeCustoRequisitantesData['form'];
|
|
$data->model['centro_custo_requisitante_id'] = $params->centro_custo_requisitante_id = $centrosDeCustoRequisitantesData['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, $params) {
|
|
|
|
$data->model['material'] = $params->material_id = null;
|
|
},
|
|
'tipo_calculo' => function () use ($data, $params) {
|
|
|
|
$tiposCalculoData = self::getTiposCalculoData();
|
|
|
|
$data->form['tipos_calculo'] = $tiposCalculoData['form'];
|
|
$data->model['tipo_calculo'] = $params->tipo_calculo ?? $tiposCalculoData['model'];
|
|
},
|
|
];
|
|
|
|
$load = is_null(request()->load_from);
|
|
|
|
if ($load) {
|
|
|
|
$data->additionals = [
|
|
'data_atual' => Carbon::now()->format('d/m/Y'),
|
|
];
|
|
}
|
|
|
|
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([
|
|
'periodo',
|
|
'unidade_id',
|
|
'infraestrutura_id',
|
|
'centro_custo_id',
|
|
'unidade_requisitante_id',
|
|
'infraestrutura_requisitante_id',
|
|
'centro_custo_requisitante_id',
|
|
'grupo_id',
|
|
'subgrupo_id',
|
|
'tipo_calculo',
|
|
]);
|
|
|
|
if (isset($params->periodo)
|
|
&& !is_null($params->periodo['start'])
|
|
&& !is_null($params->periodo['end'])
|
|
) {
|
|
|
|
$start = Carbon::createFromFormat('d/m/Y', $params->periodo['start'])->setTime(0, 0, 0);
|
|
$end = Carbon::createFromFormat('d/m/Y', $params->periodo['end'])->setTime(23, 59, 59);
|
|
|
|
$params->periodo['start'] = $start;
|
|
$params->periodo['end'] = $end;
|
|
}
|
|
else {
|
|
|
|
$params->periodo = null;
|
|
}
|
|
|
|
return $params;
|
|
}
|
|
|
|
private static function getUnidadesData($params)
|
|
{
|
|
$unidades = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params->periodo)) {
|
|
|
|
$unidades = Unidade::setEagerLoads([])
|
|
->whereHas('infraestruturas', fn ($q) => $q
|
|
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCustoAlmoxarifado($q, $params))
|
|
)
|
|
->orderBy('nome_fantasia')
|
|
->get(['id', 'nome_fantasia']);
|
|
}
|
|
|
|
return ['form' => $unidades, 'model' => $id];
|
|
}
|
|
|
|
private static function getInfraestruturasData($params)
|
|
{
|
|
$infraestruturas = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params->periodo) && !is_null($params->unidade_id)) {
|
|
|
|
$infraestruturas = Infraestrutura::setEagerLoads([])
|
|
->where('unidade_id', $params->unidade_id)
|
|
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCustoAlmoxarifado($q, $params))
|
|
->get(['id', 'nome', 'principal', 'unidade_id'])
|
|
->map(fn ($i) => ['id' => $i->id, 'nome' => $i->nome])
|
|
->sortBy('nome')
|
|
->values();
|
|
}
|
|
|
|
return ['form' => $infraestruturas, 'model' => $id];
|
|
}
|
|
|
|
private static function getCentrosDeCustoData($params)
|
|
{
|
|
$centrosCusto = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params->periodo) && !is_null($params->infraestrutura_id)) {
|
|
|
|
$centrosCusto = CentroCusto::setEagerLoads([])
|
|
->where('infraestrutura_id', $params->infraestrutura_id)
|
|
->where(fn ($q) => self::setWhereForFilterCentroCustoAlmoxarifado($q, $params))
|
|
->get(['id', 'setor_id'])
|
|
->map(fn ($cc) => [
|
|
'id' => $cc->id,
|
|
'setor_nome' => $cc->setor()->setEagerLoads([])->first(['nome'])->nome
|
|
])
|
|
->sortBy('setor_nome')
|
|
->values();
|
|
}
|
|
|
|
return ['form' => $centrosCusto, 'model' => $id];
|
|
}
|
|
|
|
private static function setWhereForFilterCentroCustoAlmoxarifado($query, $params)
|
|
{
|
|
return $query->whereHas('almoxarifadoSaidas', fn ($q) => $q
|
|
->where('finalizada', true)
|
|
->whereBetween('created_at', $params->periodo)
|
|
->whereHas('itens', fn ($q) => $q->whereNull('estornado_em'))
|
|
->where(fn ($q) => $q
|
|
->whereIn('tipo_id', [SaidaTipo::MANUAL, SaidaTipo::DISPENSACAO_FARMACIA])
|
|
->orWhere(fn ($q) => $q
|
|
->where('tipo_id', SaidaTipo::BAIXA)
|
|
->whereHas('baixa', fn ($q) => $q
|
|
->whereHas('motivo', fn ($q) => $q
|
|
->where('tipo_id', MotivoBaixaTipo::CONSUMO_INTERNO)
|
|
)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('tipo_id', SaidaTipo::REQUISICAO)
|
|
->whereHas('requisicaoResposta', fn ($q) => $q
|
|
->where('status_id', RequisicaoRespostaStatus::RECEBIDA)
|
|
->whereHas('itens', fn ($q) => $q
|
|
->whereHas('recebimentos', fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('controlava_estoque')
|
|
->orWhere('controlava_estoque', false)
|
|
)
|
|
->where('quantidade', '>', 0)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
private static function getUnidadesRequisitantesData($params)
|
|
{
|
|
$unidades = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params->periodo)) {
|
|
|
|
$unidades = Unidade::setEagerLoads([])
|
|
->whereHas('infraestruturas', fn ($q) => $q
|
|
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCustoRequisitante($q, $params))
|
|
)
|
|
->orderBy('nome_fantasia')
|
|
->get(['id', 'nome_fantasia']);
|
|
}
|
|
|
|
return ['form' => $unidades, 'model' => $id];
|
|
}
|
|
|
|
private static function getInfraestruturasRequisitantesData($params)
|
|
{
|
|
$infraestruturas = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params->periodo) && !is_null($params->unidade_requisitante_id)) {
|
|
|
|
$infraestruturas = Infraestrutura::setEagerLoads([])
|
|
->where('unidade_id', $params->unidade_requisitante_id)
|
|
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCustoRequisitante($q, $params))
|
|
->get(['id', 'nome', 'principal', 'unidade_id'])
|
|
->map(fn ($i) => ['id' => $i->id, 'nome' => $i->nome])
|
|
->sortBy('nome')
|
|
->values();
|
|
}
|
|
|
|
return ['form' => $infraestruturas, 'model' => $id];
|
|
}
|
|
|
|
private static function getCentrosDeCustoRequisitantesData($params)
|
|
{
|
|
$centrosCusto = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params->periodo) && !is_null($params->infraestrutura_requisitante_id)) {
|
|
|
|
$centrosCusto = CentroCusto::setEagerLoads([])
|
|
->where('infraestrutura_id', $params->infraestrutura_requisitante_id)
|
|
->where(fn ($q) => self::setWhereForFilterCentroCustoRequisitante($q, $params))
|
|
->get(['id', 'setor_id'])
|
|
->map(fn ($cc) => [
|
|
'id' => $cc->id,
|
|
'setor_nome' => $cc->setor()->setEagerLoads([])->first(['nome'])->nome
|
|
])
|
|
->sortBy('setor_nome')
|
|
->values();
|
|
}
|
|
|
|
return ['form' => $centrosCusto, 'model' => $id];
|
|
}
|
|
|
|
private static function setWhereForFilterCentroCustoRequisitante($query, $params)
|
|
{
|
|
return $query->whereHas('almoxarifadoSaidaRequisicoes', fn ($q) => $q
|
|
->whereHas('saida', fn ($q) =>
|
|
self::setWhereForSelectedCentroCustoAlmoxarifado($q, $params)
|
|
->where('finalizada', true)
|
|
->whereBetween('created_at', $params->periodo)
|
|
->whereHas('itens', fn ($q) => $q->whereNull('estornado_em'))
|
|
)
|
|
)
|
|
->orWhereHas('almoxarifadoRequisicoesRequisitante', fn ($q) => $q
|
|
->whereHas('respostas', fn ($q) => $q
|
|
->where('status_id', RequisicaoRespostaStatus::RECEBIDA)
|
|
->whereHas('saida', fn ($q) =>
|
|
self::setWhereForSelectedCentroCustoAlmoxarifado($q, $params)
|
|
->where('finalizada', true)
|
|
->whereBetween('created_at', $params->periodo)
|
|
->whereHas('itens', fn ($q) => $q->whereNull('estornado_em'))
|
|
)
|
|
->whereHas('itens', fn ($q) => $q
|
|
->whereHas('recebimentos', fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('controlava_estoque')
|
|
->orWhere('controlava_estoque', false)
|
|
)
|
|
->where('quantidade', '>', 0)
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
private static function getGruposData($params)
|
|
{
|
|
$grupos = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params->periodo)) {
|
|
|
|
$grupos = Grupo::setEagerLoads([])
|
|
->whereHas('materiais', fn ($q) => self::setWhereForFilterMaterial($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->periodo) && !is_null($params->grupo_id)) {
|
|
|
|
$subgrupos = Subgrupo::setEagerLoads([])
|
|
->where('grupo_id', $params->grupo_id)
|
|
->whereHas('materiais', fn ($q) => self::setWhereForFilterMaterial($q, $params))
|
|
->orderBy('nome')
|
|
->get(['id', 'nome']);
|
|
}
|
|
|
|
return ['form' => $subgrupos, 'model' => $id];
|
|
}
|
|
|
|
public static function autocompleteMaterial()
|
|
{
|
|
$params = self::getParams();
|
|
|
|
$materiais = Material::setEagerLoads([])
|
|
->when($params->grupo_id, fn ($q, $grupoId) => $q->where('grupo_id', $grupoId))
|
|
->when($params->subgrupo_id, fn ($q, $subgrupoId) => $q->where('subgrupo_id', $subgrupoId))
|
|
->where(fn ($q) => self::setWhereForFilterMaterial($q, $params))
|
|
->getQuery()
|
|
->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'
|
|
)
|
|
->select(
|
|
'cadastro_material.id',
|
|
'cadastro_material.codigo_material',
|
|
'cadastro_material.descricao',
|
|
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
|
'cadastro_material',
|
|
'cadastro_apresentacao',
|
|
'apresentacao_unidade_medida'
|
|
) . " as descricao"),
|
|
);
|
|
|
|
return $materiais;
|
|
}
|
|
|
|
public static function setWhereForFilterMaterial($query, $params)
|
|
{
|
|
return $query->whereHas('almoxarifadoSaidaItens', fn ($q) => $q
|
|
->whereNull('estornado_em')
|
|
->whereHas('saida', fn ($q) =>
|
|
self::setWhereForSelectedCentroCustoAlmoxarifado($q, $params)
|
|
->where('finalizada', true)
|
|
->whereBetween('created_at', $params->periodo)
|
|
->where(fn ($q) => $q
|
|
->when(is_null($params->unidade_requisitante_id)
|
|
&& is_null($params->infraestrutura_requisitante_id)
|
|
&& is_null($params->centro_custo_requisitante_id),
|
|
fn ($q) => $q
|
|
->where('tipo_id', SaidaTipo::DISPENSACAO_FARMACIA)
|
|
->orWhere(fn ($q) => $q
|
|
->where('tipo_id', SaidaTipo::BAIXA)
|
|
->whereHas('baixa', fn ($q) => $q
|
|
->whereHas('motivo', fn ($q) => $q
|
|
->where('tipo_id', MotivoBaixaTipo::CONSUMO_INTERNO)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('tipo_id', SaidaTipo::MANUAL)
|
|
->whereHas('requisicao', fn ($q) =>
|
|
self::setWhereForSelectedCentroCustoRequisitante($q, $params, 'centro_custo_id')
|
|
)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('tipo_id', SaidaTipo::REQUISICAO)
|
|
->whereHas('requisicaoResposta', fn ($q) => $q
|
|
->where('status_id', RequisicaoRespostaStatus::RECEBIDA)
|
|
->whereHas('requisicao', fn ($q) =>
|
|
self::setWhereForSelectedCentroCustoRequisitante($q, $params, 'created_centro_custo_id')
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->doesntHave('requisicaoRespostaItem')
|
|
->orWhereHas('requisicaoRespostaItem', fn ($q) => $q
|
|
->whereHas('recebimentos', fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->whereNull('controlava_estoque')
|
|
->orWhere('controlava_estoque', false)
|
|
)
|
|
->where('quantidade', '>', 0)
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
private static function setWhereForSelectedCentroCustoAlmoxarifado($query, $params)
|
|
{
|
|
return $query->when($params->centro_custo_id,
|
|
fn ($q, $centroCustoId) => $q->where('centro_custo_id', $centroCustoId),
|
|
fn ($q) => $q->when(!is_null($params->infraestrutura_id) || !is_null($params->unidade_id),
|
|
fn ($q) => $q->whereHas('centroCusto', fn ($q) => $q
|
|
->when($params->infraestrutura_id,
|
|
fn ($q, $infraestruturaId) => $q->where('infraestrutura_id', $infraestruturaId),
|
|
fn ($q) => $q->whereHas('infraestrutura', fn ($q) => $q
|
|
->where('unidade_id', $params->unidade_id))
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
private static function setWhereForSelectedCentroCustoRequisitante($query, $params, $centroCustoField)
|
|
{
|
|
return $query->when($params->centro_custo_requisitante_id,
|
|
fn ($q, $centroCustoId) => $q->where($centroCustoField, $centroCustoId),
|
|
fn ($q) => $q->when(!is_null($params->infraestrutura_requisitante_id) || !is_null($params->unidade_requisitante_id),
|
|
fn ($q) => $q->whereHas('centroCusto', fn ($q) => $q
|
|
->when($params->infraestrutura_requisitante_id,
|
|
fn ($q, $infraestruturaId) => $q->where('infraestrutura_id', $infraestruturaId),
|
|
fn ($q) => $q->whereHas('infraestrutura', fn ($q) => $q
|
|
->where('unidade_id', $params->unidade_requisitante_id))
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
private static function getTiposCalculoData()
|
|
{
|
|
return ['form' => self::getTiposCalculo(), 'model' => 'simples'];
|
|
}
|
|
|
|
private static function getTiposCalculo()
|
|
{
|
|
return collect([
|
|
(object) ['value' => 'especifico', 'text' => 'ESPECÍFICO'],
|
|
(object) ['value' => 'simples', 'text' => 'SIMPLES'],
|
|
]);
|
|
}
|
|
|
|
public static function getPrintExportData()
|
|
{
|
|
$resultado = self::index();
|
|
$itens = $resultado['materiais'];
|
|
|
|
$unidade = Unidade::find(request()->unidade_id);
|
|
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
|
|
$centroCusto = CentroCusto::find(request()->centro_custo_id);
|
|
$unidadeRequisitante = Unidade::find(request()->unidade_requisitante_id);
|
|
$infraestruturaRequisitante = Infraestrutura::find(request()->infraestrutura_requisitante_id);
|
|
$centroCustoRequisitante = CentroCusto::find(request()->centro_custo_requisitante_id);
|
|
$grupo = Grupo::find(request()->grupo_id);
|
|
$subgrupo = Subgrupo::find(request()->subgrupo_id);
|
|
$material = Material::find(request()->material_id);
|
|
$tipoCalculo = self::getTiposCalculo()->where('value', request()->tipo_calculo)->first();
|
|
|
|
return [
|
|
'inicio' => request()->periodo['start'],
|
|
'fim' => request()->periodo['end'],
|
|
'unidade' => $unidade->nome_fantasia ?? 'Todas',
|
|
'infraestrutura' => $infraestrutura->nome ?? 'Todos',
|
|
'setor' => $centroCusto->setor->nome ?? 'Todos',
|
|
'unidadeRequisitante' => $unidadeRequisitante->nome_fantasia ?? 'Todas',
|
|
'infraestruturaRequisitante' => $infraestruturaRequisitante->nome ?? 'Todos',
|
|
'setorRequisitante' => $centroCustoRequisitante->setor->nome ?? 'Todos',
|
|
'grupo' => $grupo->nome ?? 'Todos',
|
|
'subgrupo' => $subgrupo->nome ?? 'Todos',
|
|
'material' => $material->descricao_completa ?? 'Todos',
|
|
'tipoCalculo' => $tipoCalculo->text,
|
|
'colunas' => collect(request()->selectedCols),
|
|
'itens' => $itens,
|
|
'totalizadores' => $resultado['totalizadores'],
|
|
];
|
|
}
|
|
}
|