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,268 @@
<?php
namespace App\Services\WebService\Almoxarifado\Cliente;
use App\Exceptions\WebService\Almoxarifado\Cliente\Unidade\CannotDeleteUnidadeException;
use App\Exceptions\WebService\Almoxarifado\Cliente\Unidade\UnidadeNotFoundException;
use App\Models\Cadastro\Estabelecimento\CentroCusto as CadastroCentroCusto;
use App\Models\Cadastro\Estabelecimento\Unidade as CadastroUnidade;
use App\Models\WebService\Almoxarifado\Cliente\Unidade;
use App\Services\Service;
use App\Utils\DataUtil;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class UnidadeService extends Service
{
public static function list($request)
{
switch ($request->listar) {
case 'infraestruturas': {
return self::getInfraestruturas($request->unidade_id);
}
case 'centros-custo': {
return self::getCentrosCusto($request->infraestrutura_id);
}
}
}
public static function index($request)
{
self::validateIndex($request);
$unidades = DB::table('web_service_almoxarifado_cliente_unidade AS unidade')
->when(DataUtil::isStringBoolean($request->query('is_almoxarifado')), fn ($q) => $q
->where(
'unidade.is_almoxarifado',
DataUtil::getBooleanValueFromStringBoolean($request->query('is_almoxarifado'))
)
)
->select([
'unidade.id',
'unidade.conectasus_centro_custo_id',
'unidade.nome',
'unidade.cnes',
'unidade.is_almoxarifado',
])
->orderBy('unidade.nome')
->get();
$unidades->each(function ($unidade) {
$unidade->is_almoxarifado = (bool) $unidade->is_almoxarifado;
});
return $unidades;
}
private static function validateIndex($request)
{
$request->validate([
'is_almoxarifado' => [
'string',
Rule::in('true', 'false'),
],
]);
}
public static function create()
{
return [
'form' => self::getFormData(),
'model' => [
'conectasus_unidade_id' => null,
'conectasus_infraestrutura_id' => null,
'conectasus_centro_custo_id' => null,
'nome' => null,
'cnes' => null,
'is_almoxarifado' => false,
],
];
}
public static function store($request)
{
self::validate($request);
return Unidade::create(self::getUnidadeData($request))->fresh();
}
public static function show($id)
{
return self::getUnidadeModel($id);
}
public static function edit($id)
{
$unidade = self::getUnidadeModel($id);
return [
'form' => self::getFormData($unidade),
'model' => [
'conectasus_unidade_id' => $unidade->conectasusCentroCusto->infraestrutura->unidade_id ?? null,
'conectasus_infraestrutura_id' => $unidade->conectasusCentroCusto->infraestrutura_id ?? null,
'conectasus_centro_custo_id' => $unidade->conectasus_centro_custo_id,
'nome' => $unidade->nome,
'cnes' => $unidade->cnes,
'is_almoxarifado' => $unidade->is_almoxarifado,
],
];
}
private static function getFormData($unidade = null)
{
$conectaSusInfraestruturas = [];
$conectaSusCentrosCusto = [];
if (isset($unidade->conectasus_centro_custo_id)) {
$conectaSusInfraestruturas = self::getInfraestruturas(
$unidade->conectasusCentroCusto->infraestrutura->unidade_id
);
$conectaSusCentrosCusto = self::getCentrosCusto($unidade->conectasusCentroCusto->infraestrutura_id);
}
return [
'conectasus_unidades' => CadastroUnidade::orderBy('nome_fantasia')->get(['id', 'nome_fantasia']),
'conectasus_infraestruturas' => $conectaSusInfraestruturas,
'conectasus_centros_custo' => $conectaSusCentrosCusto,
];
}
private static function getInfraestruturas($unidadeId)
{
return DB::table('cadastro_infraestrutura AS infraestrutura')
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
->whereNull('infraestrutura.deleted_at')
->where('infraestrutura.unidade_id', $unidadeId)
->orderBy('infraestrutura.nome')
->select([
'infraestrutura.id',
DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS nome"),
])
->get();
}
private static function getCentrosCusto($infraestruturaId)
{
return DB::table('cadastro_centro_custo AS centro_custo')
->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id')
->whereNull('centro_custo.deleted_at')
->where('centro_custo.infraestrutura_id', $infraestruturaId)
->orderBy('setor.nome')
->select([
'centro_custo.id',
'setor.nome AS setor_nome',
])
->get();
}
public static function update($request, $id)
{
$unidade = self::getUnidadeModel($id);
self::validate($request);
return tap($unidade)->update(self::getUnidadeData($request))->fresh();
}
private static function getUnidadeData($request)
{
return $request->only(['conectasus_centro_custo_id', 'nome', 'cnes', 'is_almoxarifado']);
}
public static function destroy($id)
{
$unidade = self::getUnidadeModel($id);
if ($unidade->entradas()->exists()) {
throw new CannotDeleteUnidadeException();
}
$unidade->delete();
}
public static function datatable()
{
return DB::table('web_service_almoxarifado_cliente_unidade AS unidade')
->leftJoin(
'cadastro_centro_custo AS conectasus_centro_custo',
'conectasus_centro_custo.id',
'unidade.conectasus_centro_custo_id'
)
->leftJoin(
'cadastro_setor AS conectasus_setor',
'conectasus_setor.id',
'conectasus_centro_custo.setor_id'
)
->leftJoin(
'cadastro_infraestrutura AS conectasus_infraestrutura',
'conectasus_infraestrutura.id',
'conectasus_centro_custo.infraestrutura_id'
)
->leftJoin(
'cadastro_unidade AS conectasus_unidade',
'conectasus_unidade.id',
'conectasus_infraestrutura.unidade_id'
)
->select([
'unidade.id',
'unidade.nome',
'unidade.cnes',
DB::raw("CONCAT(
conectasus_unidade.nome_fantasia,
IF(conectasus_infraestrutura.nome IS NOT NULL,
CONCAT(' - ', conectasus_infraestrutura.nome),
''
),
' - ',
conectasus_setor.nome
) AS conectasus_centro_custo_descricao"),
DB::raw("IF(unidade.is_almoxarifado, 'SIM', 'NÃO') AS is_almoxarifado"),
]);
}
private static function validate($request)
{
$request->validate([
'conectasus_centro_custo_id' => [
'nullable',
'present',
'integer',
Rule::exists(CadastroCentroCusto::class, 'id'),
],
'nome' => [
'required',
'string',
'between:3,100',
Rule::unique(Unidade::class, 'nome')->ignore($request->route('id')),
],
'cnes' => [
'nullable',
'present',
'digits:7',
],
'is_almoxarifado' => [
'required',
'boolean',
],
]);
}
private static function getUnidadeModel($id)
{
$unidade = Unidade::find($id);
if (is_null($unidade)) {
throw new UnidadeNotFoundException();
}
return $unidade;
}
}