public function approve(jmsPaymentMethodData $data, $retry = false)
 {
     $customerId = $this->createCustomer();
     try {
         // set bank account data
         $result = $this->getDispatcher()->bankaccountSet($this->getAccessKey(), $this->getTestMode(), $customerId, $data['bank_country'], $data['bank_code'], $data['account_number'], $data['account_holder']);
         if ($result['barStatus'] !== 'ALLOWED') {
             $data->setResponseCode($result['barStatus']);
             $data->setReasonCode('Bank account is not allowed.');
             $e = new jmsPaymentException('This bank account is blocked.');
             $e->setPaymentMethodData($data);
             throw $e;
         }
         // create debit payment
         $result = $this->getDispatcher()->sessionCreate($this->getAccessKey(), $this->getTestMode(), $customerId, '', $this->getProject($data), $this->getProjectCampaign($data), '', '', $data->getAmount(), $data->getCurrency(), $data['subject'], $data['payment_text'] === null ? $data['subject'] : $data['payment_text'], $data['ip'], null);
         $data->setResponseCode($result['status']);
         $data->setProcessedAmount($data->getAmount());
         $data['external_reference_number'] = $result['sessionId'];
     } catch (Exception $e) {
         $data->setReasonCode($e->getMessage());
         $e = jmsPaymentException::fromException($e);
         $e->setPaymentMethodData($data);
         throw $e;
     }
 }