public function __construct(Product $product, $prices = null, LiveCart $application) { $this->product = $product; $this->application = $application; if (is_null($prices) && $product->getID()) { $prices = $product->getRelatedRecordSet("ProductPrice", new ARSelectFilter()); } if ($prices instanceof ARSet) { foreach ($prices as $price) { $this->setPrice($price); } } else { if (is_array($prices)) { foreach ($prices as $id => $price) { if (array_key_exists('ID', $price)) { $this->prices[$id] = ProductPrice::getInstance($product, Currency::getInstanceById($id)); } else { $this->prices[$id] = ProductPrice::getNewInstance($product, Currency::getInstanceById($id)); } $this->prices[$id]->price->set($price['price']); $this->prices[$id]->listPrice->set($price['listPrice']); $this->prices[$id]->serializedRules->set(serialize($price['serializedRules'])); $this->prices[$id]->resetModifiedStatus(); } } } }
public function applyToOrder(CustomerOrder $order) { $currencyID = $this->getFieldValue('currency', ''); if ($currencyID) { $currency = Currency::getInstanceById($currencyID); $order->changeCurrency($currency); ActiveRecordModel::getApplication()->getRequest()->set('currency', $currencyID); } }
public function process() { $source = CurrencyRateSource::getInstance($this->application); foreach ($source->getAllCurrencyCodes() as $currencyCode) { $rate = $source->getRate($currencyCode); if ($rate != null) { $currency = Currency::getInstanceById($currencyCode); $currency->rate->set($rate); $currency->lastUpdated->set(date('Y-m-d H:i:s', time())); $currency->save(); } } $this->application->getCache()->set('currencyRateUpdateTs', time()); }
function __construct($filterID, LiveCart $application) { $this->filterID = $filterID; $this->application = $application; $c = $this->application->getConfig(); for ($definedFilterCount = 1; $definedFilterCount <= self::MAX_FILTER_COUNT; $definedFilterCount++) { if (!$c->get('PRICE_FILTER_FROM_' . $definedFilterCount) && !$c->get('PRICE_FILTER_TO_' . $definedFilterCount)) { break; } } $definedFilterCount--; $this->name = $c->get('PRICE_FILTER_NAME_' . $filterID); $setCustomName = !strlen(trim($this->name)); $this->priceFrom = $c->get('PRICE_FILTER_FROM_' . $filterID); $this->priceTo = $c->get('PRICE_FILTER_TO_' . $filterID); $requestCurrencyID = $this->application->controllerInstance->getRequestCurrency(); $defaultCurrency = $this->application->getDefaultCurrency(); if ($defaultCurrency->getID() != $requestCurrencyID) { $setCustomName = true; $requestCurrency = Currency::getInstanceById($requestCurrencyID); foreach (array('priceFrom', 'priceTo') as $price) { $this->{$price} = $requestCurrency->convertAmount($defaultCurrency, $this->{$price}); if ($this->{$price} != 0) { $this->{$price} = $requestCurrency->round($this->{$price}); } } } if ($setCustomName) { if ($this->priceFrom == 0) { $this->name = $this->application->maketext('_to [_1]', $this->priceTo); } else { if ($definedFilterCount == $filterID && $this->priceFrom * 2 < $this->priceTo) { $this->name = $this->application->maketext('_more_than [_1]', $this->priceFrom); } else { $this->name = $this->application->maketext('[_1] - [_2]', array($this->priceFrom, $this->priceTo)); } } } }
public static function getNewInstance(CustomerOrder $order, TransactionResult $result) { $instance = parent::getNewInstance(__CLASS__); $instance->order->set($order); $instance->gatewayTransactionID->set($result->gatewayTransactionID->get()); // determine currency if ($result->currency->get()) { $instance->realCurrency->set(Currency::getInstanceById($result->currency->get())); } else { $instance->realCurrency->set($order->currency->get()); } // amount $instance->realAmount->set($result->amount->get()); // different currency than initial order currency? if ($order->currency->get()->getID() != $result->currency->get()) { $instance->amount->set($order->currency->get()->convertAmount($instance->realCurrency->get(), $instance->realAmount->get())); $instance->currency->set($order->currency->get()); // test if some amount is not missing due to currency conversion rounding (a difference of 0.01, etc) $total = $order->totalAmount->get(); if ($instance->amount->get() < $total) { $largerAmount = $order->currency->get()->convertAmount($instance->realCurrency->get(), 0.01 + $instance->realAmount->get()); if ($largerAmount >= $total) { $instance->amount->set($total); } } } // transaction type $instance->type->set($result->getTransactionType()); if ($instance->type->get() != self::TYPE_AUTH) { $instance->isCompleted->set(true); } if ($result->details->get()) { $instance->comment->set($result->details->get()); } return $instance; }
public function getNextCustomerOrder() { if (!($data = $this->loadRecord('SELECT ' . $this->getTablePrefix() . 'orders.*, ' . $this->getTablePrefix() . 'customers.email AS userEmail FROM ' . $this->getTablePrefix() . 'orders LEFT JOIN ' . $this->getTablePrefix() . 'customers ON ' . $this->getTablePrefix() . 'orders.login='******'customers.login'))) { return null; } if (!($user = User::getInstanceByEmail($data['userEmail']))) { return $this->getNextCustomerOrder(); } $order = CustomerOrder::getNewInstance($user); $order->currency->set(Currency::getInstanceById($this->getDefaultCurrency())); $order->dateCompleted->set($data['date']); // products foreach ($this->getDataBySql('SELECT * FROM ' . $this->getTablePrefix() . 'order_details WHERE orderid=' . $data['orderid']) as $prod) { try { $product = Product::getInstanceById($this->getRealId('Product', $prod['productid']), true); $order->addProduct($product, $prod['amount'], true); $item = array_shift($order->getItemsByProduct($product)); $item->price->set($prod['price']); } catch (ARNotFoundException $e) { // the product no longer exists } } // addresses $order->shippingAddress->set($this->getUserAddress($data, 's_')); $order->billingAddress->set($this->getUserAddress($data, 'b_')); // assume that all orders are paid and shipped $order->status->set(CustomerOrder::STATUS_SHIPPED); $order->isPaid->set(true); $order->rawData = $data; return $order; }
public function getNextCustomerOrder() { if (!($data = $this->loadRecord('SELECT *, ' . $this->getTablePrefix() . 'orders.orders_id AS id, ' . $this->getTablePrefix() . 'orders_total.value FROM ' . $this->getTablePrefix() . 'orders LEFT JOIN ' . $this->getTablePrefix() . 'orders_total ON (' . $this->getTablePrefix() . 'orders.orders_id=' . $this->getTablePrefix() . 'orders_total.orders_id AND class="ot_shipping") LEFT JOIN ' . $this->getTablePrefix() . 'customers ON (' . $this->getTablePrefix() . 'orders.customers_id=' . $this->getTablePrefix() . 'customers.customers_id) WHERE ' . $this->getTablePrefix() . 'customers.customers_id IS NOT NULL'))) { return null; } $order = CustomerOrder::getNewInstance(User::getInstanceById($this->getRealId('User', $data['customers_id']))); $order->currency->set(Currency::getInstanceById($data['currency'])); $order->dateCompleted->set($data['date_purchased']); // products $tax = 0; foreach ($this->getDataBySql('SELECT *, ' . $this->getTablePrefix() . 'orders_products.products_quantity AS quant FROM ' . $this->getTablePrefix() . 'orders_products LEFT JOIN ' . $this->getTablePrefix() . 'products ON (' . $this->getTablePrefix() . 'orders_products.products_id=' . $this->getTablePrefix() . 'products.products_id) WHERE ' . $this->getTablePrefix() . 'orders_id=' . $data['id'] . ' AND ' . $this->getTablePrefix() . 'products.products_id IS NOT NULL') as $prod) { $product = Product::getInstanceById($this->getRealId('Product', $prod['products_id'])); if (!$prod['quant']) { continue; } $item = $order->addProduct($product, $prod['quant'], true); $item->price->set($prod['products_price']); $tax += $prod['products_tax']; } // addresses $order->shippingAddress->set($this->getUserAddress($data, 'delivery_')); $order->billingAddress->set($this->getUserAddress($data, 'billing_')); // assume that all orders are paid and shipped $order->status->set(CustomerOrder::STATUS_SHIPPED); $order->isPaid->set(true); $data['taxAmount'] = $tax; $order->rawData = $data; return $order; }
/** * Sets default currency. * @role status * @return ActionRedirectResponse */ public function setDefault() { try { $r = ActiveRecord::getInstanceByID('Currency', $this->request->get('id'), true); } catch (ARNotFoundException $e) { return new ActionRedirectResponse('backend.currency', 'index'); } ActiveRecord::beginTransaction(); $update = new ARUpdateFilter(); $update->addModifier('isDefault', 0); ActiveRecord::updateRecordSet('Currency', $update); $r->setAsDefault(true); $r->save(); $config = $this->getApplication()->getConfig(); if ($config->get('CURRENCY_RATE_UPDATE')) { $source = CurrencyRateSource::getInstance($this->application, $r->getID()); foreach ($source->getAllCurrencyCodes() as $currencyCode) { $rate = $source->getRate($currencyCode); if ($rate != null) { $currency = Currency::getInstanceById($currencyCode); $currency->rate->set($rate); $currency->lastUpdated->set(date('Y-m-d H:i:s', time())); $currency->save(); } } } ActiveRecord::commit(); return new ActionRedirectResponse('backend.currency', 'index'); }
public function getPaymentHandler($className, LiveCartTransaction $details = null) { if (!class_exists($className, false)) { if ('OfflineTransactionHandler' == $className) { ClassLoader::import('application.model.order.OfflineTransactionHandler'); } else { ClassLoader::importNow('library.payment.method.*'); ClassLoader::importNow('library.payment.method.cc.*'); ClassLoader::importNow('library.payment.method.express.*'); } } if (is_null($details)) { $details = new TransactionDetails(); } $inst = new $className($details); if ($details instanceof LiveCartTransaction) { $inst->setOrder($details->getOrder()); } $c = $this->config->getSection('payment/' . $className); foreach ($c as $key => $value) { $value = $this->config->get($key); $key = substr($key, strlen($className) + 1); $inst->setConfigValue($key, $value); } // check if the currency is supported by the payment handler $currency = $inst->getValidCurrency($details->currency->get()); if ($details->currency->get() != $currency && !is_null($details->currency->get())) { $newAmount = Currency::getInstanceById($currency, Currency::LOAD_DATA)->convertAmount(Currency::getInstanceById($details->currency->get(), Currency::LOAD_DATA), $details->amount->get()); $details->currency->set($currency); $details->amount->set(round($newAmount, 2)); } $inst->setApplication($this); return $inst; }
public function toArray($amount = null) { $array = parent::toArray(); if (!is_null($amount)) { $array['costAmount'] = $amount; } if (!$this->application) { $this->application = ActiveRecordModel::getApplication(); } $amountCurrency = Currency::getInstanceById($array['costCurrency']); $currencies = $this->application->getCurrencySet(); // get and format prices $prices = $formattedPrices = $taxPrices = $unformattedTaxPrices = array(); foreach ($currencies as $id => $currency) { $prices[$id] = $currency->convertAmount($amountCurrency, $array['costAmount']); $formattedPrices[$id] = $currency->getFormattedPrice($prices[$id]); $unformattedTaxPrices[$id] = $currency->convertAmount($amountCurrency, $this->amountWithTax); $taxPrices[$id] = $currency->getFormattedPrice($unformattedTaxPrices[$id]); $withoutTaxPrices[$id] = $currency->convertAmount($amountCurrency, $this->amountWithoutTax); $formattedWithoutTaxPrices[$id] = $currency->getFormattedPrice($withoutTaxPrices[$id]); } $array['price'] = $prices; $array['priceWithTax'] = $unformattedTaxPrices; $array['formattedPrice'] = $formattedPrices; $array['taxPrice'] = $taxPrices; $array['priceWithoutTax'] = $withoutTaxPrices; $array['formattedPriceWithoutTax'] = $formattedWithoutTaxPrices; // shipping service name $id = $this->getServiceID(); if (is_numeric($id)) { try { $service = ShippingService::getInstanceById($id, ShippingService::LOAD_DATA); $array['ShippingService'] = $service->toArray(); } catch (ARNotFoundException $e) { return array(); } } else { $array['ShippingService'] = array('name_lang' => $this->getServiceName(), 'provider' => $this->getProviderName()); } return $array; }
private function toArray_CustomerOrder($records) { foreach ($records as &$order) { $currency = Currency::getInstanceById($order['currencyID']); $order['formattedTotalAmount'] = $currency->getFormattedPrice($order['totalAmount']); } }
public function toArray() { $array = parent::toArray(); $currency = $this->getCurrency(); $id = $currency->getID(); // ordered items $items = array(); foreach ($this->items as $item) { $items[] = $item->toArray(); } $array['items'] = $items; // subtotal $currencies = self::getApplication()->getCurrencySet(); $array['subTotal'][$id] = $this->getSubTotal(); // total amount $array['totalAmount'] = $this->getTotal(); $array['formatted_totalAmount'] = $this->order->get()->currency->get()->getFormattedPrice($array['totalAmount']); $array['formatted_amount'] = $this->order->get()->currency->get()->getFormattedPrice($array['amount']); // formatted subtotal $array['formattedSubTotal'] = $array['formattedSubTotalBeforeTax'] = array(); $array['formattedSubTotal'][$id] = $currency->getFormattedPrice($array['subTotal'][$id]); $array['formattedSubTotalBeforeTax'][$id] = $currency->getFormattedPrice($array['subTotal'][$id] - $this->getTaxAmount()); // selected shipping rate if ($selected = $this->getSelectedRate()) { $array['selectedRate'] = $selected->toArray($this->applyTaxesToShippingAmount($selected->getCostAmount())); if (!$array['selectedRate']) { unset($array['selectedRate']); } else { $array['ShippingService'] = $array['selectedRate']['ShippingService']; } } // shipping rate for a saved shipment if (!isset($array['selectedRate']) && isset($array['shippingAmount'])) { $array['shippingAmountWithoutTax'] = $array['shippingAmount']; $array['shippingAmount'] = $this->applyTaxesToShippingAmount($array['shippingAmount']); $orderCurrency = $this->order->get()->currency->get(); $array['selectedRate']['formattedPrice'] = array(); foreach ($currencies as $id => $currency) { $rate = $currency->convertAmount($orderCurrency, $array['shippingAmount']); $array['selectedRate']['formattedPrice'][$id] = Currency::getInstanceById($id)->getFormattedPrice($rate); $array['selectedRate']['formattedPriceWithoutTax'][$id] = Currency::getInstanceById($id)->getFormattedPrice($array['shippingAmountWithoutTax']); } } // taxes $taxes = array(); foreach ($this->getTaxes() as $tax) { if ($tax->taxRate->get()) { $taxes[$tax->taxRate->get()->tax->get()->getID()][] = $tax; } } foreach ($taxes as $taxType) { $amount = 0; foreach ($taxType as $tax) { $amount += $tax->amount->get(); } if ($amount > 0) { $array['taxes'][] = $tax->toArray($amount); } } // consists of downloadable files only? $array['isShippable'] = $this->isShippable(); // Statuses $array['isReturned'] = (int) $this->isReturned(); $array['isShipped'] = (int) $this->isShipped(); $array['isAwaitingShipment'] = (int) $this->isAwaitingShipment(); $array['isProcessing'] = (int) $this->isProcessing(); $array['isDelivered'] = (int) $this->isDelivered(); $array['isLost'] = (int) $this->isLost(); $array['AmountCurrency'] =& $array['Order']['Currency']; return $array; }
public function getCurrency() { return Currency::getInstanceById($this->currency); }
private function updatePrice($replaceQuantityPrices) { $request = $this->getApplication()->getRequest(); $sku = $request->get('sku'); $product = Product::getInstanceBySku($sku, array('ProductPrice')); if ($product == null) { throw new Exception('Product not found'); } $currency = $request->get('currency'); if ($currency == '') { $currency = $this->getApplication()->getDefaultCurrency()->getID(); } $price = $request->get('definedPrice'); if (is_numeric($price)) { $product->setPrice($currency, $price, false); } $price = $request->get('definedListPrice'); if (is_numeric($price)) { $product->setPrice($currency, $price, true); } $quantityPrices = $request->get('quantityPrices'); $groupedQuantityPrices = array(); foreach ($quantityPrices as $item) { if ($item['currency'] == '') { $item['currency'] = $currency; } if ($item['group'] == '') { $item['group'] = 0; } $groupedQuantityPrices[$item['currency']][$item['quantity']][$item['group']] = $item['price']; } foreach ($product->getRelatedRecordSet('ProductPrice', new ARSelectFilter()) as $productPrice) { if ($replaceQuantityPrices == true) { $productPrice->serializedRules->set(serialize(array())); } $currencyID = $productPrice->currency->get()->getID(); if (array_key_exists($currencyID, $groupedQuantityPrices)) { foreach ($groupedQuantityPrices[$currencyID] as $quanty => $qItem) { foreach ($qItem as $group => $price) { $group = !$group ? null : UserGroup::getInstanceByID($group); $productPrice->setPriceRule($quanty, $group, $price); } } $productPrice->save(); unset($groupedQuantityPrices[$currencyID]); // for this currency saved } } if (count($groupedQuantityPrices) > 0) { // there is missing ProductPrice for some currencies, // will try to save as new ProductPrice items foreach ($groupedQuantityPrices as $currency => $rules) { $productPrice = ProductPrice::getNewInstance($product, Currency::getInstanceById($currency)); $productPrice->serializedRules->set(serialize($rules)); $productPrice->save(); } } $product->save(); return $this->statusResponse($sku, 'updated'); }