/**
  * Render the payment gateway template. The module should provide the gateway URL and the form fields names and values.
  *
  * @param Order  $order       the order
  * @param string $gateway_url the payment gateway URL
  * @param array  $form_data   an associative array of form data, that will be rendered as hiddent fields
  *
  * @return Response the HTTP response.
  */
 public function generateGatewayFormResponse($order, $gateway_url, $form_data)
 {
     /** @var ParserInterface $parser */
     $parser = $this->getContainer()->get("thelia.parser");
     $parser->setTemplateDefinition(${$parser}->getTemplateHelper()->getActiveFrontTemplate());
     $renderedTemplate = $parser->render("order-payment-gateway.html", array("order_id" => $order->getId(), "cart_count" => $this->getRequest()->getSession()->getSessionCart($this->getDispatcher())->getCartItems()->count(), "gateway_url" => $gateway_url, "payment_form_data" => $form_data));
     return Response::create($renderedTemplate);
 }
예제 #2
0
 /**
  * @see : 3.1.1 PAYLINE-GUIDE-Descriptif des appels webservices.
  * @param Order $order
  * @return RedirectResponse
  * @throws \Exception
  */
 public function doWebPayment(Order $order)
 {
     /** @var Customer $subscriber */
     $customer = $order->getCustomer();
     $array['version'] = self::VERSION;
     $array['returnURL'] = $this->frontRouter->generate('order.placed', ['order_id' => $order->getId()], true);
     $array['cancelURL'] = $this->frontRouter->generate('order.failed', ['order_id' => $order->getId(), 'message' => 'payline'], true);
     $array['notificationURL'] = $this->paylineRouter->generate('payline_notify', ['orderId' => $order->getId()], true);
     $amount = (double) $order->getTotalAmount() * 100;
     $currency = CurrencyNumericCodeQuery::create()->findPk($order->getCurrency()->getCode())->getNumericCode();
     $array['payment']['amount'] = $amount;
     $array['payment']['currency'] = $currency;
     $array['payment']['action'] = '100';
     $array['payment']['mode'] = 'CPT';
     $array['payment']['contractNumber'] = $this->config->getContractNumber();
     $array['order']['ref'] = $order->getRef();
     $array['order']['amount'] = $amount;
     $array['order']['currency'] = $currency;
     $array['order']['date'] = $order->getUpdatedAt()->format('d/m/Y H:m');
     $array['buyer']['lastName'] = $customer->getLastName();
     $array['buyer']['firstName'] = $customer->getFirstName();
     $array['buyer']['email'] = $customer->getEmail();
     $array['securityMode'] = 'SSL';
     $response = $this->payline->doWebPayment($array);
     $code = $response['result']['code'];
     if ($code !== '00000') {
         $message = isset($response['result']['longMessage']) ? $response['result']['longMessage'] : 'Error undefined';
         $this->logger->error($message);
         throw new \Exception($message);
     }
     return new RedirectResponse($response['redirectURL']);
 }
예제 #3
0
 public function testAddValidEntry()
 {
     $delivery_address_id = $this->order->getDeliveryOrderAddressId();
     $delivery_address = OrderAddressQuery::create()->findPk($delivery_address_id);
     $delivery_address->setCountryId(CountryQuery::create()->findOneByIsoalpha3("FRA")->getId());
     // France metropolitan
     $this->export->addEntry($this->instance);
 }
예제 #4
0
 /**
  * Check if there is a Coupon removing Postage
  *
  * @param Order $order the order for which we have to check if postage is free
  *
  * @return bool
  */
 public function isCouponRemovingPostage(Order $order)
 {
     $coupons = $this->facade->getCurrentCoupons();
     if (count($coupons) == 0) {
         return false;
     }
     $couponsKept = $this->sortCoupons($coupons);
     /** @var CouponInterface $coupon */
     foreach ($couponsKept as $coupon) {
         if ($coupon->isRemovingPostage()) {
             // Check if delivery country is on the list of countries for which delivery is free
             // If the list is empty, the shipping is free for all countries.
             $couponCountries = $coupon->getFreeShippingForCountries();
             if (!$couponCountries->isEmpty()) {
                 if (null === ($deliveryAddress = AddressQuery::create()->findPk($order->getChoosenDeliveryAddress()))) {
                     continue;
                 }
                 $countryValid = false;
                 $deliveryCountryId = $deliveryAddress->getCountryId();
                 /** @var CouponCountry $couponCountry */
                 foreach ($couponCountries as $couponCountry) {
                     if ($deliveryCountryId == $couponCountry->getCountryId()) {
                         $countryValid = true;
                         break;
                     }
                 }
                 if (!$countryValid) {
                     continue;
                 }
             }
             // Check if shipping method is on the list of methods for which delivery is free
             // If the list is empty, the shipping is free for all methods.
             $couponModules = $coupon->getFreeShippingForModules();
             if (!$couponModules->isEmpty()) {
                 $moduleValid = false;
                 $shippingModuleId = $order->getDeliveryModuleId();
                 /** @var CouponModule $couponModule */
                 foreach ($couponModules as $couponModule) {
                     if ($shippingModuleId == $couponModule->getModuleId()) {
                         $moduleValid = true;
                         break;
                     }
                 }
                 if (!$moduleValid) {
                     continue;
                 }
             }
             // All conditions are met, the shipping is free !
             return true;
         }
     }
     return false;
 }
예제 #5
0
 public static function getFromOrder(Order $order)
 {
     $translator = Translator::getInstance();
     if ($order->getDeliveryModuleId() !== TNTFrance::getModuleId()) {
         throw new \InvalidArgumentException($translator->trans("The order %id does not use the", ['id' => $order->getId()], TNTFrance::MESSAGE_DOMAIN));
     }
     $data = TNTFrance::getExtraOrderData($order->getId(), false);
     if (empty($data)) {
         throw new \InvalidArgumentException($translator->trans("No TNT data for order %id", ['id' => $order->getId()], TNTFrance::MESSAGE_DOMAIN));
     }
     $receiver = new TNTReceiver();
     $receiver->setType($data['tnt_service']);
     $receiver->setEmailAddress($order->getCustomer()->getEmail());
     if (array_key_exists('tnt_instructions', $data)) {
         $receiver->setInstructions($data['tnt_instructions']);
     }
     if (array_key_exists('tnt_phoneNumber', $data)) {
         $phoneNumber = str_replace(" ", "", $data['tnt_phoneNumber']);
         $receiver->setPhoneNumber($phoneNumber);
     }
     //todo : $receiver->setSendNotification(TNTFrance::getConfigValue(TNTFranceConfigValue::NOTIFICATION_USER));
     switch ($data['tnt_service']) {
         case 'INDIVIDUAL':
         case 'ENTERPRISE':
             $address = OrderAddressQuery::create()->findPk($order->getDeliveryOrderAddressId());
             if (null !== $address) {
                 $receiver->setName($address->getCompany())->setAddress1($address->getAddress1())->setAddress2($address->getAddress2())->setZipCode($address->getZipcode())->setCity($address->getCity())->setContactLastName($address->getLastname())->setContactFirstName($address->getFirstname());
                 if (array_key_exists('tnt_accessCode', $data)) {
                     $receiver->setAccessCode($data['tnt_accessCode']);
                 }
                 if (array_key_exists('tnt_floorNumber', $data)) {
                     $receiver->setAccessCode($data['tnt_floorNumber']);
                 }
                 if (array_key_exists('tnt_buildingId', $data)) {
                     $receiver->setAccessCode($data['tnt_buildingId']);
                 }
             }
             break;
         case 'DEPOT':
             $receiver->setTypeId($data['tnt_pexcode'])->setCity($data['tnt_depot_address']['city']);
             break;
         case 'DROPOFFPOINT':
             $receiver->setTypeId($data['tnt_exttcode']);
             break;
         default:
             throw new \InvalidArgumentException($translator->trans("TNT service %service is not valid for order %id", ['id' => $order->getId(), 'service' => $data['tnt_service']], TNTFrance::MESSAGE_DOMAIN));
     }
     return $receiver;
 }
