/**
  * Proccess sale transaction
  *
  * @param Request $request
  * @param Transaction $transaction
  * @param Delivery $delivery
  *
  * @return stdClass
  */
 public function process(Request $request, Transaction $transaction, Delivery $delivery)
 {
     // in your controller
     $transactionService = $this->get('transaction');
     $data = $request->get('braintree');
     $nonce = $data['payment_method_nonce'];
     $result = $transactionService::sale(['amount' => $transaction->getTotalPrice(), 'paymentMethodNonce' => $nonce]);
     $em = $this->container->get('doctrine')->getManager();
     $pm = $em->getRepository('EcommerceBundle:PaymentMethod')->findOneBySlug('braintree');
     if ($result->success || !is_null($result->transaction)) {
         //UPDATE TRANSACTION
         $transaction->setStatus(Transaction::STATUS_PAID);
         $transaction->setPaymentMethod($pm);
         //details
         $details = new stdClass();
         $details->id = $result->transaction->id;
         $details->status = $result->transaction->status;
         $details->type = $result->transaction->type;
         $details->currencyIsoCode = $result->transaction->currencyIsoCode;
         $details->amount = $result->transaction->amount;
         $details->merchantAccountId = $result->transaction->merchantAccountId;
         $details->createdAt = $result->transaction->createdAt;
         $details->updatedAt = $result->transaction->updatedAt;
         $details->customer = $result->transaction->customer;
         $details->billing = $result->transaction->billing;
         $details->shipping = $result->transaction->shipping;
         $transaction->setPaymentDetails(json_encode($details));
         $em->persist($transaction);
         $em->flush();
         //confirmation payment
         $answer = new stdClass();
         $answer->redirectUrl = $this->container->get('router')->generate('ecommerce_checkout_confirmationpayment');
         return $answer;
     } else {
         //UPDATE TRANSACTION
         $transaction->setStatus(Transaction::STATUS_CANCELLED);
         $transaction->setPaymentMethod($pm);
         //details
         $errorString = "";
         foreach ($result->errors->deepAll() as $error) {
             $errorString .= 'Error: ' . $error->code . ": " . $error->message . "\n";
         }
         $this->container->get('session')->getFlashBag()->add('error', $errorString);
         $transaction->setPaymentDetails(json_encode($errorString));
         $em->persist($transaction);
         $em->flush();
         //cancel payment
         $answer = new stdClass();
         $answer->redirectUrl = $this->container->get('router')->generate('ecommerce_checkout_cancelationpayment');
         return $answer;
     }
 }