public function process($model, $service, $request, $params)
 {
     if ($service->is_ip_banned()) {
         return $this->banned_view();
     }
     global $rm_form_diary;
     if (count($rm_form_diary) > 0 && !isset($params['force_enable_multiform'])) {
         return;
     }
     if (isset($params['form_id']) && $params['form_id']) {
         $form_id = $params['form_id'];
         $fe_form = $this->form_factory->create_form($form_id);
         $form_name = 'form_' . $fe_form->get_form_id();
     } else {
         return;
     }
     $fopts = $fe_form->get_form_options();
     if ($fe_form->is_expired() && $fopts->post_expiry_action == 'switch_to_another_form') {
         $form_id = $fopts->post_expiry_form_id;
         if ($form_id) {
             $fe_form = $this->form_factory->create_form($form_id);
             $form_name = 'form_' . $fe_form->get_form_id();
         } else {
             return;
         }
     }
     if (isset($request->req['rm_pproc'])) {
         $paypal_service = new RM_Paypal_Service();
         ob_start();
         $resp = $paypal_service->callback($request->req['rm_pproc'], isset($request->req['rm_pproc_id']) ? $request->req['rm_pproc_id'] : null);
         $paypal_callback_msg = ob_get_clean();
         $x = new stdClass();
         $x->form_options = $fe_form->get_form_options();
         $x->form_name = $fe_form->get_form_name();
         $after_sub_msg = $service->after_submission_proc($x);
         return $paypal_callback_msg . '<br><br>' . $after_sub_msg;
     }
     //Call form specific processing before submission.
     $form_preproc_response = $fe_form->pre_sub_proc($request->req, $params);
     if (isset($request->req['stat_id'])) {
         $stat_id = $request->req['stat_id'];
     } else {
         $stat_id = null;
     }
     if (isset($request->req['rm_form_sub_no']) && $request->req['rm_form_sub_no']) {
         $subbed_form_no = $request->req['rm_form_sub_no'];
     } else {
         $subbed_form_no = null;
     }
     if ($subbed_form_no && $fe_form->get_form_number() == $subbed_form_no && $form_preproc_response && $this->mv_handler->validateForm($form_name . "_" . $subbed_form_no) && !$service->is_browser_reload_duplication($stat_id)) {
         if ($service->is_off_limit_submission($form_id, $fe_form->get_form_options())) {
             die(RM_UI_Strings::get("ALERT_SUBMISSIOM_LIMIT"));
         }
         $primary_data = $fe_form->get_prepared_data($request->req, 'primary');
         $service->update_stat_entry($stat_id);
         $db_data = $fe_form->get_prepared_data($request->req, 'dbonly');
         $sub_detail = $service->save_submission($form_id, $db_data, $primary_data['user_email']->value);
         $form_options = $fe_form->get_form_options();
         if ((int) $form_options->should_export_submissions === 1) {
             $service->export_to_external_url($form_options->export_submissions_to_url, $db_data);
         }
         if ($form_options->form_is_unique_token) {
             $token = $sub_detail->token;
         } else {
             $token = null;
         }
         if ($form_options->form_should_send_email) {
             $parameters = new stdClass();
             //This is different then the $params in the argument of this function!
             $parameters->req = $request->req;
             $parameters->email = $primary_data['user_email']->value;
             $parameters->email_content = $form_options->form_email_content;
             $parameters->email_subject = $form_options->form_email_subject;
             $email = $service->prepare_email('to_registrar', $token, $parameters);
             RM_Utilities::send_mail($email);
         }
         $submissions = new RM_Submissions();
         $submissions->load_from_db($sub_detail->submission_id);
         $parameters = new stdClass();
         $parameters->sub_data = $submissions->get_data();
         $parameters->form_name = $fe_form->get_form_name();
         $email = $service->prepare_email('to_admin', $token, $parameters);
         RM_Utilities::send_mail($email);
         $params['sub_detail'] = $sub_detail;
         /*
          * Check for payment
          */
         //also call Form specific method after submission
         $prevent_redirection = false;
         if ($fe_form->has_price_field()) {
             $params['paystate'] = 'pre_payment';
             $fe_form->post_sub_proc($request->req, $params, false);
             $params['is_paid'] = $service->process_payment($fe_form, $request, $params);
             if ($params['is_paid'] === 'do_not_redirect') {
                 $params['paystate'] = 'post_payment';
                 $fe_form->post_sub_proc($request->req, $params, false);
                 $this->update_user_profile($primary_data['user_email']->value, $db_data, $service);
                 $prevent_redirection = true;
             } else {
                 $params['paystate'] = 'post_payment';
                 $fe_form->post_sub_proc($request->req, $params, $params['is_paid']);
                 $this->update_user_profile($primary_data['user_email']->value, $db_data, $service);
             }
         } else {
             $params['paystate'] = 'na';
             $fe_form->post_sub_proc($request->req, $params);
             $this->update_user_profile($primary_data['user_email']->value, $db_data, $service);
         }
         unset($parameters->sub_data);
         $parameters->form_options = $form_options;
         if (!$prevent_redirection) {
             return $service->after_submission_proc($parameters);
         }
         //This must be returned as there is no ob_start here at work.
     } else {
         $data = new stdClass();
         $data->stat_id = $service->create_stat_entry($params);
         $data->fe_form = $fe_form;
         $force_multiple_form = isset($params['force_enable_multiform']) ? true : false;
         $view = $this->mv_handler->setView("user_form_nexgen", true);
         return $view->read($data, $force_multiple_form);
     }
 }
 public function process_payment($form, $request, $params)
 {
     if (isset($request->req['rm_payment_method'])) {
         $payment_method = $request->req['rm_payment_method'];
     } else {
         $payment_gateways = $this->get_setting('payment_gateway');
         if (!$payment_gateways || count($payment_gateways) == 0) {
             return;
         }
         if (!is_array($payment_gateways)) {
             $payment_gateways = array($payment_gateways);
         }
         $payment_method = $payment_gateways[0];
     }
     // Paypal handling
     if ($payment_method === "paypal") {
         $paypal_service = new RM_Paypal_Service();
         $pricing_details = $form->get_pricing_detail($request->req);
         $data = new stdClass();
         $data->form_id = $form->get_form_id();
         $data->submission_id = $params['sub_detail']->submission_id;
         if ($form->get_form_type() === RM_REG_FORM) {
             $data->user_id = $form->get_registered_user_id();
         }
         return $paypal_service->charge($data, $pricing_details);
     }
     if ($payment_method === "stripe") {
         $stripe_service = new RM_Stripe_Service();
         $pricing_details = $form->get_pricing_detail($request->req);
         $data = new stdClass();
         if (isset($request->req['stripeToken']) && !empty($request->req['stripeToken'])) {
             $data->stripeToken = $request->req['stripeToken'];
             $data->form_id = $form->get_form_id();
             $data->submission_id = $params['sub_detail']->submission_id;
             return $stripe_service->charge($data, $pricing_details);
         }
     }
 }