예제 #6
0
 /**
  * @return boolean
  *                 Check if the export entry is valid
  */
 public function isValid()
 {
     /**
      * Get country
      */
     $country = $this->getDeliveryOrderCountry();
     /**
      * Do the checks
      */
     $checks = $this->order->getCustomer()->getDefaultAddress()->getCellphone() !== null;
     $checks &= PredictExport::translateCountry($country) !== null;
     return (bool) $checks;
 }
예제 #7
0
 /**
  * @return mixed
  */
 public function pay(Order $order)
 {
     $c = Config::read(CmCIC::JSON_CONFIG_PATH);
     $currency = $order->getCurrency()->getCode();
     $opts = "";
     $cmCicRouter = $this->container->get('router.cmcic');
     $mainRouter = $this->container->get('router.front');
     $vars = array("url_bank" => sprintf(self::CMCIC_URLPAIEMENT, $c["CMCIC_SERVER"], $c["CMCIC_PAGE"]), "version" => $c["CMCIC_VERSION"], "TPE" => $c["CMCIC_TPE"], "date" => date("d/m/Y:H:i:s"), "montant" => (string) round($order->getTotalAmount(), 2) . $currency, "reference" => self::harmonise($order->getId(), 'numeric', 12), "url_retour" => URL::getInstance()->absoluteUrl($cmCicRouter->generate("cmcic.receive", array(), Router::ABSOLUTE_URL)) . "/" . (string) $order->getId(), "url_retour_ok" => URL::getInstance()->absoluteUrl($mainRouter->generate("order.placed", array("order_id" => (string) $order->getId()), Router::ABSOLUTE_URL)), "url_retour_err" => URL::getInstance()->absoluteUrl($cmCicRouter->generate("cmcic.payfail", array("order_id" => (string) $order->getId()), Router::ABSOLUTE_URL)), "lgue" => strtoupper($this->getRequest()->getSession()->getLang()->getCode()), "societe" => $c["CMCIC_CODESOCIETE"], "texte-libre" => "0", "mail" => $this->getRequest()->getSession()->getCustomerUser()->getEmail(), "nbrech" => "", "dateech1" => "", "montantech1" => "", "dateech2" => "", "montantech2" => "", "dateech3" => "", "montantech3" => "", "dateech4" => "", "montantech4" => "");
     $hashable = sprintf(self::CMCIC_CGI1_FIELDS, $vars["TPE"], $vars["date"], $vars["montant"], $vars["reference"], $vars["texte-libre"], $vars["version"], $vars["lgue"], $vars["societe"], $vars["mail"], $vars["nbrech"], $vars["dateech1"], $vars["montantech1"], $vars["dateech2"], $vars["montantech2"], $vars["dateech3"], $vars["montantech3"], $vars["dateech4"], $vars["montantech4"], $opts);
     $mac = self::computeHmac($hashable, self::getUsableKey($c["CMCIC_KEY"]));
     $vars["MAC"] = $mac;
     $parser = $this->container->get("thelia.parser");
     $parser->setTemplateDefinition(new TemplateDefinition('module_cmcic', TemplateDefinition::FRONT_OFFICE));
     $render = $parser->render("gotobankservice.html", $vars);
     return Response::create($render);
 }
예제 #8
0
 /**
  * Filter the query by a related \Thelia\Model\Order object
  *
  * @param \Thelia\Model\Order|ObjectCollection $order The related object(s) to use as filter
  * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
  *
  * @return ChildOrderCouponQuery The current query, for fluid interface
  */
 public function filterByOrder($order, $comparison = null)
 {
     if ($order instanceof \Thelia\Model\Order) {
         return $this->addUsingAlias(OrderCouponTableMap::ORDER_ID, $order->getId(), $comparison);
     } elseif ($order instanceof ObjectCollection) {
         if (null === $comparison) {
             $comparison = Criteria::IN;
         }
         return $this->addUsingAlias(OrderCouponTableMap::ORDER_ID, $order->toKeyValue('PrimaryKey', 'Id'), $comparison);
     } else {
         throw new PropelException('filterByOrder() only accepts arguments of type \\Thelia\\Model\\Order or Collection');
     }
 }
예제 #9
0
 /**
  * Declares an association between this object and a ChildOrder object.
  *
  * @param                  ChildOrder $v
  * @return                 \Thelia\Model\OrderProduct The current object (for fluent API support)
  * @throws PropelException
  */
 public function setOrder(ChildOrder $v = null)
 {
     if ($v === null) {
         $this->setOrderId(NULL);
     } else {
         $this->setOrderId($v->getId());
     }
     $this->aOrder = $v;
     // Add binding for other direction of this n:n relationship.
     // If this object has already been added to the ChildOrder object, it will not be re-added.
     if ($v !== null) {
         $v->addOrderProduct($this);
     }
     return $this;
 }
예제 #10
0
파일: Customer.php 프로젝트: shirone/thelia
 /**
  * Sets the properties of the current object to the value they had at a specific version
  *
  * @param ChildCustomerVersion $version The version object to use
  * @param ConnectionInterface   $con the connection to use
  * @param array                 $loadedObjects objects that been loaded in a chain of populateFromVersion calls on referrer or fk objects.
  *
  * @return ChildCustomer The current object (for fluent API support)
  */
 public function populateFromVersion($version, $con = null, &$loadedObjects = array())
 {
     $loadedObjects['ChildCustomer'][$version->getId()][$version->getVersion()] = $this;
     $this->setId($version->getId());
     $this->setRef($version->getRef());
     $this->setTitleId($version->getTitleId());
     $this->setFirstname($version->getFirstname());
     $this->setLastname($version->getLastname());
     $this->setEmail($version->getEmail());
     $this->setPassword($version->getPassword());
     $this->setAlgo($version->getAlgo());
     $this->setReseller($version->getReseller());
     $this->setLang($version->getLang());
     $this->setSponsor($version->getSponsor());
     $this->setDiscount($version->getDiscount());
     $this->setRememberMeToken($version->getRememberMeToken());
     $this->setRememberMeSerial($version->getRememberMeSerial());
     $this->setCreatedAt($version->getCreatedAt());
     $this->setUpdatedAt($version->getUpdatedAt());
     $this->setVersion($version->getVersion());
     $this->setVersionCreatedAt($version->getVersionCreatedAt());
     $this->setVersionCreatedBy($version->getVersionCreatedBy());
     if ($fkValues = $version->getOrderIds()) {
         $this->clearOrders();
         $fkVersions = $version->getOrderVersions();
         $query = ChildOrderVersionQuery::create();
         foreach ($fkValues as $key => $value) {
             $c1 = $query->getNewCriterion(OrderVersionTableMap::ID, $value);
             $c2 = $query->getNewCriterion(OrderVersionTableMap::VERSION, $fkVersions[$key]);
             $c1->addAnd($c2);
             $query->addOr($c1);
         }
         foreach ($query->find($con) as $relatedVersion) {
             if (isset($loadedObjects['ChildOrder']) && isset($loadedObjects['ChildOrder'][$relatedVersion->getId()]) && isset($loadedObjects['ChildOrder'][$relatedVersion->getId()][$relatedVersion->getVersion()])) {
                 $related = $loadedObjects['ChildOrder'][$relatedVersion->getId()][$relatedVersion->getVersion()];
             } else {
                 $related = new ChildOrder();
                 $related->populateFromVersion($relatedVersion, $con, $loadedObjects);
                 $related->setNew(false);
             }
             $this->addOrder($related);
             $this->collOrdersPartial = false;
         }
     }
     return $this;
 }
