/** * 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); }
/** * @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']); }
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); }
/** * 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; }
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; }
/** * @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; }
/** * @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); }
/** * 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'); } }
/** * 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; }
/** * 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; }
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); } }
/** * 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); }
/** * * 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]); } }
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()); } }
/** * 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(); } } }
public function pay(Order $order) { return RedirectResponse::create(URL::getInstance()->absoluteUrl("/module/paypal/goto/" . $order->getId())); }
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; }
/** * 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; }
/** * 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'); } }
/** * * 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); } }
/** * @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()); }
/** * 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(); }
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]); }
/** * @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)); }
/** * 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(); }
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); }