This commit is contained in:
@@ -0,0 +1,240 @@
|
||||
<?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',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,869 @@
|
||||
<?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'],
|
||||
];
|
||||
}
|
||||
}
|
||||
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',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,272 @@
|
||||
<?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'],
|
||||
];
|
||||
}
|
||||
}
|
||||
394
api/app/Services/Almoxarifado/Relatorios/EstornoSaidaService.php
Normal file
394
api/app/Services/Almoxarifado/Relatorios/EstornoSaidaService.php
Normal file
@@ -0,0 +1,394 @@
|
||||
<?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'],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,921 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Almoxarifado\Relatorios;
|
||||
|
||||
use App\Enums\Almoxarifado\EntradaTipo;
|
||||
use App\Enums\Almoxarifado\SaidaTipo;
|
||||
use App\Services\Cadastro\Material\MaterialService;
|
||||
use App\Services\Service;
|
||||
use App\Utils\DataUtil;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MovimentacaoGeralService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
$params = self::getParams();
|
||||
|
||||
$itens = collect();
|
||||
|
||||
if ($params->movimentacao_tipo === 'entrada') {
|
||||
$itens = DB::table('almoxarifado_entrada_item')
|
||||
->select([
|
||||
'almoxarifado_entrada_item.id AS entrada_item_id',
|
||||
DB::raw("DATE_FORMAT(almoxarifado_entrada.created_at, '%d/%m/%Y') AS data_movimentacao"),
|
||||
'almoxarifado_entrada_tipo.id AS movimentacao_subtipo_id',
|
||||
'almoxarifado_entrada_tipo.nome AS movimentacao_subtipo_nome',
|
||||
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
|
||||
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
|
||||
'cadastro_setor.nome AS setor_nome',
|
||||
'cadastro_cidadao.nome AS usuario_nome',
|
||||
'cadastro_material.codigo_material AS material_codigo',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'cadastro_unidade_medida'
|
||||
) . ' AS material_descricao'),
|
||||
'cadastro_grupo.nome AS grupo_nome',
|
||||
'almoxarifado_entrada_item.quantidade',
|
||||
'almoxarifado_entrada_item.valor_unitario',
|
||||
'almoxarifado_entrada_item.valor_total',
|
||||
'almoxarifado_entrada_item.lote',
|
||||
DB::raw("DATE_FORMAT(almoxarifado_entrada_item.validade_lote, '%d/%m/%Y') AS validade_lote"),
|
||||
'almoxarifado_entrada_documento.numero AS documento_numero',
|
||||
'cadastro_fornecedor.nome_fantasia AS fornecedor_nome_fantasia',
|
||||
'cadastro_origem_programatica.nome AS origem_programatica_nome',
|
||||
])
|
||||
->join('cadastro_material', 'cadastro_material.id', 'almoxarifado_entrada_item.material_id')
|
||||
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
|
||||
->join('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id')
|
||||
->join('cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
|
||||
->join('almoxarifado_entrada_tipo', 'almoxarifado_entrada_tipo.id', 'almoxarifado_entrada.tipo_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')
|
||||
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
|
||||
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'almoxarifado_entrada.created_lotacao_id')
|
||||
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
||||
->leftJoin('almoxarifado_entrada_documento', 'almoxarifado_entrada_documento.entrada_id', 'almoxarifado_entrada.id')
|
||||
->leftJoin('cadastro_fornecedor', 'cadastro_fornecedor.id', 'almoxarifado_entrada_documento.fornecedor_id')
|
||||
->leftJoin('cadastro_origem_programatica', 'cadastro_origem_programatica.id', 'almoxarifado_entrada_documento.origem_programatica_id')
|
||||
->whereBetween('almoxarifado_entrada.created_at', $params->periodo)
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_entrada.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id))
|
||||
->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id))
|
||||
->when($params->setor_id, fn ($q) => $q->where('cadastro_centro_custo.setor_id', $params->setor_id))
|
||||
->when($params->usuario_id, fn ($q) => $q->where('cadastro_lotacao.usuario_id', $params->usuario_id))
|
||||
->when($params->origem_programatica_id, fn ($q) => $q->where('almoxarifado_entrada_documento.origem_programatica_id', $params->origem_programatica_id))
|
||||
->when($params->material_id, fn ($q) => $q->where('almoxarifado_entrada_item.material_id', $params->material_id));
|
||||
} else {
|
||||
$itens = DB::table('almoxarifado_saida_item_entrada_item')
|
||||
->select([
|
||||
'almoxarifado_saida.id AS saida_id',
|
||||
'almoxarifado_saida_item.id AS saida_item_id',
|
||||
DB::raw("DATE_FORMAT(almoxarifado_saida.created_at, '%d/%m/%Y') AS data_movimentacao"),
|
||||
'almoxarifado_saida_tipo.id AS movimentacao_subtipo_id',
|
||||
'almoxarifado_saida_tipo.nome AS movimentacao_subtipo_nome',
|
||||
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
|
||||
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
|
||||
'cadastro_setor.nome AS setor_nome',
|
||||
'cadastro_cidadao.nome AS usuario_nome',
|
||||
'cadastro_material.codigo_material AS material_codigo',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'cadastro_unidade_medida'
|
||||
) . ' AS material_descricao'),
|
||||
'cadastro_grupo.nome AS grupo_nome',
|
||||
'almoxarifado_saida_item_entrada_item.quantidade_saida AS quantidade',
|
||||
'almoxarifado_entrada_item.valor_unitario',
|
||||
DB::raw("(almoxarifado_saida_item_entrada_item.quantidade_saida * almoxarifado_entrada_item.valor_unitario) AS valor_total"),
|
||||
'almoxarifado_entrada_item.lote',
|
||||
DB::raw("DATE_FORMAT(almoxarifado_entrada_item.validade_lote, '%d/%m/%Y') AS validade_lote"),
|
||||
'almoxarifado_entrada_documento.numero AS documento_numero',
|
||||
'cadastro_fornecedor.nome_fantasia AS fornecedor_nome_fantasia',
|
||||
'cadastro_origem_programatica.nome AS origem_programatica_nome',
|
||||
])
|
||||
->join('almoxarifado_saida_item', 'almoxarifado_saida_item.id', 'almoxarifado_saida_item_entrada_item.saida_item_id')
|
||||
->join('cadastro_material', 'cadastro_material.id', 'almoxarifado_saida_item.material_id')
|
||||
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
|
||||
->join('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id')
|
||||
->join('cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id')
|
||||
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_saida_item.saida_id')
|
||||
->join('almoxarifado_saida_tipo', 'almoxarifado_saida_tipo.id', 'almoxarifado_saida.tipo_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_saida.centro_custo_id')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
|
||||
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'almoxarifado_saida.created_lotacao_id')
|
||||
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
||||
->join('almoxarifado_entrada_item', 'almoxarifado_entrada_item.id', 'almoxarifado_saida_item_entrada_item.entrada_item_id')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
|
||||
->leftJoin('almoxarifado_entrada_documento', 'almoxarifado_entrada_documento.entrada_id', 'almoxarifado_entrada.id')
|
||||
->leftJoin('cadastro_fornecedor', 'cadastro_fornecedor.id', 'almoxarifado_entrada_documento.fornecedor_id')
|
||||
->leftJoin('cadastro_origem_programatica', 'cadastro_origem_programatica.id', 'almoxarifado_entrada_documento.origem_programatica_id')
|
||||
->whereBetween('almoxarifado_saida.created_at', $params->periodo)
|
||||
->where('almoxarifado_saida.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_saida.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id))
|
||||
->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id))
|
||||
->when($params->setor_id, fn ($q) => $q->where('cadastro_centro_custo.setor_id', $params->setor_id))
|
||||
->when($params->usuario_id, fn ($q) => $q->where('cadastro_lotacao.usuario_id', $params->usuario_id))
|
||||
->when($params->origem_programatica_id, fn ($q) => $q->where('almoxarifado_entrada_documento.origem_programatica_id', $params->origem_programatica_id))
|
||||
->when($params->material_id, fn ($q) => $q->where('almoxarifado_saida_item.material_id', $params->material_id));
|
||||
}
|
||||
|
||||
$camposOrigem = collect([
|
||||
'unidade_origem_nome_fantasia',
|
||||
'infraestrutura_origem_nome',
|
||||
'usuario_solicitante_nome',
|
||||
]);
|
||||
|
||||
$camposDestino = collect([
|
||||
'unidade_destino_nome_fantasia',
|
||||
'infraestrutura_destino_nome',
|
||||
'usuario_destino_nome',
|
||||
]);
|
||||
|
||||
if (is_null(request()->sort_by)
|
||||
|| (!$camposOrigem->contains(request()->sort_by) && !$camposDestino->contains(request()->sort_by))
|
||||
) {
|
||||
|
||||
self::setOrderBy($itens);
|
||||
}
|
||||
|
||||
if ($params->movimentacao_tipo === 'entrada') {
|
||||
$itens = $itens->get()
|
||||
->map(function($query) {
|
||||
if ($query->movimentacao_subtipo_id === EntradaTipo::REQUISICAO) {
|
||||
$centroCustoOrigem = DB::table('cadastro_centro_custo')
|
||||
->select([
|
||||
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
|
||||
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
|
||||
])
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_requisicao_resposta_item_entrada_item')
|
||||
->join('almoxarifado_requisicao_resposta_item', 'almoxarifado_requisicao_resposta_item.id', 'almoxarifado_requisicao_resposta_item_entrada_item.requisicao_resposta_item_id')
|
||||
->join('almoxarifado_requisicao_resposta', 'almoxarifado_requisicao_resposta.id', 'almoxarifado_requisicao_resposta_item.requisicao_resposta_id')
|
||||
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_requisicao_resposta.saida_id')
|
||||
->where('almoxarifado_requisicao_resposta_item_entrada_item.entrada_item_id', $query->entrada_item_id)
|
||||
->whereColumn('almoxarifado_saida.centro_custo_id', 'cadastro_centro_custo.id')
|
||||
)
|
||||
->first();
|
||||
|
||||
$query->unidade_origem_nome_fantasia = $centroCustoOrigem->unidade_nome_fantasia ?? '-';
|
||||
$query->infraestrutura_origem_nome = $centroCustoOrigem->infraestrutura_nome ?? '-';
|
||||
|
||||
$lotacaoSolicitante = DB::table('cadastro_usuario')
|
||||
->select(['cadastro_cidadao.nome AS usuario_nome'])
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_requisicao_resposta_item_entrada_item')
|
||||
->join('almoxarifado_requisicao_resposta_item', 'almoxarifado_requisicao_resposta_item.id', 'almoxarifado_requisicao_resposta_item_entrada_item.requisicao_resposta_item_id')
|
||||
->join('almoxarifado_requisicao_resposta', 'almoxarifado_requisicao_resposta.id', 'almoxarifado_requisicao_resposta_item.requisicao_resposta_id')
|
||||
->join('almoxarifado_requisicao', 'almoxarifado_requisicao.id', 'almoxarifado_requisicao_resposta.requisicao_id')
|
||||
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'almoxarifado_requisicao.created_lotacao_id')
|
||||
->where('almoxarifado_requisicao_resposta_item_entrada_item.entrada_item_id', $query->entrada_item_id)
|
||||
->whereColumn('cadastro_lotacao.usuario_id', 'cadastro_usuario.id')
|
||||
)
|
||||
->first();
|
||||
|
||||
$query->usuario_solicitante_nome = $lotacaoSolicitante->usuario_nome ?? '-';
|
||||
}
|
||||
else if ($query->movimentacao_subtipo_id === EntradaTipo::TRANSFERENCIA) {
|
||||
$centroCustoOrigem = DB::table('cadastro_centro_custo')
|
||||
->select([
|
||||
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
|
||||
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
|
||||
])
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida_item_entrada_item_transferencia')
|
||||
->join('almoxarifado_saida_item', 'almoxarifado_saida_item.id', 'almoxarifado_saida_item_entrada_item_transferencia.saida_item_origem_id')
|
||||
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_saida_item.saida_id')
|
||||
->where('almoxarifado_saida_item_entrada_item_transferencia.entrada_item_destino_id', $query->entrada_item_id)
|
||||
->whereColumn('almoxarifado_saida.centro_custo_id', 'cadastro_centro_custo.id')
|
||||
)
|
||||
->first();
|
||||
|
||||
$query->unidade_origem_nome_fantasia = $centroCustoOrigem->unidade_nome_fantasia ?? '-';
|
||||
$query->infraestrutura_origem_nome = $centroCustoOrigem->infraestrutura_nome ?? '-';
|
||||
} else {
|
||||
$query->unidade_origem_nome_fantasia = '-';
|
||||
$query->infraestrutura_origem_nome = '-';
|
||||
$query->usuario_solicitante_nome = '-';
|
||||
}
|
||||
|
||||
return $query;
|
||||
});
|
||||
|
||||
if ($camposOrigem->contains(request()->sort_by)) {
|
||||
|
||||
$itens = $itens->sortBy([
|
||||
[request()->sort_by, DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc) ? 'desc' : 'asc'],
|
||||
['entrada_item_id', 'asc']
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
$itens = $itens->get()
|
||||
->map(function($query) {
|
||||
if ($query->movimentacao_subtipo_id === SaidaTipo::MANUAL) {
|
||||
$centroCustoDestino = DB::table('cadastro_centro_custo')
|
||||
->select([
|
||||
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
|
||||
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
|
||||
])
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida_requisicao')
|
||||
->where('almoxarifado_saida_requisicao.saida_id', $query->saida_id)
|
||||
->whereColumn('almoxarifado_saida_requisicao.centro_custo_id', 'cadastro_centro_custo.id')
|
||||
)
|
||||
->first();
|
||||
|
||||
$query->unidade_destino_nome_fantasia = $centroCustoDestino->unidade_nome_fantasia ?? null;
|
||||
$query->infraestrutura_destino_nome = $centroCustoDestino->infraestrutura_nome ?? null;
|
||||
|
||||
$usuarioDestino = DB::table('cadastro_usuario')
|
||||
->select(['cadastro_cidadao.nome AS usuario_nome'])
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida_requisicao')
|
||||
->where('almoxarifado_saida_requisicao.saida_id', $query->saida_id)
|
||||
->whereColumn('almoxarifado_saida_requisicao.usuario_id', 'cadastro_usuario.id')
|
||||
)
|
||||
->first();
|
||||
|
||||
$query->usuario_destino_nome = $usuarioDestino->usuario_nome ?? null;
|
||||
}
|
||||
else if ($query->movimentacao_subtipo_id === SaidaTipo::REQUISICAO) {
|
||||
$centroCustoDestino = DB::table('cadastro_centro_custo')
|
||||
->select([
|
||||
'cadastro_unidade.nome_fantasia AS unidade_origem_nome_fantasia',
|
||||
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_origem_nome"),
|
||||
])
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_requisicao_resposta')
|
||||
->join('almoxarifado_requisicao', 'almoxarifado_requisicao.id', 'almoxarifado_requisicao_resposta.requisicao_id')
|
||||
->where('almoxarifado_requisicao_resposta.saida_id', $query->saida_id)
|
||||
->whereColumn('almoxarifado_requisicao.created_centro_custo_id', 'cadastro_centro_custo.id')
|
||||
)
|
||||
->first();
|
||||
|
||||
$query->unidade_destino_nome_fantasia = $centroCustoDestino->unidade_nome_fantasia ?? '-';
|
||||
$query->infraestrutura_destino_nome = $centroCustoDestino->infraestrutura_nome ?? '-';
|
||||
|
||||
$lotacaoDestino = DB::table('cadastro_usuario')
|
||||
->select(['cadastro_cidadao.nome AS usuario_nome'])
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_requisicao_resposta')
|
||||
->join('almoxarifado_requisicao', 'almoxarifado_requisicao.id', 'almoxarifado_requisicao_resposta.requisicao_id')
|
||||
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'almoxarifado_requisicao.created_lotacao_id')
|
||||
->where('almoxarifado_requisicao_resposta.saida_id', $query->saida_id)
|
||||
->whereColumn('cadastro_lotacao.usuario_id', 'cadastro_usuario.id')
|
||||
)
|
||||
->first();
|
||||
|
||||
$query->usuario_destino_nome = $lotacaoDestino->usuario_nome ?? '-';
|
||||
}
|
||||
else if ($query->movimentacao_subtipo_id === SaidaTipo::TRANSFERENCIA) {
|
||||
$centroCustoDestino = DB::table('cadastro_centro_custo')
|
||||
->select([
|
||||
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
|
||||
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
|
||||
])
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida_transferencia')
|
||||
->where('almoxarifado_saida_transferencia.saida_id', $query->saida_id)
|
||||
->whereColumn('almoxarifado_saida_transferencia.centro_custo_id', 'cadastro_centro_custo.id')
|
||||
)
|
||||
->first();
|
||||
|
||||
$query->unidade_destino_nome_fantasia = $centroCustoDestino->unidade_nome_fantasia ?? '-';
|
||||
$query->infraestrutura_destino_nome = $centroCustoDestino->infraestrutura_nome ?? '-';
|
||||
} else {
|
||||
$query->unidade_destino_nome_fantasia = '-';
|
||||
$query->infraestrutura_destino_nome = '-';
|
||||
$query->usuario_destino_nome = '-';
|
||||
}
|
||||
|
||||
return $query;
|
||||
});
|
||||
|
||||
if ($camposDestino->contains(request()->sort_by)) {
|
||||
|
||||
$itens = $itens->sortBy([
|
||||
[request()->sort_by, DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc) ? 'desc' : 'asc'],
|
||||
['saida_item_id', 'asc']
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return $itens;
|
||||
}
|
||||
|
||||
public static function create()
|
||||
{
|
||||
return [
|
||||
'additionals' => [
|
||||
'data_atual' => Carbon::now()->format('d/m/Y'),
|
||||
],
|
||||
'form' => [
|
||||
'movimentacao_tipos' => [],
|
||||
'movimentacao_subtipos' => [],
|
||||
'unidades' => [],
|
||||
'infraestruturas' => [],
|
||||
'setores' => [],
|
||||
'usuarios' => [],
|
||||
'origens_programaticas' => [],
|
||||
],
|
||||
'model' => [
|
||||
'periodo' => ['start' => null, 'end' => null],
|
||||
'movimentacao_tipo' => null,
|
||||
'movimentacao_subtipo_id' => null,
|
||||
'unidade_id' => null,
|
||||
'infraestrutura_id' => null,
|
||||
'setor_id' => null,
|
||||
'usuario_id' => null,
|
||||
'origem_programatica_id' => null,
|
||||
'material' => null,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
$params = self::getParams();
|
||||
|
||||
switch (request()->listar) {
|
||||
case 'movimentacao-tipos': {
|
||||
return [
|
||||
'movimentacao-tipos' => self::getMovimentacaoTipos($params),
|
||||
'usuarios' => self::getUsuarios($params),
|
||||
'origens_programaticas' => self::getOrigensProgramaticas($params),
|
||||
];
|
||||
}
|
||||
case 'movimentacao-subtipos': {
|
||||
return [
|
||||
'movimentacao-subtipos' => self::getMovimentacaoSubtipos($params),
|
||||
'unidades' => self::getUnidades($params),
|
||||
'usuarios' => self::getUsuarios($params),
|
||||
'origens_programaticas' => self::getOrigensProgramaticas($params),
|
||||
];
|
||||
}
|
||||
case 'unidades': {
|
||||
return [
|
||||
'unidades' => self::getUnidades($params),
|
||||
'usuarios' => self::getUsuarios($params),
|
||||
'origens_programaticas' => self::getOrigensProgramaticas($params),
|
||||
];
|
||||
}
|
||||
case 'infraestruturas': {
|
||||
return [
|
||||
'infraestruturas' => self::getInfraestruturas($params),
|
||||
'usuarios' => self::getUsuarios($params),
|
||||
'origens_programaticas' => self::getOrigensProgramaticas($params),
|
||||
];
|
||||
}
|
||||
case 'setores': {
|
||||
return [
|
||||
'setores' => self::getSetores($params),
|
||||
'usuarios' => self::getUsuarios($params),
|
||||
'origens_programaticas' => self::getOrigensProgramaticas($params),
|
||||
];
|
||||
}
|
||||
case 'usuarios': {
|
||||
return [
|
||||
'usuarios' => self::getUsuarios($params),
|
||||
'origens_programaticas' => self::getOrigensProgramaticas($params),
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function autocomplete()
|
||||
{
|
||||
$params = self::getParams();
|
||||
|
||||
$materiais = null;
|
||||
|
||||
if ($params->movimentacao_tipo === 'entrada') {
|
||||
$materiais = DB::table('cadastro_material')
|
||||
->select([
|
||||
'cadastro_material.id',
|
||||
'cadastro_material.codigo_material',
|
||||
'cadastro_material.descricao',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'cadastro_unidade_medida'
|
||||
) . ' AS material_descricao'),
|
||||
])
|
||||
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
|
||||
->join('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_entrada_item')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_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_lotacao', 'cadastro_lotacao.id', 'almoxarifado_entrada.created_lotacao_id')
|
||||
->leftJoin('almoxarifado_entrada_documento', 'almoxarifado_entrada_documento.entrada_id', 'almoxarifado_entrada.id')
|
||||
->whereBetween('almoxarifado_entrada.created_at', $params->periodo)
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_entrada.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id))
|
||||
->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id))
|
||||
->when($params->setor_id, fn ($q) => $q->where('cadastro_centro_custo.setor_id', $params->setor_id))
|
||||
->when($params->usuario_id, fn ($q) => $q->where('cadastro_lotacao.usuario_id', $params->usuario_id))
|
||||
->when($params->origem_programatica_id, fn ($q) => $q->where('almoxarifado_entrada_documento.origem_programatica_id', $params->origem_programatica_id))
|
||||
->whereColumn('almoxarifado_entrada_item.material_id', 'cadastro_material.id')
|
||||
)
|
||||
->orderBy('cadastro_material.descricao');
|
||||
} else {
|
||||
$materiais = DB::table('cadastro_material')
|
||||
->select([
|
||||
'cadastro_material.id',
|
||||
'cadastro_material.codigo_material',
|
||||
'cadastro_material.descricao',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'cadastro_unidade_medida'
|
||||
) . ' AS material_descricao'),
|
||||
])
|
||||
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
|
||||
->join('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida_item_entrada_item')
|
||||
->join('almoxarifado_saida_item', 'almoxarifado_saida_item.id', 'almoxarifado_saida_item_entrada_item.saida_item_id')
|
||||
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_saida_item.saida_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_saida.centro_custo_id')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'almoxarifado_saida.created_lotacao_id')
|
||||
->join('almoxarifado_entrada_item', 'almoxarifado_entrada_item.id', 'almoxarifado_saida_item_entrada_item.entrada_item_id')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
|
||||
->leftJoin('almoxarifado_entrada_documento', 'almoxarifado_entrada_documento.entrada_id', 'almoxarifado_entrada.id')
|
||||
->whereBetween('almoxarifado_saida.created_at', $params->periodo)
|
||||
->where('almoxarifado_saida.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_saida.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id))
|
||||
->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id))
|
||||
->when($params->setor_id, fn ($q) => $q->where('cadastro_centro_custo.setor_id', $params->setor_id))
|
||||
->when($params->usuario_id, fn ($q) => $q->where('cadastro_lotacao.usuario_id', $params->usuario_id))
|
||||
->when($params->origem_programatica_id, fn ($q) => $q->where('almoxarifado_entrada_documento.origem_programatica_id', $params->origem_programatica_id))
|
||||
->whereColumn('almoxarifado_saida_item.material_id', 'cadastro_material.id')
|
||||
)
|
||||
->orderBy('cadastro_material.descricao');
|
||||
}
|
||||
|
||||
return $materiais;
|
||||
}
|
||||
|
||||
private static function getParams()
|
||||
{
|
||||
return (object) [
|
||||
'periodo' => [
|
||||
'start' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['start'])->setTime(0, 0, 0),
|
||||
'end' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['end'])->setTime(23, 59, 59)
|
||||
],
|
||||
'movimentacao_tipo' => request()->get('movimentacao_tipo'),
|
||||
'movimentacao_subtipo_id' => request()->get('movimentacao_subtipo_id'),
|
||||
'unidade_id' => request()->get('unidade_id'),
|
||||
'infraestrutura_id' => request()->get('infraestrutura_id'),
|
||||
'setor_id' => request()->get('setor_id'),
|
||||
'usuario_id' => request()->get('usuario_id'),
|
||||
'origem_programatica_id' => request()->get('origem_programatica_id'),
|
||||
'material_id' => request()->get('material_id'),
|
||||
];
|
||||
}
|
||||
|
||||
private static function getMovimentacaoTipos($params)
|
||||
{
|
||||
$movimentacaoTipos = collect();
|
||||
|
||||
$hasEntrada = DB::table('almoxarifado_entrada_item')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
|
||||
->whereBetween('almoxarifado_entrada.created_at', $params->periodo)
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->exists();
|
||||
|
||||
$hasSaida = DB::table('almoxarifado_saida_item')
|
||||
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_saida_item.saida_id')
|
||||
->whereBetween('almoxarifado_saida.created_at', $params->periodo)
|
||||
->where('almoxarifado_saida.finalizada', true)
|
||||
->exists();
|
||||
|
||||
if ($hasEntrada) {
|
||||
$movimentacaoTipos->push([
|
||||
'value' => 'entrada',
|
||||
'text' => 'ENTRADA',
|
||||
]);
|
||||
}
|
||||
|
||||
if ($hasSaida) {
|
||||
$movimentacaoTipos->push([
|
||||
'value' => 'saida',
|
||||
'text' => 'SAÍDA',
|
||||
]);
|
||||
}
|
||||
|
||||
return $movimentacaoTipos->sortBy('text')->values();
|
||||
}
|
||||
|
||||
private static function getMovimentacaoSubtipos($params)
|
||||
{
|
||||
$subtipos = collect();
|
||||
|
||||
if ($params->movimentacao_tipo === 'entrada') {
|
||||
$subtipos = DB::table('almoxarifado_entrada_tipo')
|
||||
->select([
|
||||
'almoxarifado_entrada_tipo.id',
|
||||
'almoxarifado_entrada_tipo.nome',
|
||||
])
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_entrada')
|
||||
->whereBetween('almoxarifado_entrada.created_at', $params->periodo)
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->whereColumn('almoxarifado_entrada.tipo_id', 'almoxarifado_entrada_tipo.id')
|
||||
)
|
||||
->orderBy('almoxarifado_entrada_tipo.nome')
|
||||
->get();
|
||||
} else {
|
||||
$subtipos = DB::table('almoxarifado_saida_tipo')
|
||||
->select([
|
||||
'almoxarifado_saida_tipo.id',
|
||||
'almoxarifado_saida_tipo.nome',
|
||||
])
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida')
|
||||
->whereBetween('almoxarifado_saida.created_at', $params->periodo)
|
||||
->where('almoxarifado_saida.finalizada', true)
|
||||
->whereColumn('almoxarifado_saida.tipo_id', 'almoxarifado_saida_tipo.id')
|
||||
)
|
||||
->orderBy('almoxarifado_saida_tipo.nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
return $subtipos;
|
||||
}
|
||||
|
||||
private static function getUnidades($params)
|
||||
{
|
||||
$unidades = collect();
|
||||
|
||||
if ($params->movimentacao_tipo === 'entrada') {
|
||||
$unidades = DB::table('cadastro_unidade')
|
||||
->select([
|
||||
'cadastro_unidade.id',
|
||||
'cadastro_unidade.nome_fantasia',
|
||||
])
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_entrada_item')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_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')
|
||||
->whereBetween('almoxarifado_entrada.created_at', $params->periodo)
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_entrada.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
|
||||
)
|
||||
->orderBy('cadastro_unidade.nome_fantasia')
|
||||
->get();
|
||||
} else {
|
||||
$unidades = DB::table('cadastro_unidade')
|
||||
->select([
|
||||
'cadastro_unidade.id',
|
||||
'cadastro_unidade.nome_fantasia',
|
||||
])
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida_item')
|
||||
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_saida_item.saida_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_saida.centro_custo_id')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->whereBetween('almoxarifado_saida.created_at', $params->periodo)
|
||||
->where('almoxarifado_saida.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_saida.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
|
||||
)
|
||||
->orderBy('cadastro_unidade.nome_fantasia')
|
||||
->get();
|
||||
}
|
||||
|
||||
return $unidades;
|
||||
}
|
||||
|
||||
private static function getInfraestruturas($params)
|
||||
{
|
||||
$infraestruturas = collect();
|
||||
|
||||
if ($params->movimentacao_tipo === 'entrada') {
|
||||
$infraestruturas = DB::table('cadastro_infraestrutura')
|
||||
->select([
|
||||
'cadastro_infraestrutura.id',
|
||||
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome"),
|
||||
])
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_entrada_item')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_entrada.centro_custo_id')
|
||||
->whereBetween('almoxarifado_entrada.created_at', $params->periodo)
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_entrada.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id')
|
||||
)
|
||||
->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)')
|
||||
->get();
|
||||
} else {
|
||||
$infraestruturas = DB::table('cadastro_infraestrutura')
|
||||
->select([
|
||||
'cadastro_infraestrutura.id',
|
||||
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome"),
|
||||
])
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida_item')
|
||||
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_saida_item.saida_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_saida.centro_custo_id')
|
||||
->whereBetween('almoxarifado_saida.created_at', $params->periodo)
|
||||
->where('almoxarifado_saida.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_saida.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id')
|
||||
)
|
||||
->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)')
|
||||
->get();
|
||||
}
|
||||
|
||||
return $infraestruturas;
|
||||
}
|
||||
|
||||
private static function getSetores($params)
|
||||
{
|
||||
$setores = collect();
|
||||
|
||||
if ($params->movimentacao_tipo === 'entrada') {
|
||||
$setores = DB::table('cadastro_setor')
|
||||
->select([
|
||||
'cadastro_setor.id',
|
||||
'cadastro_setor.nome',
|
||||
])
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_entrada_item')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_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')
|
||||
->whereBetween('almoxarifado_entrada.created_at', $params->periodo)
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_entrada.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)
|
||||
->where('cadastro_infraestrutura.id', $params->infraestrutura_id)
|
||||
->whereColumn('cadastro_centro_custo.setor_id', 'cadastro_setor.id')
|
||||
)
|
||||
->orderBy('cadastro_setor.nome')
|
||||
->get();
|
||||
} else {
|
||||
$setores = DB::table('cadastro_setor')
|
||||
->select([
|
||||
'cadastro_setor.id',
|
||||
'cadastro_setor.nome',
|
||||
])
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida_item')
|
||||
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_saida_item.saida_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_saida.centro_custo_id')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->whereBetween('almoxarifado_saida.created_at', $params->periodo)
|
||||
->where('almoxarifado_saida.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_saida.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)
|
||||
->where('cadastro_infraestrutura.id', $params->infraestrutura_id)
|
||||
->whereColumn('cadastro_centro_custo.setor_id', 'cadastro_setor.id')
|
||||
)
|
||||
->orderBy('cadastro_setor.nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
return $setores;
|
||||
}
|
||||
|
||||
private static function getUsuarios($params)
|
||||
{
|
||||
$usuarios = collect();
|
||||
|
||||
if ($params->movimentacao_tipo === 'entrada') {
|
||||
$usuarios = DB::table('cadastro_usuario')
|
||||
->select([
|
||||
'cadastro_usuario.id',
|
||||
'cadastro_cidadao.nome',
|
||||
])
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_entrada_item')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_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_lotacao', 'cadastro_lotacao.id', 'almoxarifado_entrada.created_lotacao_id')
|
||||
->whereBetween('almoxarifado_entrada.created_at', $params->periodo)
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_entrada.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id))
|
||||
->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id))
|
||||
->when($params->setor_id, fn ($q) => $q->where('cadastro_centro_custo.setor_id', $params->setor_id))
|
||||
->whereColumn('cadastro_lotacao.usuario_id', 'cadastro_usuario.id')
|
||||
)
|
||||
->orderBy('cadastro_cidadao.nome')
|
||||
->get();
|
||||
} else {
|
||||
$usuarios = DB::table('cadastro_usuario')
|
||||
->select([
|
||||
'cadastro_usuario.id',
|
||||
'cadastro_cidadao.nome',
|
||||
])
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida_item')
|
||||
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_saida_item.saida_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_saida.centro_custo_id')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'almoxarifado_saida.created_lotacao_id')
|
||||
->whereBetween('almoxarifado_saida.created_at', $params->periodo)
|
||||
->where('almoxarifado_saida.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_saida.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id))
|
||||
->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id))
|
||||
->when($params->setor_id, fn ($q) => $q->where('cadastro_centro_custo.setor_id', $params->setor_id))
|
||||
->whereColumn('cadastro_lotacao.usuario_id', 'cadastro_usuario.id')
|
||||
)
|
||||
->orderBy('cadastro_cidadao.nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
return $usuarios;
|
||||
}
|
||||
|
||||
private static function getOrigensProgramaticas($params)
|
||||
{
|
||||
$origens = collect();
|
||||
|
||||
if ($params->movimentacao_tipo === 'entrada') {
|
||||
$origens = DB::table('cadastro_origem_programatica')
|
||||
->select([
|
||||
'cadastro_origem_programatica.id',
|
||||
'cadastro_origem_programatica.nome',
|
||||
])
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_entrada_item')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
|
||||
->join('almoxarifado_entrada_documento', 'almoxarifado_entrada_documento.entrada_id', 'almoxarifado_entrada.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_lotacao', 'cadastro_lotacao.id', 'almoxarifado_entrada.created_lotacao_id')
|
||||
->whereBetween('almoxarifado_entrada.created_at', $params->periodo)
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_entrada.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id))
|
||||
->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id))
|
||||
->when($params->setor_id, fn ($q) => $q->where('cadastro_centro_custo.setor_id', $params->setor_id))
|
||||
->when($params->usuario_id, fn ($q) => $q->where('cadastro_lotacao.usuario_id', $params->usuario_id))
|
||||
->whereColumn('almoxarifado_entrada_documento.origem_programatica_id', 'cadastro_origem_programatica.id')
|
||||
)
|
||||
->orderBy('cadastro_origem_programatica.nome')
|
||||
->get();
|
||||
} else {
|
||||
$origens = DB::table('cadastro_origem_programatica')
|
||||
->select([
|
||||
'cadastro_origem_programatica.id',
|
||||
'cadastro_origem_programatica.nome',
|
||||
])
|
||||
->whereExists(fn ($q) => $q
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_saida_item_entrada_item')
|
||||
->join('almoxarifado_saida_item', 'almoxarifado_saida_item.id', 'almoxarifado_saida_item_entrada_item.saida_item_id')
|
||||
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_saida_item.saida_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'almoxarifado_saida.centro_custo_id')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'almoxarifado_saida.created_lotacao_id')
|
||||
->join('almoxarifado_entrada_item', 'almoxarifado_entrada_item.id', 'almoxarifado_saida_item_entrada_item.entrada_item_id')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
|
||||
->join('almoxarifado_entrada_documento', 'almoxarifado_entrada_documento.entrada_id', 'almoxarifado_entrada.id')
|
||||
->whereBetween('almoxarifado_saida.created_at', $params->periodo)
|
||||
->where('almoxarifado_saida.finalizada', true)
|
||||
->when($params->movimentacao_subtipo_id, fn ($q) => $q->where('almoxarifado_saida.tipo_id', $params->movimentacao_subtipo_id))
|
||||
->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id))
|
||||
->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id))
|
||||
->when($params->setor_id, fn ($q) => $q->where('cadastro_centro_custo.setor_id', $params->setor_id))
|
||||
->when($params->usuario_id, fn ($q) => $q->where('cadastro_lotacao.usuario_id', $params->usuario_id))
|
||||
->whereColumn('almoxarifado_entrada_documento.origem_programatica_id', 'cadastro_origem_programatica.id')
|
||||
)
|
||||
->orderBy('cadastro_origem_programatica.nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
return $origens;
|
||||
}
|
||||
|
||||
private static function setOrderBy($builder)
|
||||
{
|
||||
if (is_null(request()->sort_by)) {
|
||||
if (request()->movimentacao_tipo === 'entrada') {
|
||||
$builder->orderBy('entrada_item_id');
|
||||
} else {
|
||||
$builder->orderBy('saida_item_id');
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (request()->movimentacao_tipo === 'entrada') {
|
||||
$columns = [
|
||||
'data_movimentacao' => "DATE_FORMAT(almoxarifado_entrada.created_at, '%d/%m/%Y')",
|
||||
'movimentacao_subtipo_nome' => 'almoxarifado_entrada_tipo.nome',
|
||||
'unidade_nome_fantasia' => 'cadastro_unidade.nome_fantasia',
|
||||
'infraestrutura_nome' => "COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)",
|
||||
'setor_nome' => 'cadastro_setor.nome',
|
||||
'usuario_nome' => 'cadastro_cidadao.nome',
|
||||
'material_descricao' => MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'cadastro_unidade_medida'
|
||||
),
|
||||
'grupo_nome' => 'cadastro_grupo.nome',
|
||||
'quantidade' => 'almoxarifado_entrada_item.quantidade',
|
||||
'valor_unitario' => 'almoxarifado_entrada_item.valor_unitario',
|
||||
'valor_total' => 'almoxarifado_entrada_item.valor_total',
|
||||
'lote' => 'almoxarifado_entrada_item.lote',
|
||||
'validade_lote' => "DATE_FORMAT(almoxarifado_entrada_item.validade_lote, '%d/%m/%Y')",
|
||||
'documento_numero' => 'CAST(almoxarifado_entrada_documento.numero AS INT)',
|
||||
'fornecedor_nome_fantasia' => 'cadastro_fornecedor.nome_fantasia',
|
||||
'origem_programatica_nome' => 'cadastro_origem_programatica.nome',
|
||||
];
|
||||
} else {
|
||||
$columns = [
|
||||
'data_movimentacao' => "DATE_FORMAT(almoxarifado_saida.created_at, '%d%m%Y')",
|
||||
'movimentacao_subtipo_nome' => 'almoxarifado_saida_tipo.nome',
|
||||
'unidade_nome_fantasia' => 'cadastro_unidade.nome_fantasia',
|
||||
'infraestrutura_nome' => "COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)",
|
||||
'setor_nome' => 'cadastro_setor.nome',
|
||||
'usuario_nome' => 'cadastro_cidadao.nome',
|
||||
'material_descricao' => MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'cadastro_unidade_medida'
|
||||
),
|
||||
'grupo_nome' => 'cadastro_grupo.nome',
|
||||
'quantidade' => 'almoxarifado_saida_item_entrada_item.quantidade_saida',
|
||||
'valor_unitario' => 'almoxarifado_entrada_item.valor_unitario',
|
||||
'valor_total' => "(almoxarifado_saida_item_entrada_item.quantidade_saida * almoxarifado_entrada_item.valor_unitario)",
|
||||
'lote' => 'almoxarifado_entrada_item.lote',
|
||||
'validade_lote' => "DATE_FORMAT(almoxarifado_entrada_item.validade_lote, '%d/%m/%Y')",
|
||||
'documento_numero' => 'CAST(almoxarifado_entrada_documento.numero AS INT)',
|
||||
'fornecedor_nome_fantasia' => 'cadastro_fornecedor.nome_fantasia',
|
||||
'origem_programatica_nome' => 'cadastro_origem_programatica.nome',
|
||||
];
|
||||
}
|
||||
|
||||
$column = $columns[request()->sort_by];
|
||||
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc) ? 'DESC' : 'ASC';
|
||||
|
||||
if (request()->movimentacao_tipo === 'entrada') {
|
||||
$builder->orderByRaw("{$column} {$direction}, entrada_item_id");
|
||||
} else {
|
||||
$builder->orderByRaw("{$column} {$direction}, saida_item_id");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,752 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Almoxarifado\Relatorios;
|
||||
|
||||
use App\Enums\Cadastro\Grupo\GrupoTipo;
|
||||
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 App\Utils\DataUtil;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class PosicaoEstoqueService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
$materiais = collect();
|
||||
|
||||
$materiaisComEstoque = DB::table('cadastro_material')
|
||||
->select([
|
||||
'cadastro_material.id AS material_id',
|
||||
'cadastro_material.codigo_material AS material_codigo',
|
||||
'cadastro_material.is_programa_remedio_em_casa',
|
||||
'cadastro_material.is_alto_custo',
|
||||
'cadastro_material.is_acao_judicial',
|
||||
'cadastro_material.is_remume',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
) . " AS material_descricao"),
|
||||
'cadastro_grupo.grupo_tipo_id',
|
||||
'cadastro_grupo.nome AS grupo_nome',
|
||||
'cadastro_subgrupo.nome AS subgrupo_nome',
|
||||
'almoxarifado_entrada_item.lote',
|
||||
DB::raw("DATE_FORMAT(almoxarifado_entrada_item.validade_lote, '%d/%m/%Y') AS validade_lote"),
|
||||
'almoxarifado_parametrizacao_estoque.estoque_minimo',
|
||||
'almoxarifado_parametrizacao_estoque.estoque_maximo',
|
||||
DB::raw("
|
||||
COALESCE(SUM(
|
||||
COALESCE(almoxarifado_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 = almoxarifado_entrada_item.id
|
||||
AND almoxarifado_saida.finalizada = 1
|
||||
), 0)
|
||||
), 0) AS quantidade
|
||||
"),
|
||||
'almoxarifado_entrada_item.id AS entrada_item_id',
|
||||
])
|
||||
->join('cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id')
|
||||
->leftJoin('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'
|
||||
)
|
||||
->leftJoin('cadastro_subgrupo', 'cadastro_subgrupo.id', 'cadastro_material.subgrupo_id')
|
||||
->leftJoin('almoxarifado_entrada_item', function ($join) {
|
||||
|
||||
$join->on('almoxarifado_entrada_item.material_id', 'cadastro_material.id')
|
||||
->whereExists(function ($query) {
|
||||
|
||||
$query
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_entrada')
|
||||
->whereColumn('almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->where('almoxarifado_entrada.centro_custo_id', request()->centro_custo_id);
|
||||
});
|
||||
})
|
||||
->leftJoin('almoxarifado_parametrizacao_estoque', function ($join) {
|
||||
|
||||
$join->on('almoxarifado_parametrizacao_estoque.material_id', 'cadastro_material.id')
|
||||
->where('almoxarifado_parametrizacao_estoque.centro_custo_id', request()->centro_custo_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))
|
||||
->whereNull('cadastro_material.deleted_at')
|
||||
->when(request()->query('status'), function ($query) {
|
||||
$sql = "
|
||||
COALESCE((
|
||||
SELECT COALESCE(SUM(
|
||||
COALESCE(almoxarifado_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 = almoxarifado_entrada_item.id
|
||||
AND almoxarifado_saida.finalizada = 1
|
||||
), 0)
|
||||
), 0)
|
||||
FROM almoxarifado_entrada_item
|
||||
INNER JOIN almoxarifado_entrada
|
||||
ON almoxarifado_entrada.id = almoxarifado_entrada_item.entrada_id
|
||||
WHERE almoxarifado_entrada.finalizada = 1
|
||||
AND almoxarifado_entrada.centro_custo_id = " . request()->centro_custo_id . "
|
||||
AND almoxarifado_entrada_item.material_id = cadastro_material.id
|
||||
), 0)
|
||||
";
|
||||
|
||||
$where = null;
|
||||
|
||||
switch (request()->status) {
|
||||
case 'abaixo_minimo':
|
||||
$where = "$sql < COALESCE(almoxarifado_parametrizacao_estoque.estoque_minimo, 0)";
|
||||
break;
|
||||
|
||||
case 'acima_maximo':
|
||||
$where = "$sql > COALESCE(almoxarifado_parametrizacao_estoque.estoque_maximo, 0)";
|
||||
break;
|
||||
|
||||
case 'normal':
|
||||
$where = "$sql > 0 AND $sql >= COALESCE(almoxarifado_parametrizacao_estoque.estoque_minimo, 0) AND $sql <= COALESCE(almoxarifado_parametrizacao_estoque.estoque_maximo, 0)";
|
||||
break;
|
||||
|
||||
case 'zerado':
|
||||
$where = "$sql = 0";
|
||||
break;
|
||||
}
|
||||
|
||||
$query->whereRaw($where);
|
||||
})
|
||||
->where(function ($query) {
|
||||
$query->where(function ($query) {
|
||||
|
||||
$query
|
||||
->whereNull('cadastro_material.subgrupo_id')
|
||||
->whereExists(function ($query) {
|
||||
|
||||
$query
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_parametrizacao_controle_estoque_grupo')
|
||||
->whereColumn('almoxarifado_parametrizacao_controle_estoque_grupo.grupo_id', 'cadastro_material.grupo_id')
|
||||
->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', request()->centro_custo_id);
|
||||
});
|
||||
})
|
||||
->orWhere(function ($query) {
|
||||
|
||||
$query
|
||||
->whereNotNull('cadastro_material.subgrupo_id')
|
||||
->whereExists(function ($query) {
|
||||
|
||||
$query
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_parametrizacao_controle_estoque_subgrupo')
|
||||
->join(
|
||||
'almoxarifado_parametrizacao_controle_estoque_grupo',
|
||||
'almoxarifado_parametrizacao_controle_estoque_grupo.id',
|
||||
'almoxarifado_parametrizacao_controle_estoque_subgrupo.parametrizacao_controle_estoque_grupo_id'
|
||||
)
|
||||
->whereColumn('almoxarifado_parametrizacao_controle_estoque_subgrupo.subgrupo_id', 'cadastro_material.subgrupo_id')
|
||||
->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', request()->centro_custo_id);
|
||||
});
|
||||
});
|
||||
})
|
||||
->groupBy([
|
||||
'cadastro_material.id',
|
||||
'cadastro_material.codigo_material',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
)),
|
||||
'cadastro_grupo.nome',
|
||||
'cadastro_subgrupo.nome',
|
||||
'almoxarifado_entrada_item.lote',
|
||||
DB::raw("DATE_FORMAT(almoxarifado_entrada_item.validade_lote, '%d/%m/%Y')"),
|
||||
'almoxarifado_parametrizacao_estoque.estoque_minimo',
|
||||
'almoxarifado_parametrizacao_estoque.estoque_maximo',
|
||||
])
|
||||
->havingRaw("
|
||||
COALESCE(SUM(
|
||||
COALESCE(almoxarifado_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 = almoxarifado_entrada_item.id
|
||||
AND almoxarifado_saida.finalizada = 1
|
||||
), 0)
|
||||
), 0) > 0
|
||||
");
|
||||
|
||||
$materiaisSemEstoque = DB::table('cadastro_material')
|
||||
->select([
|
||||
'cadastro_material.id AS material_id',
|
||||
'cadastro_material.codigo_material AS material_codigo',
|
||||
'cadastro_material.is_programa_remedio_em_casa',
|
||||
'cadastro_material.is_alto_custo',
|
||||
'cadastro_material.is_acao_judicial',
|
||||
'cadastro_material.is_remume',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
) . " AS material_descricao"),
|
||||
'cadastro_grupo.grupo_tipo_id',
|
||||
'cadastro_grupo.nome AS grupo_nome',
|
||||
'cadastro_subgrupo.nome AS subgrupo_nome',
|
||||
DB::raw('NULL AS lote'),
|
||||
DB::raw('NULL AS validade_lote'),
|
||||
'almoxarifado_parametrizacao_estoque.estoque_minimo',
|
||||
'almoxarifado_parametrizacao_estoque.estoque_maximo',
|
||||
DB::raw('0 AS quantidade'),
|
||||
'almoxarifado_entrada_item.id AS entrada_item_id',
|
||||
])
|
||||
->join('cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id')
|
||||
->leftJoin('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'
|
||||
)
|
||||
->leftJoin('cadastro_subgrupo', 'cadastro_subgrupo.id', 'cadastro_material.subgrupo_id')
|
||||
->leftJoin('almoxarifado_parametrizacao_estoque', function ($join) {
|
||||
|
||||
$join->on('almoxarifado_parametrizacao_estoque.material_id', 'cadastro_material.id')
|
||||
->where('almoxarifado_parametrizacao_estoque.centro_custo_id', request()->centro_custo_id);
|
||||
})
|
||||
->leftJoin('almoxarifado_entrada_item', 'almoxarifado_entrada_item.material_id', 'cadastro_material.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))
|
||||
->whereNull('cadastro_material.deleted_at')
|
||||
->when(request()->query('status'), function ($query) {
|
||||
$sql = "
|
||||
COALESCE((
|
||||
SELECT COALESCE(SUM(
|
||||
COALESCE(almoxarifado_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 = almoxarifado_entrada_item.id
|
||||
AND almoxarifado_saida.finalizada = 1
|
||||
), 0)
|
||||
), 0)
|
||||
FROM almoxarifado_entrada_item
|
||||
INNER JOIN almoxarifado_entrada
|
||||
ON almoxarifado_entrada.id = almoxarifado_entrada_item.entrada_id
|
||||
WHERE almoxarifado_entrada.finalizada = 1
|
||||
AND almoxarifado_entrada.centro_custo_id = " . request()->centro_custo_id . "
|
||||
AND almoxarifado_entrada_item.material_id = cadastro_material.id
|
||||
), 0)
|
||||
";
|
||||
|
||||
$where = null;
|
||||
|
||||
switch (request()->status) {
|
||||
case 'abaixo_minimo':
|
||||
$where = "$sql < COALESCE(almoxarifado_parametrizacao_estoque.estoque_minimo, 0)";
|
||||
break;
|
||||
|
||||
case 'acima_maximo':
|
||||
$where = "$sql > COALESCE(almoxarifado_parametrizacao_estoque.estoque_maximo, 0)";
|
||||
break;
|
||||
|
||||
case 'normal':
|
||||
$where = "$sql > 0 AND $sql >= COALESCE(almoxarifado_parametrizacao_estoque.estoque_minimo, 0) AND $sql <= COALESCE(almoxarifado_parametrizacao_estoque.estoque_maximo, 0)";
|
||||
break;
|
||||
|
||||
case 'zerado':
|
||||
$where = "$sql = 0";
|
||||
break;
|
||||
}
|
||||
|
||||
$query->whereRaw($where);
|
||||
})
|
||||
->whereNotExists(function ($query) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('almoxarifado_entrada_item')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->where('almoxarifado_entrada.centro_custo_id', request()->centro_custo_id)
|
||||
->whereRaw("
|
||||
COALESCE((
|
||||
COALESCE(almoxarifado_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 = almoxarifado_entrada_item.id
|
||||
AND almoxarifado_saida.finalizada = 1
|
||||
), 0)
|
||||
), 0) > 0
|
||||
")
|
||||
->whereColumn('almoxarifado_entrada_item.material_id', 'cadastro_material.id');
|
||||
})
|
||||
->where(function ($query) {
|
||||
$query->where(function ($query) {
|
||||
|
||||
$query
|
||||
->whereNull('cadastro_material.subgrupo_id')
|
||||
->whereExists(function ($query) {
|
||||
|
||||
$query
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_parametrizacao_controle_estoque_grupo')
|
||||
->whereColumn('almoxarifado_parametrizacao_controle_estoque_grupo.grupo_id', 'cadastro_material.grupo_id')
|
||||
->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', request()->centro_custo_id);
|
||||
});
|
||||
})
|
||||
->orWhere(function ($query) {
|
||||
|
||||
$query
|
||||
->whereNotNull('cadastro_material.subgrupo_id')
|
||||
->whereExists(function ($query) {
|
||||
|
||||
$query
|
||||
->select(DB::raw(1))
|
||||
->from('almoxarifado_parametrizacao_controle_estoque_subgrupo')
|
||||
->join(
|
||||
'almoxarifado_parametrizacao_controle_estoque_grupo',
|
||||
'almoxarifado_parametrizacao_controle_estoque_grupo.id',
|
||||
'almoxarifado_parametrizacao_controle_estoque_subgrupo.parametrizacao_controle_estoque_grupo_id'
|
||||
)
|
||||
->whereColumn('almoxarifado_parametrizacao_controle_estoque_subgrupo.subgrupo_id', 'cadastro_material.subgrupo_id')
|
||||
->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', request()->centro_custo_id);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$materiaisComEstoque
|
||||
->union($materiaisSemEstoque)
|
||||
->get()
|
||||
->each(function ($query) use ($materiais) {
|
||||
$material = $materiais->where('material_id', $query->material_id)->first();
|
||||
if (is_null($material)) {
|
||||
$material = (object) [
|
||||
'material_id' => $query->material_id,
|
||||
'material_codigo' => $query->material_codigo,
|
||||
'material_descricao' => $query->material_descricao,
|
||||
'is_programa_remedio_em_casa' => $query->is_programa_remedio_em_casa,
|
||||
'is_alto_custo' => $query->is_alto_custo,
|
||||
'is_acao_judicial' => $query->is_acao_judicial,
|
||||
'is_remume' => $query->is_remume,
|
||||
'grupo_tipo_id' => $query->grupo_tipo_id,
|
||||
'grupo_nome' => $query->grupo_nome,
|
||||
'subgrupo_nome' => $query->subgrupo_nome,
|
||||
'lotes' => collect(),
|
||||
'estoque_minimo' => $query->estoque_minimo ?? 0,
|
||||
'estoque_maximo' => $query->estoque_maximo ?? 0,
|
||||
'estoque_disponivel' => 0,
|
||||
'status' => null,
|
||||
];
|
||||
|
||||
$materiais->push($material);
|
||||
}
|
||||
|
||||
$material->estoque_disponivel += $query->quantidade;
|
||||
|
||||
if (is_null($query->lote) && is_null($query->validade_lote) && $query->quantidade == 0) {
|
||||
$loteExistente = $material->lotes->firstWhere('lote', '-');
|
||||
if ($loteExistente) {
|
||||
$loteExistente->quantidade += $query->quantidade;
|
||||
} else {
|
||||
$material->lotes->push((object) [
|
||||
'lote' => '-',
|
||||
'validade_lote' => '-',
|
||||
'quantidade' => $query->quantidade,
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
$material->lotes->push((object) [
|
||||
'lote' => $query->lote ?? '-',
|
||||
'validade_lote' => $query->validade_lote ?? '-',
|
||||
'quantidade' => $query->quantidade,
|
||||
]);
|
||||
}
|
||||
|
||||
$programa = collect([]);
|
||||
|
||||
if($material->grupo_tipo_id === GrupoTipo::MEDICAMENTO) {
|
||||
if($material->is_programa_remedio_em_casa) $programa->push("Programa remédio em casa");
|
||||
if($material->is_alto_custo) $programa->push("Alto custo");
|
||||
if($material->is_acao_judicial) $programa->push("Ação judicial");
|
||||
if($material->is_remume) $programa->push("REMUME");
|
||||
}
|
||||
|
||||
$material->programa = $programa->isNotEmpty() ? implode(', ', $programa->toArray()) : '-';
|
||||
});
|
||||
|
||||
$materiais->each(function ($query) {
|
||||
if ($query->estoque_disponivel < $query->estoque_minimo) {
|
||||
$query->status = ['value' => 'abaixo_minimo', 'text' => 'Abaixo do mínimo'];
|
||||
}
|
||||
else if ($query->estoque_disponivel > $query->estoque_maximo) {
|
||||
$query->status = ['value' => 'acima_maximo', 'text' => 'Acima do máximo'];
|
||||
}
|
||||
else {
|
||||
$query->status = ['value' => 'normal', 'text' => 'Normal'];
|
||||
}
|
||||
});
|
||||
|
||||
$sortKey = self::setOrderBy(request()->sortBy);
|
||||
|
||||
$desc = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc);
|
||||
|
||||
$materiais = collect($materiais);
|
||||
|
||||
$materiais = $desc ? $materiais->sortByDesc($sortKey) : $materiais->sortBy($sortKey);
|
||||
|
||||
$materiais = $materiais->values();
|
||||
|
||||
return $materiais;
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
$data = (object) [
|
||||
'form' => [],
|
||||
'model' => [],
|
||||
];
|
||||
|
||||
$params = self::getParams();
|
||||
|
||||
$sets = [
|
||||
'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'];
|
||||
},
|
||||
'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) {
|
||||
|
||||
$data->model['material'] = null;
|
||||
},
|
||||
'status' => function () use ($data, $params) {
|
||||
$statusData = self::getStatusData();
|
||||
|
||||
$data->form['status'] = $statusData['form'];
|
||||
$data->model['status'] = $params->status = $statusData['model'];
|
||||
},
|
||||
];
|
||||
|
||||
$load = is_null(request()->load_from);
|
||||
|
||||
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 setOrderBy($sortBy)
|
||||
{
|
||||
if (is_null($sortBy)) {
|
||||
return 'estoque_minimo';
|
||||
}
|
||||
|
||||
$columns = [
|
||||
'materialDescricao' => 'material_descricao',
|
||||
'estoqueMinimo' => 'estoque_minimo',
|
||||
'estoqueMaximo' => 'estoque_maximo',
|
||||
'estoqueDisponivel' => 'estoque_disponivel',
|
||||
'status' => 'status',
|
||||
];
|
||||
|
||||
return $columns[$sortBy] ?? 'estoque_minimo';
|
||||
}
|
||||
|
||||
private static function getParams()
|
||||
{
|
||||
$params = (object) request()->only([
|
||||
'unidade_id',
|
||||
'infraestrutura_id',
|
||||
'centro_custo_id',
|
||||
'grupo_id',
|
||||
'subgrupo_id',
|
||||
]);
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
private static function getUnidadesData($params)
|
||||
{
|
||||
$unidades = Unidade::setEagerLoads([])
|
||||
->whereHas('infraestruturas.centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
|
||||
->orderBy('nome_fantasia')
|
||||
->get(['id', 'nome_fantasia']);
|
||||
|
||||
return ['form' => $unidades, 'model' => null];
|
||||
}
|
||||
|
||||
private static function getInfraestruturasData($params)
|
||||
{
|
||||
$infraestruturas = collect();
|
||||
$id = null;
|
||||
|
||||
if (!is_null($params->unidade_id)) {
|
||||
|
||||
$infraestruturas = Infraestrutura::setEagerLoads([])
|
||||
->where('unidade_id', $params->unidade_id)
|
||||
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
|
||||
->get(['id', 'nome', 'principal', 'unidade_id'])
|
||||
->map(fn ($i) => ['id' => $i->id, 'nome' => $i->nome])
|
||||
->sortBy('nome')
|
||||
->values();
|
||||
|
||||
if ($infraestruturas->count() === 1) {
|
||||
$id = $infraestruturas->first()['id'];
|
||||
}
|
||||
}
|
||||
|
||||
return ['form' => $infraestruturas, 'model' => $id];
|
||||
}
|
||||
|
||||
private static function getCentrosDeCustoData($params)
|
||||
{
|
||||
$centrosCusto = collect();
|
||||
$id = null;
|
||||
|
||||
if (!is_null($params->infraestrutura_id)) {
|
||||
|
||||
$centrosCusto = CentroCusto::setEagerLoads([])
|
||||
->where('infraestrutura_id', $params->infraestrutura_id)
|
||||
->where(fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
|
||||
->get(['id', 'setor_id'])
|
||||
->map(fn ($cc) => [
|
||||
'id' => $cc->id,
|
||||
'setor_nome' => $cc->setor()->setEagerLoads([])->first('nome')->nome
|
||||
])
|
||||
->sortBy('setor_nome')
|
||||
->values();
|
||||
|
||||
if ($centrosCusto->count() === 1) {
|
||||
$id = $centrosCusto->first()['id'];
|
||||
}
|
||||
}
|
||||
|
||||
return ['form' => $centrosCusto, 'model' => $id];
|
||||
}
|
||||
|
||||
private static function setWhereForFilterCentroCusto($query)
|
||||
{
|
||||
return $query->has('almoxarifadoParametrizacoesControleEstoqueGrupo');
|
||||
}
|
||||
|
||||
private static function getGruposData($params)
|
||||
{
|
||||
$grupos = collect();
|
||||
$id = null;
|
||||
|
||||
if (!is_null($params->unidade_id)) {
|
||||
|
||||
$grupos = Grupo::setEagerLoads([])
|
||||
->whereHas('almoxarifadoParametrizacoesControleEstoqueGrupo', fn ($q) => self::setWhereForFilterControlePermissaoGrupo($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->grupo_id)) {
|
||||
|
||||
$subgrupos = Subgrupo::setEagerLoads([])
|
||||
->where('grupo_id', $params->grupo_id)
|
||||
->whereHas('almoxarifadoParametrizacoesControleEstoqueSubgrupo.parametrizacaoControleEstoqueGrupo', fn ($q) =>
|
||||
self::setWhereForFilterControlePermissaoGrupo($q, $params)
|
||||
)
|
||||
->orderBy('nome')
|
||||
->get(['id', 'nome']);
|
||||
}
|
||||
|
||||
return ['form' => $subgrupos, 'model' => $id];
|
||||
}
|
||||
|
||||
private static function getStatusData()
|
||||
{
|
||||
$status = [
|
||||
['value' => 'abaixo_minimo', 'text' => 'Abaixo do mínimo'],
|
||||
['value' => 'acima_maximo', 'text' => 'Acima do máximo'],
|
||||
['value' => 'normal', 'text' => 'Normal'],
|
||||
['value' => 'zerado', 'text' => 'Zerado'],
|
||||
];
|
||||
|
||||
return ['form' => $status, 'model' => null];
|
||||
}
|
||||
|
||||
public static function setWhereForFilterControlePermissaoGrupo($query, $params)
|
||||
{
|
||||
$query->where('centro_custo_id', $params->centro_custo_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('cadastro_material.deleted_at', null)
|
||||
->where(fn ($q) =>
|
||||
$q->where(fn ($q) =>
|
||||
$q->whereNull('subgrupo_id')
|
||||
->whereHas('grupo.almoxarifadoParametrizacoesControleEstoqueGrupo', fn ($q) =>
|
||||
self::setWhereForFilterControlePermissaoGrupo($q, $params)
|
||||
)
|
||||
)
|
||||
->orWhere(fn ($q) =>
|
||||
$q->whereNotNull('subgrupo_id')
|
||||
->whereHas('subgrupo.almoxarifadoParametrizacoesControleEstoqueSubgrupo.parametrizacaoControleEstoqueGrupo', fn ($q) =>
|
||||
self::setWhereForFilterControlePermissaoGrupo($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',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
) . " as descricao"),
|
||||
'cadastro_material.possui_lote'
|
||||
);
|
||||
|
||||
return $materiais;
|
||||
}
|
||||
|
||||
public static function getPrintData()
|
||||
{
|
||||
$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);
|
||||
|
||||
$status = 'Todos';
|
||||
|
||||
switch (request()->status) {
|
||||
case 'abaixo_minimo':
|
||||
$status = 'Abaixo do mínimo';
|
||||
break;
|
||||
|
||||
case 'acima_maximo':
|
||||
$status = 'Acima do máximo';
|
||||
break;
|
||||
|
||||
case 'normal':
|
||||
$status = 'Normal';
|
||||
break;
|
||||
|
||||
case 'zerado':
|
||||
$status = 'Zerado';
|
||||
break;
|
||||
}
|
||||
|
||||
return [
|
||||
'unidade_nome_fantasia' => $unidade->nome_fantasia ?? 'Todas',
|
||||
'infraestrutura_nome' => $infraestrutura->nome ?? 'Todos',
|
||||
'setor_nome' => $centroCusto->setor->nome ?? 'Todos',
|
||||
'grupo_nome' => $grupo->nome ?? 'Todos',
|
||||
'subgrupo_nome' => $subgrupo->nome ?? 'Todos',
|
||||
'material_descricao' => $material->descricao_completa ?? 'Todos',
|
||||
'status' => $status,
|
||||
'itens' => self::index(),
|
||||
'colunas' => collect(request()->selectedCols),
|
||||
];
|
||||
}
|
||||
}
|
||||
1108
api/app/Services/Almoxarifado/Relatorios/RequisicaoService.php
Normal file
1108
api/app/Services/Almoxarifado/Relatorios/RequisicaoService.php
Normal file
File diff suppressed because it is too large
Load Diff
1250
api/app/Services/Almoxarifado/Relatorios/SaidaService.php
Normal file
1250
api/app/Services/Almoxarifado/Relatorios/SaidaService.php
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,258 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Almoxarifado\Relatorios;
|
||||
|
||||
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 App\Utils\DataUtil;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class ValidadeMaterialService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
$totalizadores = (object) ['quantidade' => 0];
|
||||
|
||||
$validadeMaterialBuilder = DB::table('almoxarifado_entrada_item')
|
||||
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_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_material', 'cadastro_material.id', 'almoxarifado_entrada_item.material_id')
|
||||
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_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_subgrupo.id', 'cadastro_material.subgrupo_id')
|
||||
->whereNull('almoxarifado_entrada_item.estornado_em')
|
||||
->where('almoxarifado_entrada.finalizada', true)
|
||||
->whereNotNull('almoxarifado_entrada_item.lote')
|
||||
->when(request()->periodo['start'], fn ($q, $data) => $q
|
||||
->where('almoxarifado_entrada_item.validade_lote', '>=', Carbon::createFromFormat('d/m/Y', $data)
|
||||
->setTime(0, 0, 0))
|
||||
)
|
||||
->when(request()->periodo['end'], fn ($q, $data) => $q
|
||||
->where('almoxarifado_entrada_item.validade_lote', '<=', 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))
|
||||
->when(request()->query('situacao'), fn ($q, $situacao) => $q
|
||||
->whereRaw("IF((DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1) > 0, 1, 2) = {$situacao}")
|
||||
)
|
||||
->groupBy(
|
||||
'cadastro_material.id',
|
||||
'cadastro_material.codigo_material',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
)),
|
||||
'almoxarifado_entrada_item.lote',
|
||||
'almoxarifado_entrada_item.validade_lote',
|
||||
'cadastro_grupo.nome',
|
||||
'cadastro_subgrupo.nome',
|
||||
DB::raw("DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1")
|
||||
)
|
||||
->select(
|
||||
'cadastro_material.id',
|
||||
'cadastro_material.codigo_material',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
) . " AS descricao"),
|
||||
'almoxarifado_entrada_item.lote',
|
||||
DB::raw("almoxarifado_entrada_item.validade_lote AS validade"),
|
||||
DB::raw("IF((DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1) > 0, 'A Vencer', 'Vencido') AS situacao"),
|
||||
'cadastro_grupo.nome AS grupo',
|
||||
'cadastro_subgrupo.nome AS subgrupo',
|
||||
DB::raw("DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1 AS tempo_validade"),
|
||||
DB::raw("COALESCE(SUM(
|
||||
COALESCE(almoxarifado_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 = almoxarifado_entrada_item.id
|
||||
AND almoxarifado_saida.finalizada = 1
|
||||
), 0)
|
||||
), 0) AS estoque")
|
||||
);
|
||||
|
||||
self::setOrderBy($validadeMaterialBuilder);
|
||||
|
||||
$validadeMaterialBuilder->havingRaw('estoque > 0');
|
||||
|
||||
$entradasItens = $validadeMaterialBuilder->get();
|
||||
|
||||
$totalizadores = [
|
||||
'total' => $entradasItens->sum('estoque'),
|
||||
];
|
||||
|
||||
return ['entradas_itens' => $entradasItens, 'totalizadores' => $totalizadores];
|
||||
}
|
||||
|
||||
private static function setOrderBy($builder)
|
||||
{
|
||||
|
||||
if (is_null(request()->sortBy)) {
|
||||
|
||||
$builder->orderBy('almoxarifado_entrada_item.id');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$columns = [
|
||||
'validade' => 'almoxarifado_entrada_item.validade_lote',
|
||||
'codigo_material' => 'cadastro_material.codigo_material',
|
||||
'descricao' => MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
),
|
||||
'lote' => 'almoxarifado_entrada_item.lote',
|
||||
'tempo_validade' => DB::raw("DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1"),
|
||||
'situacao' => DB::raw("IF((DATEDIFF(almoxarifado_entrada_item.validade_lote, CURRENT_DATE) + 1) > 0, 'A Vencer', 'Vencido')"),
|
||||
'estoque' => DB::raw("COALESCE(SUM(
|
||||
COALESCE(almoxarifado_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 = almoxarifado_entrada_item.id
|
||||
AND almoxarifado_saida.finalizada = 1
|
||||
), 0)
|
||||
), 0)"),
|
||||
'grupo' => 'cadastro_grupo.nome',
|
||||
'subgrupo' => 'cadastro_subgrupo.nome'
|
||||
];
|
||||
|
||||
$column = $columns[request()->sortBy];
|
||||
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC';
|
||||
|
||||
$builder->orderByRaw("{$column} {$direction}, almoxarifado_entrada_item.id");
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
|
||||
$now = Carbon::now();
|
||||
$dataAtual = $now->format('d/m/Y');
|
||||
$dataValidade = $now->addDays(90)->format('d/m/Y');
|
||||
$currentLotacao = self::getCurrentLotacao();
|
||||
|
||||
return [
|
||||
'additionals' => [],
|
||||
'form' => [
|
||||
'data_atual' => request()->dispensacao == 'true' ? $dataAtual : null,
|
||||
'data_validade' => request()->dispensacao == 'true' ? $dataValidade : null,
|
||||
'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'])
|
||||
]),
|
||||
'situacoes' => [
|
||||
['text' => 'A vencer', 'value' => '1'],
|
||||
['text' => 'Vencido', 'value' => '2'],
|
||||
],
|
||||
],
|
||||
'model' => [
|
||||
'periodo' => [
|
||||
'start' => null,
|
||||
'end' => null,
|
||||
],
|
||||
'unidade_id' => request()->dispensacao == 'true' ? $currentLotacao->infraestrutura->unidade->id : null,
|
||||
'infraestrutura_id' => null,
|
||||
'centro_custo_id' => null,
|
||||
'grupo_id' => null,
|
||||
'subgrupo_id' => null,
|
||||
'material' => null,
|
||||
'situacao' => null,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public static function getPrintExportData()
|
||||
{
|
||||
$resultado = self::index();
|
||||
$itens = $resultado['entradas_itens'];
|
||||
|
||||
$itens->each(function ($item) {
|
||||
|
||||
$item->validade = (new Carbon($item->validade))->format('d/m/Y');
|
||||
$item->situacao = $item->tempo_validade > 0 ? 'A vencer' : 'Vencido';
|
||||
});
|
||||
|
||||
$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);
|
||||
|
||||
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',
|
||||
'material' => $material->descricao_completa ?? 'Todos',
|
||||
'colunas' => collect(request()->selectedCols),
|
||||
'itens' => $itens,
|
||||
'totalizadores' => $resultado['totalizadores'],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user