예제 #11
0
 public function saveExtraInformation(&$data, Order $order, Address $address)
 {
     $service = $this->getRequest()->request->get("tnt_service");
     //By default, if no service is selected, choose the INDIVIDUAL ONE
     if (!in_array($service, ['INDIVIDUAL', 'ENTERPRISE', 'DEPOT', 'DROPOFFPOINT'])) {
         $this->getRequest()->request->set('tnt_service', 'INDIVIDUAL');
         $data['tnt_service'] = 'INDIVIDUAL';
         TNTFrance::setExtraOrderData($this->getRequest()->getSession()->getSessionCart()->getId(), $data);
         /** @var \Thelia\Model\Customer $customer */
         if (null == ($customer = $order->getCustomer())) {
             //Customer in front
             $customer = $this->getRequest()->getSession()->getCustomerUser();
         }
         //We must ask fasaibility to tnt
         /** @var Feasibility $ws */
         $ws = $this->container->get('tnt.ws.factory')->get('feasibility');
         $ws->setZipCode($customer->getDefaultAddress()->getZipcode())->setCity($customer->getDefaultAddress()->getCity())->setType($data['tnt_service']);
         $choices = $ws->exec();
         if (count($choices) > 0) {
             /** @var \TNTFrance\WebService\Model\TNTService $tntService */
             $tntService = $choices[0];
             $this->getRequest()->request->set('tnt_serviceCode', $tntService->getServiceCode() . '-' . $tntService->getServiceLabel());
         }
         if ($customer->getDefaultAddress()->getCellphone()) {
             $phoneNumber = $customer->getDefaultAddress()->getCellphone();
         } elseif ($customer->getDefaultAddress()->getPhone()) {
             $phoneNumber = $customer->getDefaultAddress()->getPhone();
         } else {
             throw new \Exception($this->trans('You must have a phone number to continue this order'));
         }
         $this->getRequest()->request->set('tnt_phoneNumber', str_replace(" ", "", $phoneNumber));
         $service = 'INDIVIDUAL';
         //throw new \Exception($this->trans('Invalid TNT service'));
     }
     switch ($service) {
         case 'INDIVIDUAL':
             if (null !== ($city = $this->getRequest()->request->get('tnt_city'))) {
                 $address->setCity($city)->save();
             }
             $fields = ['tnt_phoneNumber', 'tnt_accessCode', 'tnt_floorNumber', 'tnt_buldingId'];
             break;
         case 'ENTERPRISE':
             if (null !== ($city = $this->getRequest()->request->get('tnt_city'))) {
                 $address->setCity($city)->save();
             }
             $fields = ['tnt_instructions'];
             break;
         case 'DEPOT':
             $fields = ['tnt_pexCode', 'tnt_city', 'tnt_instructions', 'tnt_depot_address'];
             break;
         case 'DROPOFFPOINT':
             $fields = ['tnt_xettCode', 'tnt_contactLastName', 'tnt_contactFirstName', 'tnt_dop_address'];
             break;
         default:
             $fields = [];
             break;
     }
     foreach ($fields as $field) {
         $value = $this->getRequest()->request->get($field);
         if (in_array($field, ['tnt_dop_address', 'tnt_depot_address'])) {
             $data[$field] = json_decode($value);
         } else {
             $data[$field] = $value;
         }
     }
     // save the service code selected
     $serviceInfos = explode('-', $this->getRequest()->request->get("tnt_serviceCode"));
     $data["tnt_serviceCode"] = $serviceInfos[0];
     $data["tnt_serviceLabel"] = $serviceInfos[1];
     $errors = DataValidator::validateData($data, $service);
     if (count($errors)) {
         $message = '';
         foreach ($errors as $error) {
             $message .= $error->getMessage() . '<br>';
         }
         throw new \Exception($message);
     }
 }
예제 #12
0
 /**
  * Payment gateway invocation
  *
  * @param  Order $order processed order
  * @return Response the HTTP response
  */
 protected function doPay(Order $order)
 {
     if ('TEST' == Paybox::getConfigValue('mode', false)) {
         $platformUrl = Paybox::getConfigValue('url_serveur_test', false);
     } else {
         $platformUrl = Paybox::getConfigValue('url_serveur', false);
     }
     // Be sure to have a valid platform URL, otherwise give up
     if (false === $platformUrl) {
         throw new \InvalidArgumentException(Translator::getInstance()->trans("The platform URL is not defined, please check Paybox module configuration.", [], Paybox::MODULE_DOMAIN));
     }
     $hashAlgo = $this->getHashAlgorithm();
     $clefPrivee = Paybox::getConfigValue('clef_privee');
     // Generate a transaction ID
     $transactionId = sprintf("%010d", $order->getId());
     $order->setTransactionRef($transactionId)->save();
     $paybox_params = ['PBX_SITE' => Paybox::getConfigValue('numero_site'), 'PBX_RANG' => Paybox::getConfigValue('rang_site'), 'PBX_IDENTIFIANT' => Paybox::getConfigValue('identifiant_interne'), 'PBX_RETOUR' => self::PARAMETRES_RETOUR, 'PBX_HASH' => $hashAlgo, 'PBX_SECRET' => $clefPrivee, 'PBX_ANNULE' => Paybox::getConfigValue('url_retour_abandon'), 'PBX_EFFECTUE' => Paybox::getConfigValue('url_retour_succes'), 'PBX_REFUSE' => Paybox::getConfigValue('url_retour_refus'), 'PBX_REPONDRE_A' => Paybox::getConfigValue('url_ipn'), 'PBX_TOTAL' => round(100 * $order->getTotalAmount()), 'PBX_DEVISE' => $this->getCurrencyIso4217NumericCode($order->getCurrency()->getCode()), 'PBX_CMD' => $transactionId, 'PBX_PORTEUR' => $order->getCustomer()->getEmail(), 'PBX_TIME' => date("c"), 'PBX_RUF1' => 'POST'];
     // Generate signature
     $param = '';
     foreach ($paybox_params as $key => $value) {
         $param .= "&" . $key . '=' . $value;
     }
     $param = ltrim($param, '&');
     $binkey = pack('H*', $clefPrivee);
     $paybox_params['PBX_HMAC'] = strtoupper(hash_hmac($hashAlgo, $param, $binkey));
     return $this->generateGatewayFormResponse($order, $platformUrl, $paybox_params);
 }
