$now->format('d/m/Y'), 'tiposLogradouro' => LogradouroTipo::orderBy('descricao')->get()->map(fn ($tipo) => [ 'id' => $tipo->id, 'descricao' => $tipo->descricao, ]), ]; } private static function getModelData($ponto = null) { $ponto = [ 'id' => $ponto->id ?? null, 'descricao' => $ponto->descricao ?? null, 'logradouro' => $ponto->logradouro ?? null, 'numero' => $ponto->numero ?? null, 'bloqueado' => $ponto->bloqueado ?? null, 'sem_numero' => $ponto && $ponto->numero == null ?? false, 'casa_paciente' => $ponto->casa_paciente ?? null ]; return $ponto; } public static function create() { return [ 'form' => self::getFormData(), 'model' => self::getModelData(), ]; } public static function show($id) { return Ponto::find($id); } public static function update($id) { if (!request()->casa_paciente) { self::validate(); } return Ponto::where('id', $id)->update(request()->all()); } public static function bloquear($id) { $ponto = self::show($id); return Ponto::where('id', $id)->update(['bloqueado' => $ponto->bloqueado == 1 ? 0 : 1]); } public static function edit($id) { return [ 'form' => self::getFormData(), 'model' => self::getModelData(self::show($id)), ]; } public static function store() { if (!request()->casa_paciente) { self::validate(); } return Ponto::create(request()->all())->fresh(); } public static function destroy($id) { try { return self::show($id)->delete(); } catch (\Throwable $th) { throw new DeletingModelException(); } } public static function datatable() { $pontos = DB::table('transporte_paciente_ponto') ->leftJoin( 'cadastro_logradouro', 'cadastro_logradouro.id', '=', 'transporte_paciente_ponto.logradouro_id' ) ->leftJoin( 'intranet.cadastro_municipio', 'intranet.cadastro_municipio.id', '=', 'cadastro_logradouro.municipio_id' ) ->leftJoin( 'intranet.cadastro_estado', 'intranet.cadastro_estado.id', '=', 'cadastro_municipio.estado_id' ) ->leftJoin( 'cadastro_bairro', 'cadastro_bairro.id', '=', 'cadastro_logradouro.bairro_id' ) ->leftJoin( 'cadastro_logradouro_tipo', 'cadastro_logradouro_tipo.id', '=', 'cadastro_logradouro.tipo_id' ) ->select( 'transporte_paciente_ponto.id', DB::raw(" CASE WHEN transporte_paciente_ponto.casa_paciente THEN 'CASA DO PACIENTE' ELSE transporte_paciente_ponto.descricao END AS descricao "), DB::raw("COALESCE(cadastro_logradouro.nome, '-') AS logradouro"), DB::raw(" CASE WHEN transporte_paciente_ponto.casa_paciente THEN '-' ELSE COALESCE(transporte_paciente_ponto.numero, 'SEM NÚMERO') END AS numero "), 'transporte_paciente_ponto.casa_paciente', 'transporte_paciente_ponto.bloqueado', DB::raw("COALESCE(cadastro_bairro.nome, '-') AS bairro"), DB::raw("COALESCE(intranet.cadastro_municipio.nome, '-') AS municipio"), DB::raw("COALESCE(intranet.cadastro_estado.nome, '-') AS estado"), DB::raw("COALESCE(cadastro_logradouro_tipo.descricao, '-') AS tipo"), DB::raw(" CASE WHEN transporte_paciente_ponto.bloqueado THEN 'INATIVO' ELSE 'ATIVO' END AS status "), ); return datatables() ->of($pontos) ->filterColumn('transporte_paciente_ponto.bloqueado', function ($query, $keyword) { $query->whereRaw(" CASE WHEN transporte_paciente_ponto.bloqueado THEN 'INATIVO' ELSE 'ATIVO' END LIKE ?", ["%{$keyword}%"] ); }) ->filterColumn('transporte_paciente_ponto.numero', function ($query, $keyword) { $query ->WhereRaw( "CASE WHEN transporte_paciente_ponto.casa_paciente THEN '-' ELSE COALESCE(transporte_paciente_ponto.numero, 'SEM NÚMERO') END like ?", ["%{$keyword}%"] ); }); } private static function validate() { return request()->validate( [ 'descricao' => [ 'required', 'min:5', 'max:100', Rule::unique('transporte_paciente_ponto') ->ignore(request()->ponto) ], 'logradouro_id' => [ 'required', 'integer', ], ], [ 'descricao.unique' => 'O ponto já foi inserido anteriormente.', 'logradouro_id.required' => 'O logradouro é obrigatório.', 'descricao.required' => 'A descrição é obrigatória.', ] ); } }