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; } }