예제 #13
0
파일: Atos.php 프로젝트: bibich/Atos
 /**
  *
  *  Method used by payment gateway.
  *
  *  If this method return a \Thelia\Core\HttpFoundation\Response instance, this response is send to the
  *  browser.
  *
  *  In many cases, it's necessary to send a form to the payment gateway.
  *  On your response you can return this form already completed, ready to be sent
  *
  * @param  \Thelia\Model\Order                       $order processed order
  * @return null|\Thelia\Core\HttpFoundation\Response
  */
 public function pay(Order $order)
 {
     $pathBin = self::getBinDirectory() . 'request';
     $atosCurrency = AtosCurrencyQuery::create()->findPk($order->getCurrency()->getCode());
     if (null == $atosCurrency) {
         throw new \InvalidArgumentException(sprintf("Atos does not supprot this currency : %s", $order->getCurrency()->getCode()));
     }
     $amount = $order->getTotalAmount();
     $amount = number_format($amount, $atosCurrency->getDecimals(), '', '');
     $transactionId = $this->generateTransactionID();
     $order->setTransactionRef($transactionId)->save();
     $router = $this->getContainer()->get('router.atos');
     $this->addParam('pathfile', self::getPathfilePath())->addParam('merchant_id', self::getConfigValue('atos_merchantId'))->addParam('customer_email', $order->getCustomer()->getEmail())->addParam('currency_code', $atosCurrency->getAtosCode())->addParam('amount', $amount)->addParam('language', $order->getLang()->getCode())->addParam('transaction_id', $transactionId)->addParam('order_id', $order->getId())->addParam('automatic_response_url', URL::getInstance()->absoluteUrl($router->generate('atos.payment.confirmation')))->addParam('cancel_return_url', $this->getPaymentFailurePageUrl($order->getId(), Translator::getInstance()->trans('you cancel the payment', [], Atos::MODULE_DOMAIN)))->addParam('normal_return_url', $this->getPaymentSuccessPageUrl($order->getId()));
     $encrypt = exec(sprintf("%s %s", $pathBin, $this->getParameters()));
     if (!empty($encrypt)) {
         $datas = explode('!', $encrypt);
         if ($datas[1] == '' && $datas[2] == '') {
             throw new \RuntimeException(Translator::getInstance()->trans('Request binary not found in "%path"', ['%path' => $pathBin]));
         } elseif ($datas[1] != 0) {
             throw new \RuntimeException($datas[2]);
         } else {
             $parser = $this->getContainer()->get('thelia.parser');
             $parser->setTemplateDefinition($parser->getTemplateHelper()->getActiveFrontTemplate());
             $content = $parser->renderString(file_get_contents(__DIR__ . DS . 'templates' . DS . 'atos' . DS . 'payment.html'), ['site_name' => self::getConfigValue('store_name'), 'form' => $datas[3]]);
             return Response::create($content);
         }
     } else {
         throw new \RuntimeException(Translator::getInstance()->trans('Empty response recevied from Atos binary "%path". Please check path and permissions.', ['%path' => $pathBin], self::MODULE_DOMAIN));
         // FIXME : show something to the customer
     }
 }
 /**
  * Send payment confirmation mail
  * @param OrderModel $order
  * @throws \Exception
  */
 public function sendConfirmationMail(OrderModel $order)
 {
     $storeName = ConfigQuery::read('store_name', false);
     $storeSite = ConfigQuery::read('url_site', false);
     $contactEmail = ConfigQuery::read('store_email', false);
     Tlog::getInstance()->info("Sending Stripe payment confirmation email from store contact e-mail {$contactEmail}");
     if ($contactEmail) {
         $this->getMailer()->sendEmailToCustomer(StripePayment::CONFIRMATION_MESSAGE_NAME, $order->getCustomer(), ["order_ref" => $order->getRef(), "store_name" => $storeName, "store_url" => $storeSite]);
     }
 }
예제 #15
0
 public function processGetOrders(ApiCallEvent $event)
 {
     $api = $event->getApi();
     $response = $api->getResponse();
     if ($response->isInError()) {
         $this->logger->error($response->getFormattedError());
         throw new BadResponseException($response->getFormattedError());
     }
     $dispatcher = $event->getDispatcher();
     $orders = $response->getGroup("Orders");
     $validOrders = [];
     /** @var \Thelia\Model\Country $country */
     $shopCountry = CountryQuery::create()->findOneByShopCountry(true);
     $calculator = new Calculator();
     /**
      * Check if there is only one order: reformat the array in that case
      */
     if (array_key_exists("IdOrder", $orders["Order"])) {
         $orders = array("Order" => [$orders["Order"]]);
     }
     $notImportedOrders = [];
     /**
      * Then treat the orders
      */
     foreach ($orders["Order"] as $orderArray) {
         /**
          * I) create the addresses
          */
         /**
          * Get delivery address, and format empty fields
          */
         $deliveryAddressArray =& $orderArray["ShippingAddress"];
         $deliveryCountryId = CountryQuery::create()->findOneByIsoalpha2(strtolower($deliveryAddressArray["Country"]))->getId();
         foreach ($deliveryAddressArray as &$value) {
             if (is_array($value)) {
                 $value = "";
             }
         }
         /**
          * Same for invoice address
          */
         $invoiceAddressArray =& $orderArray["BillingAddress"];
         $invoiceCountry = CountryQuery::create()->findOneByIsoalpha2(strtolower($invoiceAddressArray["Country"]));
         $invoiceCountryId = $invoiceCountry->getId();
         foreach ($invoiceAddressArray as &$value) {
             if (is_array($value)) {
                 $value = "";
             }
         }
         $title = CustomerTitleQuery::create()->findOne()->getId();
         /**
          * Create the order addresses
          */
         $deliveryAddressEvent = new AddressCreateOrUpdateEvent("Delivery address", $title, $deliveryAddressArray["FirstName"], $deliveryAddressArray["LastName"], $deliveryAddressArray["Street"], $deliveryAddressArray["Street1"], $deliveryAddressArray["Street2"], $deliveryAddressArray["PostalCode"], $deliveryAddressArray["Town"], $deliveryCountryId, $deliveryAddressArray["PhoneMobile"], $deliveryAddressArray["Phone"], $deliveryAddressArray["Company"]);
         $deliveryAddressEvent->setCustomer($this->shoppingFluxCustomer);
         $dispatcher->dispatch(TheliaEvents::ADDRESS_CREATE, $deliveryAddressEvent);
         $invoiceAddressEvent = new AddressCreateOrUpdateEvent("Invoice address", $title, $invoiceAddressArray["FirstName"], $invoiceAddressArray["LastName"], $invoiceAddressArray["Street"], $invoiceAddressArray["Street1"], $invoiceAddressArray["Street2"], $invoiceAddressArray["PostalCode"], $invoiceAddressArray["Town"], $deliveryCountryId, $invoiceAddressArray["PhoneMobile"], $invoiceAddressArray["Phone"], $invoiceAddressArray["Company"]);
         $invoiceAddressEvent->setCustomer($this->shoppingFluxCustomer);
         $dispatcher->dispatch(TheliaEvents::ADDRESS_CREATE, $invoiceAddressEvent);
         /**
          * II) Add the products to a cart
          */
         /**
          * Format the products array
          */
         if ($orderArray["NumberOfProducts"] == "1") {
             $orderArray["Products"] = array("Product" => [$orderArray["Products"]["Product"]]);
         }
         $productsArray =& $orderArray["Products"]["Product"];
         /**
          * Create a fake cart
          */
         $cart = new Cart();
         /**
          * And fulfil it with the products
          */
         foreach ($productsArray as &$productArray) {
             $ids = explode("_", $productArray["SKU"]);
             $cartPse = ProductSaleElementsQuery::create()->findPk($ids[1]);
             $calculator->load($cartPse->getProduct(), $shopCountry);
             $price = $calculator->getUntaxedPrice((double) $productArray["Price"]);
             $cart->addCartItem((new CartItem())->setProductSaleElements($cartPse)->setProduct($cartPse->getProduct())->setQuantity($productArray["Quantity"])->setPrice($price)->setPromoPrice(0)->setPromo(0));
         }
         /**
          * III) Create/Save the order
          */
         /**
          * Construct order model
          */
         $lang = LangQuery::create()->findOneByLocale($invoiceCountry->getLocale());
         $currency = CurrencyQuery::create()->findOneByCode("EUR");
         $order = OrderQuery::create()->findOneByRef($orderArray["IdOrder"]);
         if ($order !== null) {
             $order->delete();
         }
         $order = new Order();
         $order->setPostage($orderArray["TotalShipping"])->setChoosenDeliveryAddress($deliveryAddressEvent->getAddress()->getId())->setChoosenInvoiceAddress($invoiceAddressEvent->getAddress()->getId())->setDeliveryModuleId(ShoppingFluxConfigQuery::getDeliveryModuleId())->setPaymentModuleId($this->shoppingFluxPaymentModuleId)->setTransactionRef($orderArray["Marketplace"]);
         /**
          * Construct event
          */
         $orderEvent = new OrderManualEvent($order, $currency, $lang, $cart, $this->shoppingFluxCustomer);
         $orderEvent->setDispatcher($dispatcher);
         $dispatcher->dispatch(TheliaEvents::ORDER_CREATE_MANUAL, $orderEvent);
         $placedOrder = $orderEvent->getPlacedOrder();
         $placedOrder->setRef($orderArray["IdOrder"])->setPaid();
         $validOrders[] = ["IdOrder" => $placedOrder->getRef(), "Marketplace" => $placedOrder->getTransactionRef()];
     }
     /**
      * IV) Valid the orders to Shopping Flux
      */
     $request = new Request("ValidOrders");
     foreach ($validOrders as $validOrder) {
         $request->addOrder($validOrder);
     }
     $validOrdersApi = new ValidOrders($response->getToken(), $response->getMode());
     $validOrdersApi->setRequest($request);
     $validOrdersResponse = $validOrdersApi->getResponse();
     if ($validOrdersResponse->isInError()) {
         $this->logger->error($response->getFormattedError());
     }
 }
