init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado;
use App\Http\Controllers\Controller;
use App\Models\Almoxarifado\SaidaItem;
use App\Utils\Exports\Pdf1;
use App\Utils\MaskUtil;
use Illuminate\Support\Str;
class BaixaController extends Controller
{
private const TITLE = 'BAIXA';
private const TEMPLATE = 'almoxarifado.baixa';
public static function getTemplate($id)
{
$saidaItem = SaidaItem::findOrFail($id);
$entradaItens = $saidaItem->entradaItens->map(fn ($entradaItem) => [
'entrada_item_id' => $entradaItem->id,
'quantidade_saida' => $entradaItem->pivotSaidaItemEntradaItem->quantidade_saida,
'lote' => $entradaItem->lote,
'validade_lote' => $entradaItem->validade_lote,
]);
$semLote = collect();
$comLote = collect();
collect($entradaItens)->each(function ($entrada) use ($semLote, $comLote) {
if (is_null($entrada['lote'])) {
$semLote->push($entrada);
}
else {
$comLote->push($entrada);
}
});
$possuiEntradaComLote = $comLote->isNotEmpty();
$semLote = $semLote
->sortBy('entrada_item_id')
->values();
$comLote = $comLote
->sortBy([
['validade_lote', 'asc'],
['entrada_item_id', 'asc']
])
->values();
$entradaItens = $comLote->concat($semLote)->map(function ($entrada) {
if (!is_null($entrada['validade_lote'])) {
$entrada['validade_lote'] = $entrada['validade_lote']->format('d/m/Y');
}
return $entrada;
});
return [
'data' => $saidaItem->saida->created_at->format('d/m/Y'),
'unidade' => $saidaItem->createdCentroCusto->infraestrutura->unidade->nome_fantasia,
'localAtendimento' => $saidaItem->createdCentroCusto->infraestrutura->nome,
'setor' => $saidaItem->createdCentroCusto->setor->nome,
'usuario' => $saidaItem->createdLotacao->usuario->cidadao->nome,
'endereco' => $saidaItem->createdCentroCusto->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($saidaItem->createdCentroCusto->infraestrutura->telefone),
'motivo' => $saidaItem->saida->baixa->motivo->descricao,
'justificativa' => $saidaItem->saida->baixa->justificativa,
'usuarioSolicitante' => $saidaItem->saida->baixa->usuarioSolicitante->cidadao->nome ?? null,
'itens' => collect([
[
'material' => [
'id' => $saidaItem->material->id,
'descricao' => $saidaItem->material->descricao_completa,
],
'quantidade' => $saidaItem->quantidade,
'possui_entrada_com_lote' => $possuiEntradaComLote,
'entrada_itens' => $entradaItens,
'estornado' => $saidaItem->estornado,
]
])->filter(fn ($i) => !$i['estornado'])->all()
];
}
public function __invoke($id)
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate($id));
}
}

View File

