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'));
     }
 }
Пример #2
0
 public function getDefaultRecurringProductPeriod()
 {
     $filter = new ARSelectFilter();
     $filter->setLimit(1);
     $rs = RecurringProductPeriod::getRecordSetByProduct($this, $filter);
     if ($rs->size() == 0) {
         return null;
     }
     return $rs->shift();
 }
Пример #3
0
 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')));
 }
Пример #4
0
 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>');
 }
Пример #5
0
 /**
  *  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;
 }
Пример #6
0
 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;
 }
Пример #7
0
 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;
 }
Пример #8
0
 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);
 }