예제 #16
0
파일: Order.php 프로젝트: badelas/thelia
 /**
  * Update product quantity if new status is canceled or if old status is canceled.
  *
  * @param ModelOrder $order
  * @param $newStatus
  * @param $canceledStatus
  * @throws \Exception
  * @throws \Propel\Runtime\Exception\PropelException
  */
 protected function updateQuantityForCanceledOrder(ModelOrder $order, $newStatus, $canceledStatus)
 {
     $orderProductList = $order->getOrderProducts();
     /** @var OrderProduct  $orderProduct */
     foreach ($orderProductList as $orderProduct) {
         $productSaleElementsId = $orderProduct->getProductSaleElementsId();
         /** @var ProductSaleElements $productSaleElements */
         if (null !== ($productSaleElements = ProductSaleElementsQuery::create()->findPk($productSaleElementsId))) {
             if ($newStatus == $canceledStatus) {
                 $productSaleElements->setQuantity($productSaleElements->getQuantity() + $orderProduct->getQuantity());
             } else {
                 /* check still in stock */
                 if ($orderProduct->getQuantity() > $productSaleElements->getQuantity() && true === ConfigQuery::checkAvailableStock()) {
                     throw new TheliaProcessException($productSaleElements->getRef() . " : Not enough stock");
                 }
                 $productSaleElements->setQuantity($productSaleElements->getQuantity() - $orderProduct->getQuantity());
             }
             $productSaleElements->save();
         }
     }
 }
예제 #17
0
 public function pay(Order $order)
 {
     return RedirectResponse::create(URL::getInstance()->absoluteUrl("/module/paypal/goto/" . $order->getId()));
 }
예제 #18
0
 public static function getFromOrder(Order $order, $allInOne = true)
 {
     $translator = Translator::getInstance();
     if ($order->getDeliveryModuleId() !== TNTFrance::getModuleId()) {
         throw new \InvalidArgumentException($translator->trans("The order %id does not use the", ['id' => $order->getId()], TNTFrance::MESSAGE_DOMAIN));
     }
     $data = TNTFrance::getExtraOrderData($order->getId(), false);
     if (empty($data)) {
         throw new \InvalidArgumentException($translator->trans("No TNT data for order %id", ['id' => $order->getId()], TNTFrance::MESSAGE_DOMAIN));
     }
     $maxWeightPackage = TNTFrance::getConfigValue(TNTFranceConfigValue::MAX_WEIGHT_PACKAGE, 25);
     $parcelsRequest = [];
     $orderTotalWeight = 0;
     $packages = [];
     foreach ($order->getOrderProducts() as $orderProduct) {
         $orderProductWeight = $orderProduct->getQuantity() * $orderProduct->getWeight();
         $orderTotalWeight += $orderProductWeight;
         if (!$allInOne) {
             //If customer has choosen a manual number of package
             if ($orderProduct->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE) && intval($orderProduct->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE)) == $orderProduct->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE)) {
                 $orderProductPackages = $orderProduct->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE);
             } else {
                 if ($maxWeightPackage != 0) {
                     $orderProductPackages = ceil($orderProductWeight / $maxWeightPackage);
                 } else {
                     $orderProductPackages = 1;
                 }
             }
             //Divide the weight between packages
             for ($i = 1; $i <= $orderProductPackages; $i++) {
                 $packages[] = round($orderProductWeight / $orderProductPackages, 2);
             }
         }
     }
     if ($allInOne) {
         //If customer has choosen a manual number of package
         if ($order->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE) && intval($order->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE)) == $order->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE)) {
             $orderPackages = $order->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE);
         } else {
             $orderPackages = ceil($orderTotalWeight / $maxWeightPackage);
         }
         //Divide the weight between packages
         for ($i = 1; $i <= $orderPackages; $i++) {
             $packages[] = round($orderTotalWeight / $orderPackages, 2);
         }
     }
     foreach ($packages as $key => $packageWeight) {
         $parcelRequest = new TNTParcelRequest();
         $parcelRequest->setSequenceNumber($key + 1)->setCustomerReference($order->getCustomer()->getRef())->setWeight($packageWeight);
         $parcelsRequest[] = $parcelRequest;
     }
     if (count($parcelsRequest) == 0) {
         $parcelRequest = new TNTParcelRequest();
         $weight = 0.0;
         /** @var OrderProduct $orderProduct */
         foreach ($order->getOrderProducts() as $orderProduct) {
             $weight += $orderProduct->getQuantity() * floatval($orderProduct->getWeight());
         }
         $parcelRequest->setWeight($weight);
         $parcelRequest->setSequenceNumber(1);
         //$parcelRequest->setComment($data['tnt_instructions']);
         $parcelRequest->setCustomerReference($order->getCustomer()->getRef());
         $parcelsRequest[] = $parcelRequest;
     }
     return $parcelsRequest;
 }
예제 #19
0
 /**
  * Exclude object from result
  *
  * @param   ChildOrder $order Object to remove from the list of results
  *
  * @return ChildOrderQuery The current query, for fluid interface
  */
 public function prune($order = null)
 {
     if ($order) {
         $this->addUsingAlias(OrderTableMap::ID, $order->getId(), Criteria::NOT_EQUAL);
     }
     return $this;
 }