@@ -0,0 +1,62 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\Grupo\Grupo;
use App\Models\Cadastro\Subgrupo\Subgrupo;
use App\Services\Almoxarifado\BalanceteService;
use App\Utils\Exports\Pdf1;
use Carbon\Carbon;
class BalanceteController extends Controller
{
private const TITLE = 'BALANCETE';
private const TEMPLATE = 'almoxarifado.balancete';
public static function getTemplate()
{
$periodo = [
'inicio' => Carbon::createFromFormat('d/m/Y', request()->inicio)->setTime(0, 0, 0),
'fim' => Carbon::createFromFormat('d/m/Y', request()->fim)->setTime(23, 59, 59),
];
$grupo = request()->query('grupo_id') ? Grupo::find(request()->query('grupo_id')) : null;
$subgrupo = request()->query('subgrupo_id') ? Subgrupo::find(request()->query('subgrupo_id')) : null;
$colunas = collect(request()->selectedCols);
$balancete = BalanceteService::getBalancete($periodo, request()->grupo_id, request()->subgrupo_id, request()->origem_programatica_id);
BalanceteService::formatarSaldos($balancete);
$itens = null;
if ($colunas->contains('material')) {
$itens = $balancete['por_material'];
}
else if ($colunas->contains('subgrupo')) {
$itens = $balancete['por_subgrupo'];
}
else {
$itens = $balancete['por_grupo'];
}
return [
'inicio' => request()->inicio,
'fim' => request()->fim,
'grupo' => $grupo->nome ?? null,
'subgrupo' => $subgrupo->nome ?? null,
'colunas' => $colunas,
'itens' => $itens,
'totalizadores' => $balancete['totalizadores'],
];
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\Grupo\Grupo;
use App\Models\Cadastro\Subgrupo\Subgrupo;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Services\Almoxarifado\InventarioService;
use App\Utils\Exports\Pdf1;
class InventarioController extends Controller
{
private const TITLE = 'INVENTÁRIO';
private const TEMPLATE = 'almoxarifado.inventario';
public static function getTemplate()
{
$grupo = request()->query('grupo_id') ? Grupo::find(request()->query('grupo_id')) : null;
$subgrupo = request()->query('subgrupo_id') ? Subgrupo::find(request()->query('subgrupo_id')) : null;
return [
'localAtendimento' => Lotacao::findOrFail(auth()->payload()->get('lotacao_id'))->infraestrutura->nome,
'grupo' => $grupo->nome ?? null,
'subgrupo' => $subgrupo->nome ?? null,
'materiais' => InventarioService::index()
];
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado\Relatorios;
use App\Http\Controllers\Controller;
use App\Services\Almoxarifado\Relatorios\ConsumoFinanceiroService;
use App\Utils\Exports\Pdf1;
class ConsumoFinanceiroController extends Controller
{
private const TITLE = 'RELATÓRIO DE CONSUMO FINANCEIRO';
private const TEMPLATE = 'almoxarifado.relatorios.consumo-financeiro';
public static function getTemplate()
{
return ConsumoFinanceiroService::getPrintExportData();
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado\Relatorios;
use App\Http\Controllers\Controller;
use App\Services\Almoxarifado\Relatorios\ConsumoMedioMensalService;
use App\Utils\Exports\Pdf1;
class ConsumoMedioMensalController extends Controller
{
private const TITLE = 'RELATÓRIO DE CONSUMO MÉDIO MENSAL';
private const TEMPLATE = 'almoxarifado.relatorios.consumo-medio-mensal';
public static function getTemplate()
{
return ConsumoMedioMensalService::getPrintExportData();
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado\Relatorios;
use App\Http\Controllers\Controller;
use App\Services\Almoxarifado\Relatorios\EntradaService;
use App\Utils\Exports\Pdf1;
class EntradaController extends Controller
{
private const TITLE = 'RELATÓRIO DE ENTRADA';
private const TEMPLATE = 'almoxarifado.relatorios.entrada';
public static function getTemplate()
{
return EntradaService::getPrintExportData();
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado\Relatorios;
use App\Http\Controllers\Controller;
use App\Services\Almoxarifado\Relatorios\EstornoEntradaService;
use App\Utils\Exports\Pdf1;
class EstornoEntradaController extends Controller
{
private const TITLE = 'RELATÓRIO DE ESTORNO DE ENTRADAS';
private const TEMPLATE = 'almoxarifado.relatorios.estorno-entrada';
public static function getTemplate()
{
return EstornoEntradaService::getPrintExportData();
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado\Relatorios;
use App\Http\Controllers\Controller;
use App\Services\Almoxarifado\Relatorios\EstornoSaidaService;
use App\Utils\Exports\Pdf1;
class EstornoSaidaController extends Controller
{
private const TITLE = 'RELATÓRIO DE ESTORNO DE SAÍDAS';
private const TEMPLATE = 'almoxarifado.relatorios.estorno-saida';
public static function getTemplate()
{
return EstornoSaidaService::getPrintExportData();
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,45 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado\Relatorios;
use App\Http\Controllers\Controller;
use App\Models\Almoxarifado\EntradaTipo;
use App\Models\Almoxarifado\SaidaTipo;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Setor;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Material\Material;
use App\Models\Cadastro\OrigemProgramatica;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Services\Almoxarifado\Relatorios\MovimentacaoGeralService;
use App\Utils\Exports\Pdf1;
class MovimentacaoGeralController extends Controller
{
private const TITLE = 'RELATÓRIO DE MOVIMENTAÇÃO GERAL';
private const TEMPLATE = 'almoxarifado.relatorios.movimentacao-geral';
public function __invoke()
{
$itens = MovimentacaoGeralService::index();
$data = [
'periodo' => [
'start' => request()->periodo['start'],
'end' => request()->periodo['end'],
],
'movimentacao_tipo' => request()->movimentacao_tipo === 'entrada' ? 'ENTRADA' : 'SAÍDA',
'movimentacao_subtipo' => (request()->movimentacao_tipo === 'entrada' ? EntradaTipo::find(request()->movimentacao_subtipo_id)->nome ?? null : SaidaTipo::find(request()->movimentacao_subtipo_id)->nome ?? null) ?? 'Todos',
'unidade' => Unidade::find(request()->unidade_id)->nome_fantasia ?? 'Todas',
'infraestrutura' => Infraestrutura::find(request()->infraestrutura_id)->nome ?? 'Todos',
'setor' => Setor::find(request()->setor_id)->nome ?? 'Todos',
'usuario' => Usuario::find(request()->usuario_id)->nome ?? 'Todos',
'origem_programatica' => OrigemProgramatica::find(request()->origem_programatica_id) ?? 'Todas',
'material' => Material::find(request()->material_id)->descricao_completa ?? 'Todos',
'colunas' => collect(request()->selected_cols),
'itens' => $itens,
];
return Pdf1::generate(self::TITLE, self::TEMPLATE, $data, 'landscape');
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado\Relatorios;
use App\Http\Controllers\Controller;
use App\Services\Almoxarifado\Relatorios\PosicaoEstoqueService;
use App\Utils\Exports\Pdf1;
class PosicaoEstoqueController extends Controller
{
private const TITLE = 'RELATÓRIO DE POSIÇÃO DE ESTOQUE';
private const TEMPLATE = 'almoxarifado.relatorios.posicao-estoque';
public static function getTemplate()
{
return PosicaoEstoqueService::getPrintData();
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado\Relatorios;
use App\Http\Controllers\Controller;
use App\Services\Almoxarifado\Relatorios\RequisicaoService;
use App\Utils\Exports\Pdf1;
class RequisicaoController extends Controller
{
private const TITLE = 'RELATÓRIO DE REQUISIÇÕES';
private const TEMPLATE = 'almoxarifado.relatorios.requisicao';
public static function getTemplate()
{
return RequisicaoService::getPrintExportData();
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado\Relatorios;
use App\Http\Controllers\Controller;
use App\Services\Almoxarifado\Relatorios\SaidaService;
use App\Utils\Exports\Pdf1;
class SaidaController extends Controller
{
private const TITLE = 'RELATÓRIO DE SAÍDAS';
private const TEMPLATE = 'almoxarifado.relatorios.saida';
public static function getTemplate()
{
return SaidaService::getPrintExportData();
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado\Relatorios;
use App\Http\Controllers\Controller;
use App\Services\Almoxarifado\Relatorios\ValidadeMaterialService;
use App\Utils\Exports\Pdf1;
class ValidadeMaterialController extends Controller
{
private const TITLE = 'RELATÓRIO DE VALIDADE DE MATERIAL';
private const TEMPLATE = 'almoxarifado.relatorios.validade-material';
public static function getTemplate()
{
return ValidadeMaterialService::getPrintExportData();
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado;
use App\Http\Controllers\Controller;
use App\Models\Almoxarifado\Requisicao;
use App\Services\Almoxarifado\RequisicaoPendentePermissaoService;
use App\Utils\Exports\Pdf1;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class RequisicaoController extends Controller
{
private const TITLE = 'REQUISIÇÃO';
private const TEMPLATE = 'almoxarifado.requisicao';
public static function getTemplate($id)
{
$requisicao = Requisicao::findOrFail($id);
$data = RequisicaoPendentePermissaoService::edit($id);
$isPrimeiroEnvio = $data['form']['envios']->isEmpty();
$data['model']['itens'] = $data['model']['itens']->map(function ($item) {
$item['entrada_itens'] = $item['entrada_itens']
->filter(fn ($i) => $i['quantidade_saida'] > 0)
->values();
return $item;
});
return [
'data' => (new Carbon($requisicao->created_at))->format('d/m/Y'),
'numero' => $requisicao->numero,
'requisitante' => [
'unidade' => $requisicao->createdCentroCusto->infraestrutura->unidade->nome_fantasia,
'local_atendimento' => $requisicao->createdCentroCusto->infraestrutura->nome,
'setor' => $requisicao->createdCentroCusto->setor->nome,
'usuario' => $requisicao->createdLotacao->usuario->cidadao->nome,
'endereco' => $requisicao->createdCentroCusto->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($requisicao->createdCentroCusto->infraestrutura->telefone)
],
'isPrimeiroEnvio' => $isPrimeiroEnvio,
'itens' => $data['model']['itens'],
];
}
public function __invoke($id)
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate($id));
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado;
use App\Http\Controllers\Controller;
use App\Models\Almoxarifado\Requisicao;
use App\Services\Almoxarifado\RequisicaoPendentePermissaoService;
use App\Utils\Exports\Pdf1;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class RequisicaoSeparacaoMaterialController extends Controller
{
private const TITLE = 'REQUISIÇÃO - SEPARAR MATERIAL';
private const TEMPLATE = 'almoxarifado.requisicao-separacao-material';
public static function getTemplate($id)
{
$requisicao = Requisicao::findOrFail($id);
$data = RequisicaoPendentePermissaoService::edit($id);
$isPrimeiroEnvio = $data['form']['envios']->isEmpty();
$data['model']['itens'] = $data['model']['itens']->map(function ($item) {
$item['entrada_itens'] = $item['entrada_itens']
->filter(fn ($i) => $i['quantidade_saida'] > 0)
->values();
return $item;
});
return [
'data' => (new Carbon($requisicao->created_at))->format('d/m/Y'),
'numero' => $requisicao->numero,
'requisitante' => [
'unidade' => $requisicao->createdCentroCusto->infraestrutura->unidade->nome_fantasia,
'local_atendimento' => $requisicao->createdCentroCusto->infraestrutura->nome,
'setor' => $requisicao->createdCentroCusto->setor->nome,
'usuario' => $requisicao->createdLotacao->usuario->cidadao->nome,
'endereco' => $requisicao->createdCentroCusto->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($requisicao->createdCentroCusto->infraestrutura->telefone)
],
'isPrimeiroEnvio' => $isPrimeiroEnvio,
'itens' => $data['model']['itens'],
];
}
public function __invoke($id)
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate($id));
}
}

View File

@@ -0,0 +1,84 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado;
use App\Http\Controllers\Controller;
use App\Models\Almoxarifado\Saida;
use App\Services\Almoxarifado\SaidaService;
use App\Utils\Exports\Pdf1;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class SaidaController extends Controller
{
private const TITLE = 'SAÍDA';
private const TEMPLATE = 'almoxarifado.saida';
public static function getTemplate($id)
{
$saida = Saida::findOrFail($id);
$data = SaidaService::edit($id);
$data['model']['itens'] = $data['model']['itens']->filter(fn ($i) => !$i['estornado'])->map(function ($item) {
$semLote = collect();
$comLote = collect();
collect($item['entrada_itens'])->each(function ($entrada) use ($semLote, $comLote) {
if (is_null($entrada['lote'])) {
$semLote->push($entrada);
}
else {
$comLote->push($entrada);
}
});
$item['possui_entrada_com_lote'] = $comLote->isNotEmpty();
$semLote = $semLote
->sortBy('entrada_item_id')
->values();
$comLote = $comLote
->sortBy([
['validade_lote', 'asc'],
['entrada_item_id', 'asc']
])
->values();
$item['entrada_itens'] = $comLote->concat($semLote)->map(function ($entrada) {
if (!is_null($entrada['validade_lote'])) {
$entrada['validade_lote'] = $entrada['validade_lote']->format('d/m/Y');
}
return $entrada;
});
return $item;
});
return [
'data' => (new Carbon($saida->requisicao->data))->format('d/m/Y'),
'numero' => $saida->requisicao->numero,
'requisitante' => [
'unidade' => $saida->requisicao->centroCusto->infraestrutura->unidade->nome_fantasia,
'local_atendimento' => $saida->requisicao->centroCusto->infraestrutura->nome,
'setor' => $saida->requisicao->centroCusto->setor->nome,
'usuario' => $saida->requisicao->usuario->cidadao->nome,
'endereco' => $saida->requisicao->centroCusto->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($saida->requisicao->centroCusto->infraestrutura->telefone)
],
'itens' => $data['model']['itens'],
];
}
public function __invoke($id)
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate($id));
}
}

View File

@@ -0,0 +1,81 @@
<?php
namespace App\Http\Controllers\Impressao\Almoxarifado;
use App\Http\Controllers\Controller;
use App\Models\Almoxarifado\Saida;
use App\Services\Almoxarifado\TransferenciaService;
use App\Utils\Exports\Pdf1;
use App\Utils\MaskUtil;
class TransferenciaController extends Controller
{
private const TITLE = 'DOCUMENTO DE TRANSFERÊNCIA DE ESTOQUE';
private const TEMPLATE = 'almoxarifado.transferencia';
public static function getTemplate($id)
{
$saida = Saida::findOrFail($id);
$data = TransferenciaService::edit($id);
$data['model']['itens'] = $data['model']['itens']->filter(fn ($i) => !$i['estornado'])->map(function ($item) {
$semLote = collect();
$comLote = collect();
collect($item['entrada_itens'])->each(function ($entrada) use ($semLote, $comLote) {
if (is_null($entrada['lote'])) {
$semLote->push($entrada);
}
else {
$comLote->push($entrada);
}
});
$item['possui_entrada_com_lote'] = $comLote->isNotEmpty();
$semLote = $semLote
->sortBy('entrada_item_id')
->values();
$comLote = $comLote
->sortBy([
['validade_lote', 'asc'],
['entrada_item_id', 'asc']
])
->values();
$item['entrada_itens'] = $comLote->concat($semLote)->map(function ($entrada) {
if (!is_null($entrada['validade_lote'])) {
$entrada['validade_lote'] = $entrada['validade_lote']->format('d/m/Y');
}
return $entrada;
});
return $item;
});
return [
'destino' => [
'unidade' => $saida->transferencia->centroCusto->infraestrutura->unidade->nome_fantasia,
'local_atendimento' => $saida->transferencia->centroCusto->infraestrutura->nome,
'setor' => $saida->transferencia->centroCusto->setor->nome,
'usuario' => $saida->transferencia->usuario->cidadao->nome,
'endereco' => $saida->transferencia->centroCusto->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($saida->transferencia->centroCusto->infraestrutura->telefone)
],
'itens' => $data['model']['itens'],
];
}
public function __invoke($id)
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate($id));
}
}