269 lines
8.3 KiB
PHP
269 lines
8.3 KiB
PHP
<?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;
|
|
}
|
|
}
|