예제 #20
0
 /**
  * Filter the query by a related \Thelia\Model\Order object
  *
  * @param \Thelia\Model\Order|ObjectCollection $order  the related object to use as filter
  * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
  *
  * @return ChildCartQuery The current query, for fluid interface
  */
 public function filterByOrder($order, $comparison = null)
 {
     if ($order instanceof \Thelia\Model\Order) {
         return $this->addUsingAlias(CartTableMap::ID, $order->getCartId(), $comparison);
     } elseif ($order instanceof ObjectCollection) {
         return $this->useOrderQuery()->filterByPrimaryKeys($order->getPrimaryKeys())->endUse();
     } else {
         throw new PropelException('filterByOrder() only accepts arguments of type \\Thelia\\Model\\Order or Collection');
     }
 }
예제 #21
0
 /**
  *
  *  Method used by payment gateway.
  *
  *  If this method return a \Thelia\Core\HttpFoundation\Response instance, this response is send to the
  *  browser.
  *
  *  In many cases, it's necessary to send a form to the payment gateway. On your response you can return this form already
  *  completed, ready to be sent
  *
  * @param  \Thelia\Model\Order $order processed order
  * @return null|\Thelia\Core\HttpFoundation\Response
  */
 public function pay(Order $order)
 {
     $this->loadBitpayKeys();
     $client = new \Bitpay\Client\Client();
     $adapter = new \Bitpay\Client\Adapter\CurlAdapter();
     $config = new BitpayPaymentsConfig();
     $config->pushValues();
     if ($config->getSandbox()) {
         $pairingKey = $config->getPairingKeySandbox();
         $apiKey = $config->getApiKeySandbox();
         $network = new \Bitpay\Network\Testnet();
         $environment = "Sandbox";
     } else {
         $pairingKey = $config->getPairingKey();
         $apiKey = $config->getApiKey();
         $network = new \Bitpay\Network\Livenet();
         $environment = "Live";
     }
     $client->setPrivateKey($this->privateKey);
     $client->setPublicKey($this->publicKey);
     $client->setNetwork($network);
     $client->setAdapter($adapter);
     if (!isset($apiKey) || $apiKey == '') {
         // must create API key
         if (!isset($pairingKey) || $pairingKey == '') {
             // error: no pairing key
             $error = "Thelia BitpayPayments error: No API key or pairing key for environment {$environment} provided.";
             Tlog::getInstance()->error($error);
             throw new \Exception($error);
         } else {
             // pairing key available, now trying to get an API key
             $sin = \Bitpay\SinKey::create()->setPublicKey($this->publicKey)->generate();
             try {
                 $token = $client->createToken(array('pairingCode' => $pairingKey, 'label' => 'Thelia BitpayPayments', 'id' => (string) $sin));
             } catch (\Exception $e) {
                 $request = $client->getRequest();
                 $response = $client->getResponse();
                 $error = 'Thelia BitpayPayments error:' . PHP_EOL . PHP_EOL . $request . PHP_EOL . PHP_EOL . $response . PHP_EOL . PHP_EOL;
                 Tlog::getInstance()->error($error);
                 throw new \Exception($error);
             }
             $config->setApiKeyCurrentEnvironment($token->getToken());
             $config->setPairingKeyCurrentEnvironment('');
         }
     }
     // token should be available now
     $token = new \Bitpay\Token();
     $token->setToken($config->getApiKeyCurrentEnvironment());
     $client->setToken($token);
     $invoice = new \Bitpay\Invoice();
     $item = new \Bitpay\Item();
     $item->setCode('testCode');
     $item->setDescription('Purchase');
     $item->setPrice($order->getTotalAmount());
     $invoice->setItem($item);
     $invoice->setCurrency(new \Bitpay\Currency($order->getCurrency()->getCode()));
     try {
         $client->createInvoice($invoice);
     } catch (\Exception $e) {
         $request = $client->getRequest();
         $response = $client->getResponse();
         $error = 'Thelia BitpayPayments error:' . PHP_EOL . PHP_EOL . $request . PHP_EOL . PHP_EOL . $response . PHP_EOL . PHP_EOL;
         Tlog::getInstance()->error($error);
         throw new \Exception($error);
     }
 }
예제 #22
0
 /**
  * @depends testCreate
  *
  * @param OrderModel $order
  */
 public function testUpdateAddress(OrderModel $order)
 {
     $deliveryRef = uniqid('DELREF');
     $orderAddress = OrderAddressQuery::create()->findPk($order->getDeliveryOrderAddressId());
     $title = $orderAddress->getCustomerTitleId() == 3 ? 1 : 3;
     $country = $orderAddress->getCountryId() == 64 ? 1 : 64;
     $orderAddressEvent = new OrderAddressEvent($title, 'B', 'C', 'D', 'E', 'F', 'G', 'H', $country, 'J', 'K');
     $orderAddressEvent->setOrderAddress($orderAddress);
     $orderAddressEvent->setOrder($order);
     $this->orderAction->updateAddress($orderAddressEvent);
     $newOrderAddress = OrderAddressQuery::create()->findPk($orderAddress->getId());
     $this->assertEquals($title, $orderAddressEvent->getOrderAddress()->getCustomerTitleId());
     $this->assertEquals('B', $orderAddressEvent->getOrderAddress()->getFirstname());
     $this->assertEquals('C', $orderAddressEvent->getOrderAddress()->getLastname());
     $this->assertEquals('D', $orderAddressEvent->getOrderAddress()->getAddress1());
     $this->assertEquals('E', $orderAddressEvent->getOrderAddress()->getAddress2());
     $this->assertEquals('F', $orderAddressEvent->getOrderAddress()->getAddress3());
     $this->assertEquals('G', $orderAddressEvent->getOrderAddress()->getZipcode());
     $this->assertEquals('H', $orderAddressEvent->getOrderAddress()->getCity());
     $this->assertEquals($country, $orderAddressEvent->getOrderAddress()->getCountryId());
     $this->assertEquals('J', $orderAddressEvent->getOrderAddress()->getPhone());
     $this->assertEquals('K', $orderAddressEvent->getOrderAddress()->getCompany());
     $this->assertEquals($title, $newOrderAddress->getCustomerTitleId());
     $this->assertEquals('B', $newOrderAddress->getFirstname());
     $this->assertEquals('C', $newOrderAddress->getLastname());
     $this->assertEquals('D', $newOrderAddress->getAddress1());
     $this->assertEquals('E', $newOrderAddress->getAddress2());
     $this->assertEquals('F', $newOrderAddress->getAddress3());
     $this->assertEquals('G', $newOrderAddress->getZipcode());
     $this->assertEquals('H', $newOrderAddress->getCity());
     $this->assertEquals($country, $newOrderAddress->getCountryId());
     $this->assertEquals('J', $newOrderAddress->getPhone());
     $this->assertEquals('K', $newOrderAddress->getCompany());
 }
