private function save(RecurringProductPeriod $rpp) { $request = $this->getRequest(); $validator = $this->createFormValidator($rpp->toArray()); if ($validator->isValid()) { $rpp->loadRequestData($this->request); // null value is not set by loadRequestData().. $rebillCount = $this->request->get('rebillCount'); $rebillCount = floor($rebillCount); $rpp->rebillCount->set(is_numeric($rebillCount) && $rebillCount <= 0 ? $rebillCount : NULL); $rpp->save(); $product = $rpp->product->get(); $currencies = array(); foreach ($this->application->getCurrencyArray(true) as $currency) { if (array_key_exists($currency, $currencies) == false) { $currencies[$currency] = Currency::getInstanceByID($currency); } foreach (array(ProductPrice::TYPE_SETUP_PRICE => $request->get('ProductPrice_setup_price_' . $currency), ProductPrice::TYPE_PERIOD_PRICE => $request->get('ProductPrice_period_price_' . $currency)) as $type => $value) { $price = ProductPrice::getInstance($product, $currencies[$currency], $rpp, $type); if (strlen($value) == 0 && $price->isExistingRecord()) { $price->delete(); } else { $price->price->set($value); $price->save(); } } } return new JSONResponse(array('rpp' => $rpp->toArray()), 'success'); } else { return new JSONResponse(array('errors' => $validator->getErrorList()), 'failure', $this->translate('_could_not_save_recurring_product_period_entry')); } }
public function getDefaultRecurringProductPeriod() { $filter = new ARSelectFilter(); $filter->setLimit(1); $rs = RecurringProductPeriod::getRecordSetByProduct($this, $filter); if ($rs->size() == 0) { return null; } return $rs->shift(); }
public function changeRecurringProductPeriod() { $request = $this->getRequest(); $orderedItemID = $request->get('id'); $billingPlandropdownName = $request->get('recurringBillingPlan'); $recurringID = $request->get($billingPlandropdownName); $orderedItem = ActiveRecordModel::getInstanceByID('OrderedItem', $orderedItemID, true); $recurringItem = RecurringItem::getInstanceByOrderedItem($orderedItem); if ($recurringItem) { $recurringItem->setRecurringProductPeriod(RecurringProductPeriod::getInstanceByID($recurringID)); $recurringItem->save(); $orderedItem->updateBasePriceToCalculatedPrice(); } $this->order->loadItemData(); $this->order->mergeItems(); $this->order->save(); return new ActionRedirectResponse('order', 'index', array('query' => 'return=' . $this->request->get('return'))); }
public function generateTestInvoices() { return; ClassLoader::import('application.model.category.*'); ClassLoader::import('application.model.product.*'); $config = ActiveRecordModel::getApplication()->getConfig(); $config->set('RECURRING_BILLING_PAYMENT_DUE_DATE_DAYS', 7); $config->save(); // data $userID = 110; $product1ID = 339; $recurringProductPeriodID = 19; // ~ // create first order $user = User::getInstanceByID($userID, true); $product1 = Product::getInstanceByID($product1ID, true); $order = CustomerOrder::getNewInstance($user); $order->save(true); $rpp = RecurringProductPeriod::getInstanceByID($recurringProductPeriodID); $item = $order->addProduct($product1, 1, true); $item->save(); $recurringItem = RecurringItem::getNewInstance($rpp, $item); $recurringItem->setupPrice->set(100); $recurringItem->periodPrice->set(25); $recurringItem->save(); $order->finalize(); // generate invoices echo '<pre>Invoices for {CustomerOrder ID:' . $order->getID() . '}:', "\n"; $now = time(); for ($ts = $now; $ts < strtotime('+20 months', $now); $ts = $ts + 60 * 60 * 24) { $z = CustomerOrder::generateRecurringInvoices(date('Y-m-d', $ts)); foreach ($z as $id) { echo '{CustomerOrder ID:' . $id . '}', "\n"; } } die('-done-</pre>'); }
/** * 4. Select shipping methods * @role login */ public function shipping() { $shipments = $this->order->getShipments(); $this->restoreShippingMethodSelection(); if ($redirect = $this->validateOrder($this->order, self::STEP_SHIPPING)) { return $redirect; } if (!$this->order->isShippingRequired()) { return new ActionRedirectResponse('checkout', 'pay'); } foreach ($shipments as $shipment) { if (count($shipment->getItems()) == 0) { $shipment->delete(); $shipments->removeRecord($shipment); } } $form = $this->buildShippingForm($shipments); $needSelecting = null; foreach ($shipments as $key => $shipment) { if (!$shipment->isShippable()) { $download = $shipment; $downloadIndex = $key; $needSelecting = false; continue; } $shipmentRates = $shipment->getAvailableRates(); if ($shipmentRates->size() > 1) { $needSelecting = true; } else { if (!$shipmentRates->size()) { $validator = $this->buildAddressSelectorValidator($this->order, 'shipping'); $validator->triggerError('selectedAddress', $this->translate('_err_no_rates_for_address')); $validator->saveState(); return new ActionRedirectResponse('checkout', 'selectAddress'); } else { $shipment->setRateId($shipmentRates->get(0)->getServiceId()); if ($this->order->isMultiAddress->get()) { $shipment->save(); } } } $rates[$key] = $shipmentRates; if ($shipment->getSelectedRate()) { $form->set('shipping_' . $key, $shipment->getSelectedRate()->getServiceID()); } } SessionOrder::save($this->order); // only one shipping method for each shipment, so we pre-select it automatically if (is_null($needSelecting) && $this->config->get('SKIP_SHIPPING') && $this->config->get('CHECKOUT_CUSTOM_FIELDS') != 'SHIPPING_METHOD_STEP') { $this->order->serializeShipments(); SessionOrder::save($this->order); return new ActionRedirectResponse('checkout', 'pay'); } $rateArray = array(); foreach ((array) $rates as $key => $rate) { $rateArray[$key] = $rate->toArray(); } $response = new ActionResponse(); $shipmentArray = $shipments->toArray(); if (isset($download)) { $response->set('download', $download->toArray()); unset($shipmentArray[$downloadIndex]); } $locale = self::getApplication()->getLocale(); foreach ($rateArray as &$rates) { foreach ($rates as $k => &$item) { if (!empty($item['ShippingService']['deliveryTimeMinDays'])) { $item['ShippingService']['formatted_deliveryTimeMinDays'] = $locale->getFormattedTime(strtotime('+' . $item['ShippingService']['deliveryTimeMinDays'] . ' days')); } if (!empty($item['ShippingService']['deliveryTimeMaxDays'])) { $item['ShippingService']['formatted_deliveryTimeMaxDays'] = $locale->getFormattedTime(strtotime('+' . $item['ShippingService']['deliveryTimeMaxDays'] . ' days')); } } } unset($item); $recurringIDs = array(); $recurringPlans = array(); foreach ($shipmentArray as $item) { foreach ($item['Order']['cartItems'] as $orderedItem) { if (isset($orderedItem['recurringID'])) { $recurringIDs[] = $orderedItem['recurringID']; } } } if (count($recurringIDs)) { $this->loadLanguageFile('Product'); // contains translations for recurring product pricing. ClassLoader::import('application.model.product.RecurringProductPeriod'); $recurringPlans = RecurringProductPeriod::getRecordSetArrayByIDs($recurringIDs); $response->set('periodTypesPlural', RecurringProductPeriod::getAllPeriodTypes(RecurringProductPeriod::PERIOD_TYPE_NAME_PLURAL)); $response->set('periodTypesSingle', RecurringProductPeriod::getAllPeriodTypes(RecurringProductPeriod::PERIOD_TYPE_NAME_SINGLE)); } $response->set('shipments', $shipmentArray); $response->set('rates', $rateArray); $response->set('recurringPlans', $recurringPlans); $response->set('currency', $this->getRequestCurrency()); $response->set('form', $form); $response->set('order', $this->order->toArray()); $this->order->getSpecification()->setFormResponse($response, $form); $this->order->setCheckoutStep(CustomerOrder::CHECKOUT_ADDRESS); return $response; }
private function createRecurringProductPeriod($product, $periodLength = 28, $periodType = 1, $rebillCount = 100) { $rpp = RecurringProductPeriod::getNewInstance($product); $rpp->name->set('Test recurring #' . floor(mt_rand() * 1000)); $rpp->periodLength->set($periodLength); $rpp->periodType->set($periodType); $rpp->rebillCount->set($rebillCount); $rpp->description->set('Test recurring product period'); $rpp->save(); return $rpp; }
public function recurringBlock() { $response = new BlockResponse(); if ($this->product->type->get() == Product::TYPE_RECURRING) { ClassLoader::import('application.model.product.RecurringProductPeriod'); ClassLoader::import('application.model.product.RecurringItem'); $response->set('isRecurring', true); $response->set('periodTypesPlural', RecurringProductPeriod::getAllPeriodTypes(RecurringProductPeriod::PERIOD_TYPE_NAME_PLURAL)); $response->set('periodTypesSingle', RecurringProductPeriod::getAllPeriodTypes(RecurringProductPeriod::PERIOD_TYPE_NAME_SINGLE)); $response->set('recurringProductPeriods', RecurringProductPeriod::getRecordSetByProduct($this->product)->toArray()); } return $response; }
public static function getRecurringProductPeriodPrices(RecurringProductPeriod $rpp, $currencyID = null) { $filter = new ARSelectFilter(); $filter->setCondition(new EqualsCond(new ARFieldHandle(__CLASS__, 'recurringID'), $rpp->getID())); if ($currencyID != null && strlen($currencyID)) { $filter->mergeCondition(new EqualsCond(new ARFieldHandle(__CLASS__, 'currencyID'), $currencyID)); } return parent::getRecordSet(__CLASS__, $filter); }