예제 #1
0
 public function checkoutAction()
 {
     $container = new Container('initialized');
     if (!is_array($container->checkout)) {
         $container->checkout = array();
     }
     $container->checkout['/order/checkout'] = 1;
     $cartContainer = new Container('cart');
     $orderContainer = new Container('order');
     $orderService = $this->getServiceLocator()->get('ErsBase\\Service\\OrderService');
     $order = $orderService->getOrder();
     #$this->checkItemPrices();
     $em = $this->getServiceLocator()->get('Doctrine\\ORM\\EntityManager');
     $paymenttype = $em->getRepository("ErsBase\\Entity\\PaymentType")->findOneBy(array('id' => $order->getPaymentTypeId()));
     $order->setPaymentType($paymenttype);
     if (isset($orderContainer->order_id)) {
         $order = $em->getRepository("ErsBase\\Entity\\Order")->findOneBy(array('id' => $orderContainer->order_id));
         if ($order) {
             return $this->redirect()->toRoute('order', array('action' => 'view', 'hashkey' => $order->getHashkey()));
         }
     }
     $form = new Form\Checkout();
     $request = $this->getRequest();
     if ($request->isPost()) {
         $inputFilter = new InputFilter\Checkout();
         $form->setInputFilter($inputFilter->getInputFilter());
         $form->setData($request->getPost());
         foreach ($order->getPackages() as $package) {
             if (count($package->getItems()) <= 0) {
                 $order->removePackage($package);
                 $em->remove($package);
                 continue;
             }
             $participant = $package->getParticipant();
             if ($participant->getFirstname() == '' || $participant->getSurname() == '') {
                 $participant = $buyer;
             }
             $user = null;
             if ($participant->getEmail() == '') {
                 $participant->setEmail(null);
             } else {
                 $user = $em->getRepository("ErsBase\\Entity\\User")->findOneBy(array('email' => $participant->getEmail()));
             }
             $role = $em->getRepository("ErsBase\\Entity\\Role")->findOneBy(array('roleId' => 'participant'));
             if ($user instanceof Entity\User) {
                 $package->setParticipant($user);
                 if (!$user->hasRole($role)) {
                     $user->addRole($role);
                     $em->persist($user);
                 }
                 #$package->setParticipantId($user->getId());
             } else {
                 $em->persist($participant);
                 $package->setParticipant($participant);
                 #$package->setParticipantId($participant->getId());
             }
             $country = $em->getRepository("ErsBase\\Entity\\Country")->findOneBy(array('id' => $participant->getCountryId()));
             if (!$country) {
                 $participant->setCountry(null);
             } else {
                 $participant->setCountry($country);
             }
         }
         $status = $em->getRepository('ErsBase\\Entity\\Status')->findOneBy(array('value' => 'ordered'));
         $order->setStatus($status);
         $em->persist($order);
         # add log entry
         $log = new Entity\Log();
         $log->setOrder($order);
         $log->setUser($order->getBuyer());
         $log->setData($order->getCode()->getValue() . ' ordered');
         $em->persist($log);
         $em->flush();
         $orderContainer->order_id = $order->getId();
         $cartContainer->init = 0;
         $emailService = $this->getServiceLocator()->get('ErsBase\\Service\\EmailService');
         $emailService->sendConfirmationEmail($order->getId());
         $forrest = new Service\BreadcrumbService();
         $forrest->remove('terms');
         switch (strtolower($order->getPaymentType()->getType())) {
             case 'banktransfer':
                 return $this->redirect()->toRoute('payment', array('action' => 'banktransfer', 'hashkey' => $order->getHashkey()));
             case 'cheque':
                 return $this->redirect()->toRoute('payment', array('action' => 'cheque', 'hashkey' => $order->getHashkey()));
             case 'creditcard':
                 return $this->redirect()->toRoute('payment', array('action' => 'creditcard', 'hashkey' => $order->getHashkey()));
             case 'paypal':
                 return $this->redirect()->toRoute('payment', array('action' => 'paypal', 'hashkey' => $order->getHashkey()));
                 break;
             default:
         }
     }
     $forrest = new Service\BreadcrumbService();
     $forrest->set('terms', 'order', array('action' => 'checkout'));
     /*
      * Check the buyers email, if it's not valid, delete buyer
      */
     $email_validator = new Validator\EmailAddress();
     $buyer = $order->getBuyer();
     if ($buyer) {
         $email = $order->getBuyer()->getEmail();
         if (!$email_validator->isValid($email)) {
             $order->setBuyer();
         }
     }
     return new ViewModel(array('form' => $form, 'order' => $order));
 }