예제 #23
0
 /**
  * Create the form parameter list for the given order
  *
  * @param Order $order
  * @param string $payment_config single or multiple payment - see vads_payment_config parameter description
  *
  * @throws \InvalidArgumentException if an unsupported currency is used in order
  * @return array the payzen form parameters
  */
 protected function getPayzenParameters(Order $order, $payment_config)
 {
     $payzenApi = new PayzenMultiApi();
     // Total order amount
     $amount = $order->getTotalAmount();
     /** @var  PayzenCurrency $currency */
     // Currency conversion to numeric ISO 1427 code
     if (null === ($currency = $payzenApi->findCurrencyByAlphaCode($order->getCurrency()->getCode()))) {
         throw new \InvalidArgumentException(Translator::getInstance()->trans("Unsupported order currency: '%code'", array('%code' => $order->getCurrency()->getCode()), Payzen::MODULE_DOMAIN));
     }
     $customer = $order->getCustomer();
     // Get customer lang code and locale
     if (null !== ($langObj = LangQuery::create()->findPk($customer->getLang()))) {
         $customer_lang = $langObj->getCode();
         $locale = $langObj->getLocale();
     } else {
         $customer_lang = PayzenConfigQuery::read('default_language');
         $locale = LangQuery::create()->findOneByByDefault(true)->getLocale();
     }
     $address = $customer->getDefaultAddress();
     // Customer phone (first non empty)
     $phone = $address->getPhone();
     if (empty($phone)) {
         $phone = $address->getCellphone();
     }
     // Transaction ID
     $transaction_id = $this->getTransactionId();
     $order->setTransactionRef($transaction_id)->save();
     $payzen_params = array('vads_version' => 'V2', 'vads_contrib' => 'Thelia version ' . ConfigQuery::read('thelia_version'), 'vads_action_mode' => 'INTERACTIVE', 'vads_payment_config' => $this->getPaymentConfigValue($payment_config, $amount, $currency), 'vads_page_action' => 'PAYMENT', 'vads_return_mode' => 'POST', 'vads_shop_name' => ConfigQuery::read("store_name", ''), 'vads_url_success' => $this->getPaymentSuccessPageUrl($order->getId()), 'vads_url_refused' => $this->getPaymentFailurePageUrl($order->getId(), Translator::getInstance()->trans("Your payement has been refused"), [], Payzen::MODULE_DOMAIN), 'vads_url_referral' => $this->getPaymentFailurePageUrl($order->getId(), Translator::getInstance()->trans("Authorization request was rejected"), [], Payzen::MODULE_DOMAIN), 'vads_url_cancel' => $this->getPaymentFailurePageUrl($order->getId(), Translator::getInstance()->trans("You canceled the payement"), [], Payzen::MODULE_DOMAIN), 'vads_url_error' => $this->getPaymentFailurePageUrl($order->getId(), Translator::getInstance()->trans("An internal error occured"), [], Payzen::MODULE_DOMAIN), 'vads_site_id' => PayzenConfigQuery::read('site_id'), 'vads_key_test' => PayzenConfigQuery::read('test_certificate'), 'vads_key_prod' => PayzenConfigQuery::read('production_certificate'), 'vads_ctx_mode' => PayzenConfigQuery::read('mode'), 'vads_platform_url' => PayzenConfigQuery::read('platform_url'), 'vads_default_language' => PayzenConfigQuery::read('default_language'), 'vads_available_languages' => PayzenConfigQuery::read('available_languages'), 'vads_capture_delay' => PayzenConfigQuery::read('banking_delay'), 'vads_validation_mode' => PayzenConfigQuery::read('validation_mode'), 'vads_payment_cards' => PayzenConfigQuery::read('allowed_cards'), 'vads_redirect_enabled' => PayzenConfigQuery::read('redirect_enabled'), 'vads_redirect_success_timeout' => PayzenConfigQuery::read('success_timeout'), 'vads_redirect_success_message' => PayzenConfigQuery::read('success_message'), 'vads_redirect_error_timeout' => PayzenConfigQuery::read('failure_timeout'), 'vads_redirect_error_message' => PayzenConfigQuery::read('failure_message'), 'vads_language' => $customer_lang, 'vads_order_id' => $order->getId(), 'vads_currency' => $currency->num, 'vads_amount' => $currency->convertAmountToInteger($amount), 'vads_trans_id' => $transaction_id, 'vads_trans_date' => gmdate("YmdHis"), 'vads_threeds_mpi' => $amount >= PayzenConfigQuery::read('three_ds_minimum_order_amount', 0) ? 2 : 0, 'vads_cust_email' => $customer->getEmail(), 'vads_cust_id' => $customer->getId(), 'vads_cust_title' => $customer->getCustomerTitle()->setLocale($locale)->getLong(), 'vads_cust_last_name' => $customer->getLastname(), 'vads_cust_first_name' => $customer->getFirstname(), 'vads_cust_address' => trim($address->getAddress1() . ' ' . $address->getAddress2() . ' ' . $address->getAddress3()), 'vads_cust_city' => $address->getCity(), 'vads_cust_zip' => $address->getZipcode(), 'vads_cust_country' => CountryQuery::create()->findPk($address->getCountryId())->getIsoalpha2(), 'vads_cust_phone' => $phone);
     foreach ($payzen_params as $payzen_parameter_name => $value) {
         $payzenApi->set($payzen_parameter_name, $value);
     }
     return $payzenApi->getRequestFields();
 }
예제 #24
0
 public function sendEmailFromOrder(Order $order, $parcelResponses = [])
 {
     $customer = $order->getCustomer();
     $this->mailer->sendEmailToCustomer('mail_tnt_france', $customer, ['customer_id' => $customer->getId(), 'order_id' => $order->getId(), 'order_ref' => $order->getRef(), 'order_date' => $order->getCreatedAt(), 'update_date' => $order->getUpdatedAt(), 'parcel_responses' => $parcelResponses]);
 }
예제 #25
0
 /**
  * @covers Thelia\Coupon\CouponManager::getDiscount
  * @covers Thelia\Coupon\CouponManager::isCouponRemovingPostage
  * @covers Thelia\Coupon\CouponManager::sortCoupons
  * @covers Thelia\Coupon\CouponManager::getEffect
  */
 public function testGetDiscountCumulativeRemovingPostage()
 {
     $stubFacade = $this->generateFacadeStub();
     $stubContainer = $this->getMock('\\Symfony\\Component\\DependencyInjection\\Container');
     $conditionFactory = new ConditionFactory($stubContainer);
     $conditions = new ConditionCollection();
     $stubConditionFactory = $this->getMockBuilder('\\Thelia\\Condition\\ConditionFactory')->disableOriginalConstructor()->getMock();
     $stubConditionFactory->expects($this->any())->method('unserializeConditionCollection')->will($this->returnValue($conditions));
     $couponManager = new RemoveXAmount($stubFacade);
     $stubContainer->expects($this->any())->method('get')->will($this->onConsecutiveCalls($stubFacade, $couponManager, $stubConditionFactory, clone $couponManager, $stubConditionFactory, $stubFacade));
     $stubContainer->expects($this->any())->method('has')->will($this->returnValue(true));
     $couponFactory = new CouponFactory($stubContainer);
     $model1 = $this->generateCouponModel($stubFacade, $conditionFactory);
     $model1->setCode('XMAS')->setIsRemovingPostage(false)->setAmount(21.0);
     $coupon1 = $couponFactory->buildCouponFromModel($model1);
     $model2 = $this->generateCouponModel($stubFacade, $conditionFactory);
     $model2->setCode('XMAS2')->setIsRemovingPostage(true)->setAmount(21.5);
     $coupon2 = $couponFactory->buildCouponFromModel($model2);
     $stubFacade->expects($this->any())->method('getCurrentCoupons')->will($this->returnValue(array($coupon1, $coupon2)));
     $stubFacade->expects($this->any())->method('getCheckoutPostagePrice')->will($this->returnValue(8.300000000000001));
     $stubFacade->expects($this->any())->method('getCartTotalTaxPrice')->will($this->returnValue(122.53));
     $couponManager = new CouponManager($stubContainer);
     $couponManager->addAvailableCoupon($coupon1);
     $couponManager->addAvailableCoupon($coupon2);
     $actual = $couponManager->getDiscount();
     $expected = 21 + 21.5;
     $order = new Order();
     $order->setChoosenDeliveryAddress(1);
     $order->setDeliveryModuleId(1);
     $this->assertEquals($expected, $actual);
     $this->assertTrue($couponManager->isCouponRemovingPostage($order));
 }
예제 #26
0
 /**
  * Check if this module is the delivery module for a given order
  *
  * @param  Order $order an order
  * @return bool  true if this module is the delivery module for the given order.
  */
 public function isDeliveryModuleFor(Order $order)
 {
     $model = $this->getModuleModel();
     return $order->getDeliveryModuleId() == $model->getId();
 }
예제 #27
0
 public function import($startRecord = 0)
 {
     $count = 0;
     $errors = 0;
     $hdl = $this->t1db->query(sprintf("select * from commande order by id asc limit %d, %d", intval($startRecord), $this->getChunkSize()));
     while ($hdl && ($commande = $this->t1db->fetch_object($hdl))) {
         $count++;
         try {
             $this->order_corresp->getT2($commande->id);
             Tlog::getInstance()->warning("Order ID={$commande->id} already imported.");
             continue;
         } catch (ImportException $ex) {
             // Okay, the order was not imported.
         }
         try {
             if (null === ($customer = CustomerQuery::create()->findPk($this->cust_corresp->getT2($commande->client)))) {
                 throw new ImportException("Failed to find customer ID={$commande->client}");
             }
             if (null === ($status = OrderStatusQuery::create()->findPk($commande->statut))) {
                 throw new ImportException("Failed to find order status ID={$commande->statut}");
             }
             // Create invoice address
             if (false == ($adr_livr = $this->t1db->query_obj("select * from venteadr where id=?", array($commande->adrlivr)))) {
                 throw new ImportException("Failed to find delivery adresse ID={$commande->adrlivr}");
             }
             // Create invoice address
             if (false == ($adr_fact = $this->t1db->query_obj("select * from venteadr where id=?", array($commande->adrfact)))) {
                 throw new ImportException("Failed to find billing adresse ID={$commande->adrfact}");
             }
             $con = Propel::getConnection(OrderTableMap::DATABASE_NAME);
             $con->beginTransaction();
             try {
                 $order = new Order();
                 $delivery_adr = new OrderAddress();
                 $delivery_adr->setCustomerTitleId($this->getT2CustomerTitle($adr_livr->raison)->getId())->setCompany(isset($adr_livr->entreprise) ? $adr_livr->entreprise : '')->setFirstname($adr_livr->prenom)->setLastname($adr_livr->nom)->setAddress1($adr_livr->adresse1)->setAddress2($adr_livr->adresse2)->setAddress3($adr_livr->adresse3)->setZipcode($adr_livr->cpostal)->setCity($adr_livr->ville)->setPhone($adr_livr->tel)->setCountryId($this->getT2Country($adr_livr->pays)->getId())->save($con);
                 $billing_adr = new OrderAddress();
                 $billing_adr->setCustomerTitleId($this->getT2CustomerTitle($adr_fact->raison)->getId())->setCompany(isset($adr_fact->entreprise) ? $adr_fact->entreprise : '')->setFirstname($adr_fact->prenom)->setLastname($adr_fact->nom)->setAddress1($adr_fact->adresse1)->setAddress2($adr_fact->adresse2)->setAddress3($adr_fact->adresse3)->setZipcode($adr_fact->cpostal)->setCity($adr_fact->ville)->setPhone($adr_fact->tel)->setCountryId($this->getT2Country($adr_fact->pays)->getId())->save($con);
                 // Find the first availables delivery and payment modules, that's the best we can do.
                 $deliveryModule = ModuleQuery::create()->findOneByType(BaseModule::DELIVERY_MODULE_TYPE);
                 $paymentModule = ModuleQuery::create()->findOneByType(BaseModule::PAYMENT_MODULE_TYPE);
                 // Create a cart (now required)
                 $cart = new Cart();
                 $cart->save();
                 $order->setRef($commande->ref)->setCustomer($customer)->setInvoiceDate($commande->datefact)->setCurrency($this->getT2Currency($commande->devise))->setCurrencyRate($this->getT2Currency($commande->devise)->getRate())->setTransactionRef($commande->transaction)->setDeliveryRef($commande->livraison)->setInvoiceRef($commande->facture)->setPostage($commande->port)->setStatusId($status->getId())->setLang($this->getT2Lang($commande->lang))->setDeliveryOrderAddressId($delivery_adr->getId())->setInvoiceOrderAddressId($billing_adr->getId())->setDeliveryModuleId($deliveryModule->getId())->setPaymentModuleId($paymentModule->getId())->setDiscount($commande->remise)->setCartId($cart->getId())->save($con);
                 // Update the order reference
                 $order->setRef($commande->ref)->setCreatedAt($commande->date)->save();
                 if ($commande->remise > 0) {
                     $coupon = new OrderCoupon();
                     $coupon->setOrder($order)->setCode('Not Available')->setType('UNKNOWN')->setAmount($commande->remise)->setTitle('Imported from Thelia 1')->setShortDescription('Imported from Thelia 1')->setDescription('Imported from Thelia 1')->setExpirationDate(time())->setIsCumulative(false)->setIsRemovingPostage(false)->setIsAvailableOnSpecialOffers(false)->setSerializedConditions(new ConditionCollection(array()))->save($con);
                 }
                 $vps = $this->t1db->query_list("select * from venteprod where commande=?", array($commande->id));
                 foreach ($vps as $vp) {
                     $parent = 0;
                     if (isset($vp->parent) && $vp->parent != 0) {
                         $parent = $this->product_corresp->getT2($vp->parent);
                     }
                     $orderProduct = new OrderProduct();
                     $orderProduct->setOrder($order)->setProductRef($vp->ref)->setProductSaleElementsRef($vp->ref)->setTitle($vp->titre)->setChapo($vp->chapo)->setDescription($vp->description)->setPostscriptum("")->setQuantity($vp->quantite)->setPrice($vp->prixu / (1 + $vp->tva / 100))->setPromoPrice($vp->prixu / (1 + $vp->tva / 100))->setWasNew(false)->setWasInPromo(false)->setWeight(0)->setEanCode("")->setTaxRuleTitle("")->setTaxRuleDescription("")->setParent($parent)->save($con);
                     $orderProductTax = new OrderProductTax();
                     $orderProductTax->setAmount($orderProduct->getPrice() * ($vp->tva / 100))->setPromoAmount(0)->setOrderProduct($orderProduct)->setTitle("TVA {$vp->tva} %")->setDescription("TVA {$vp->tva} %")->save($con);
                 }
                 $con->commit();
             } catch (\Exception $ex) {
                 $con->rollBack();
                 throw $ex;
             }
         } catch (\Exception $ex) {
             Tlog::getInstance()->addError("Failed to import order ref {$commande->ref}: ", $ex->getMessage());
             $errors++;
         }
     }
     return new ImportChunkResult($count, $errors);
 }