public function backendOrders()
 {
     $view = wa()->getView();
     $plugin_model = new shopPluginModel();
     $workflow = new shopWorkflow();
     $view->assign('states', $workflow->getAvailableStates());
     $view->assign('payments', $plugin_model->listPlugins(shopPluginModel::TYPE_PAYMENT));
     $view->assign('shippings', $plugin_model->listPlugins(shopPluginModel::TYPE_SHIPPING));
     return array('sidebar_section' => $view->fetch($this->path . '/templates/actions/backend/BackendOrders.html'));
 }
 public function execute()
 {
     if (!$this->getUser()->getRights('shop', 'settings')) {
         throw new waRightsException(_w('Access denied'));
     }
     $model = new shopPluginModel();
     $this->view->assign('instances', $model->listPlugins(shopPluginModel::TYPE_PAYMENT, array('all' => true)));
     $this->view->assign('plugins', waPayment::enumerate());
     $this->view->assign('installer', $this->getUser()->getRights('installer', 'backend'));
 }
예제 #3
0
 public function display()
 {
     $plugin_model = new shopPluginModel();
     if (waRequest::param('payment_id') && is_array(waRequest::param('payment_id'))) {
         $methods = $plugin_model->getById(waRequest::param('payment_id'));
     } else {
         $methods = $plugin_model->listPlugins('payment');
     }
     $shipping = $this->getSessionData('shipping');
     if ($shipping) {
         $disabled = shopHelper::getDisabledMethods('payment', $shipping['id']);
     } else {
         $disabled = array();
     }
     $currencies = wa('shop')->getConfig()->getCurrencies();
     $selected = null;
     foreach ($methods as $key => $m) {
         $method_id = $m['id'];
         if (in_array($method_id, $disabled)) {
             unset($methods[$key]);
             continue;
         }
         $plugin = shopPayment::getPlugin($m['plugin'], $m['id']);
         $plugin_info = $plugin->info($m['plugin']);
         $methods[$key]['icon'] = $plugin_info['icon'];
         $custom_fields = $this->getCustomFields($method_id, $plugin);
         $custom_html = '';
         foreach ($custom_fields as $c) {
             $custom_html .= '<div class="wa-field">' . $c . '</div>';
         }
         $methods[$key]['custom_html'] = $custom_html;
         $allowed_currencies = $plugin->allowedCurrency();
         if ($allowed_currencies !== true) {
             $allowed_currencies = (array) $allowed_currencies;
             if (!array_intersect($allowed_currencies, array_keys($currencies))) {
                 $methods[$key]['error'] = sprintf(_w('Payment procedure cannot be processed because required currency %s is not defined in your store settings.'), implode(', ', $allowed_currencies));
             }
         }
         if (!$selected && empty($methods[$key]['error'])) {
             $selected = $method_id;
         }
     }
     $view = wa()->getView();
     $view->assign('checkout_payment_methods', $methods);
     $view->assign('payment_id', $this->getSessionData('payment', $selected));
     $checkout_flow = new shopCheckoutFlowModel();
     $step_number = shopCheckout::getStepNumber('payment');
     // IF no errors
     $checkout_flow->add(array('step' => $step_number));
     // ELSE
     //        $checkout_flow->add(array(
     //            'step' => $step_number,
     //            'description' => ERROR MESSAGE HERE
     //        ));
 }
 public function execute()
 {
     if (!$this->getUser()->getRights('shop', 'settings')) {
         throw new waRightsException(_w('Access denied'));
     }
     $model = new shopPluginModel();
     $this->view->assign('instances', $model->listPlugins(shopPluginModel::TYPE_SHIPPING, array('all' => true)));
     $this->view->assign('plugins', shopShipping::getList());
     $feature_model = new shopFeatureModel();
     $this->view->assign('no_weight', $feature_model->getByCode('weight') ? false : true);
     $this->view->assign('installer', $this->getUser()->getRights('installer', 'backend'));
 }
 public function execute()
 {
     if (!$this->getUser()->getRights('shop', 'settings')) {
         throw new waRightsException(_w('Access denied'));
     }
     $this->view->assign('plugin_id', $plugin_id = waRequest::get('plugin_id'));
     $this->view->assign('plugin', $info = shopPayment::getPluginInfo($plugin_id));
     $plugin = shopPayment::getPlugin($info['plugin'], $plugin_id);
     $params = array('namespace' => "payment[settings]", 'value' => waRequest::post('shipping[settings]'));
     $this->view->assign('settings_html', $plugin->getSettingsHTML($params));
     $this->view->assign('guide_html', $plugin->getGuide($params));
     $model = new shopPluginModel();
     $this->view->assign('shipping', $model->listPlugins(shopPluginModel::TYPE_SHIPPING, array('payment' => $plugin_id, 'all' => true)));
 }
예제 #6
0
 public static function savePlugin($plugin)
 {
     $default = array('status' => 0);
     $plugin = array_merge($default, $plugin);
     $model = new shopPluginModel();
     if (!empty($plugin['id']) && ($id = max(0, intval($plugin['id']))) && ($row = $model->getByField(array('id' => $id, 'type' => shopPluginModel::TYPE_PAYMENT)))) {
         $plugin['plugin'] = $row['plugin'];
         $model->updateById($plugin['id'], $plugin);
     } elseif (!empty($plugin['plugin'])) {
         $plugin['type'] = shopPluginModel::TYPE_PAYMENT;
         $plugin['id'] = $model->insert($plugin);
     }
     if (!empty($plugin['id']) && isset($plugin['settings'])) {
         waPayment::factory($plugin['plugin'], $plugin['id'], self::getInstance())->saveSettings($plugin['settings']);
     }
     if (!empty($plugin['id'])) {
         ifset($plugin['shipping'], array());
         $plugins = $model->listPlugins(shopPluginModel::TYPE_SHIPPING, array('all' => true));
         $app_settings = new waAppSettingsModel();
         $settings = json_decode($app_settings->get('shop', 'shipping_payment_disabled', '{}'), true);
         if (empty($settings) || !is_array($settings)) {
             $settings = array();
         }
         if (!isset($settings[$plugin['id']])) {
             $settings[$plugin['id']] = array();
         }
         $s =& $settings[$plugin['id']];
         foreach ($plugins as $item) {
             if (empty($plugin['shipping'][$item['id']])) {
                 $s[] = $item['id'];
             } else {
                 $key = array_search($item['id'], $s);
                 if ($key !== false) {
                     unset($s[$key]);
                 }
             }
         }
         $s = array_unique($s);
         if (empty($s)) {
             unset($settings[$plugin['id']]);
         }
         $app_settings->set('shop', 'shipping_payment_disabled', json_encode($settings));
     }
     return $plugin;
 }
예제 #7
0
 /**
  * Returns available shipping methods and rates for specified address.
  *
  * @param array $address Address data
  * @param array $items Order items
  * @param array $params Optional extra parameters:
  *     'payment'     => [int] payment method id for which available shipping methods must be returned
  *     'currency'    => [string] currency code to convert shipping rates to
  *     'total_price' => [float] arbitrary total order items cost to be taken into account for obtaining shipping rates
  * @return array
  */
 public static function getShippingMethods($address = null, $items = array(), $params = array())
 {
     $plugin_model = new shopPluginModel();
     $options = array();
     if (!empty($params[shopPluginModel::TYPE_PAYMENT])) {
         $options[shopPluginModel::TYPE_PAYMENT] = $params[shopPluginModel::TYPE_PAYMENT];
     }
     $methods = $plugin_model->listPlugins(shopPluginModel::TYPE_SHIPPING, $options);
     if ($address !== null) {
         $config = wa('shop')->getConfig();
         /**
          * @var $config shopConfig
          */
         $result = array();
         $currency = isset($params['currency']) ? $params['currency'] : $config->getCurrency();
         $dimensions = shopDimension::getInstance();
         foreach ($methods as $m) {
             if ($m['available']) {
                 $plugin = shopShipping::getPlugin($m['plugin'], $m['id']);
                 $plugin_info = $plugin->info($m['plugin']);
                 $plugin_currency = (array) $plugin->allowedCurrency();
                 $total = null;
                 if ($plugin_currency != $currency) {
                     if (!$config->getCurrencies($plugin_currency)) {
                         $result[$m['id']] = array('plugin' => $m['plugin'], 'logo' => $m['logo'], 'icon' => $plugin_info['icon'], 'img' => $plugin_info['img'], 'name' => $m['name'], 'error' => sprintf(_w('Shipping rate was not calculated because required currency %s is not defined in your store settings.'), implode(', ', $plugin_currency)), 'rate' => '', 'currency' => $currency);
                         continue;
                     }
                 }
                 if (isset($params['total_price'])) {
                     if (!in_array($currency, $plugin_currency)) {
                         $total = shop_currency($params['total_price'], $currency, reset($plugin_currency), false);
                     } else {
                         $total = $params['total_price'];
                     }
                 } else {
                     foreach ($items as $item) {
                         if (!empty($item['price'])) {
                             $total += $item['price'] * (isset($item['quantity']) ? $item['quantity'] : 1);
                         }
                         if ($total && !in_array($currency, $plugin_currency)) {
                             $total = shop_currency($total, $currency, reset($plugin_currency), false);
                         }
                     }
                 }
                 $weight_unit = $plugin->allowedWeightUnit();
                 foreach ($items as &$item) {
                     if (!empty($item['weight'])) {
                         $item['weight'] = $dimensions->convert($item['weight'], 'weight', $weight_unit);
                     }
                 }
                 unset($item);
                 $rates = $plugin->getRates($items, $address ? $address : array(), $total ? array('total_price' => $total) : array());
                 if (is_array($rates)) {
                     foreach ($rates as $rate_id => $info) {
                         if (is_array($info)) {
                             $rate = is_array($info['rate']) ? max($info['rate']) : $info['rate'];
                             $rate = (double) shop_currency($rate, reset($plugin_currency), $currency, false);
                             $result[$m['id'] . '.' . $rate_id] = array('plugin' => $m['plugin'], 'logo' => $m['logo'], 'icon' => $plugin_info['icon'], 'img' => $plugin_info['img'], 'name' => $m['name'] . (!empty($info['name']) ? ' (' . $info['name'] . ')' : ''), 'rate' => $rate, 'currency' => $currency);
                         }
                     }
                 } elseif (is_string($rates)) {
                     $result[$m['id']] = array('plugin' => $m['plugin'], 'logo' => $m['logo'], 'icon' => $plugin_info['icon'], 'img' => $plugin_info['img'], 'name' => $m['name'], 'error' => $rates, 'rate' => '', 'currency' => $currency);
                 }
             }
         }
         return $result;
     } else {
         return $methods;
     }
 }
 public function display()
 {
     $plugin_model = new shopPluginModel();
     if (waRequest::param('shipping_id') && is_array(waRequest::param('shipping_id'))) {
         $methods = $plugin_model->getById(waRequest::param('shipping_id'));
     } else {
         $methods = $plugin_model->listPlugins('shipping');
     }
     $address = $this->getAddress();
     $empty = true;
     foreach ($address as $v) {
         if ($v) {
             $empty = false;
             break;
         }
     }
     if ($empty) {
         $address = array();
     }
     $items = $this->getItems();
     $cart = new shopCart();
     $total = $cart->total();
     $settings = wa('shop')->getConfig()->getCheckoutSettings();
     $address_form = !isset($settings['contactinfo']) || !isset($settings['contactinfo']['fields']['address.shipping']);
     if (!isset($settings['contactinfo']) || !isset($settings['contactinfo']['fields']['address.shipping']) && !isset($settings['contactinfo']['fields']['address'])) {
         $settings = wa('shop')->getConfig()->getCheckoutSettings(true);
     }
     if (!$address) {
         $shipping_address = array();
         $address_form = true;
         if ($settings['contactinfo']['fields']['address']) {
             foreach ($settings['contactinfo']['fields']['address']['fields'] as $k => $f) {
                 if (!empty($f['value'])) {
                     $shipping_address[$k] = $f['value'];
                 }
             }
         }
     } else {
         $shipping_address = $address;
     }
     if (waRequest::method() == 'post') {
         $shipping_id = waRequest::post('shipping_id');
         $rate_id = waRequest::post('rate_id');
         $selected_shipping = array('id' => $shipping_id, 'rate_id' => !empty($rate_id[$shipping_id]) ? $rate_id[$shipping_id] : '');
     } else {
         $selected_shipping = $this->getSessionData('shipping', array());
     }
     $dimension = shopDimension::getInstance()->getDimension('weight');
     $currencies = wa('shop')->getConfig()->getCurrencies();
     foreach ($methods as $method_id => $m) {
         $plugin = shopShipping::getPlugin($m['plugin'], $m['id']);
         $plugin_info = $plugin->info($m['plugin']);
         $m['icon'] = $plugin_info['icon'];
         $m['img'] = $plugin_info['img'];
         $m['currency'] = $plugin->allowedCurrency();
         $weight_unit = $plugin->allowedWeightUnit();
         if ($weight_unit != $dimension['base_unit']) {
             $shipping_items = array();
             foreach ($items as $item_id => $item) {
                 if ($item['weight']) {
                     $item['weight'] = $item['weight'] / $dimension['units'][$weight_unit]['multiplier'];
                 }
                 $shipping_items[$item_id] = $item;
             }
         } else {
             $shipping_items = $items;
         }
         $m['external'] = $selected_shipping && $selected_shipping['id'] == $m['id'] ? 0 : $plugin->getProperties('external');
         if ($m['external']) {
             $m['rates'] = array();
         } else {
             $m['rates'] = $plugin->getRates($shipping_items, $shipping_address, array('total_price' => $total));
         }
         if (is_array($m['rates'])) {
             if (!isset($currencies[$m['currency']])) {
                 $m['rate'] = 0;
                 $m['error'] = sprintf(_w('Shipping rate was not calculated because required currency %s is not defined in your store settings.'), $m['currency']);
                 $methods[$method_id] = $m;
                 continue;
             }
             foreach ($m['rates'] as &$r) {
                 if (is_array($r['rate'])) {
                     $r['rate'] = max($r['rate']);
                 }
             }
             if ($m['rates']) {
                 if (!empty($selected_shipping['rate_id']) && isset($m['rates'][$selected_shipping['rate_id']])) {
                     $rate = $m['rates'][$selected_shipping['rate_id']];
                 } else {
                     $rate = reset($m['rates']);
                 }
                 $m['rate'] = $rate['rate'];
                 $m['est_delivery'] = isset($rate['est_delivery']) ? $rate['est_delivery'] : '';
                 if (!empty($rate['comment'])) {
                     $m['comment'] = $rate['comment'];
                 }
             } else {
                 $m['rates'] = array();
                 $m['rate'] = null;
             }
         } elseif (is_string($m['rates'])) {
             if ($address) {
                 $m['error'] = $m['rates'];
             } else {
                 $m['rates'] = array();
                 $m['rate'] = null;
             }
         } else {
             unset($methods[$method_id]);
             continue;
         }
         $custom_fields = $this->getCustomFields($method_id, $plugin);
         $custom_html = '';
         foreach ($custom_fields as $c) {
             $custom_html .= '<div class="wa-field">' . $c . '</div>';
         }
         if ($custom_html) {
             $m['custom_html'] = $custom_html;
         }
         $f = $this->getAddressForm($m['id'], $plugin, $settings, $address, $address_form);
         if ($f) {
             $m['form'] = $f;
             $m['form']->setValue($this->getContact());
         }
         $methods[$method_id] = $m;
     }
     $view = wa()->getView();
     $view->assign('checkout_shipping_methods', $methods);
     $default_method = '';
     foreach ($methods as $m) {
         if (empty($m['error'])) {
             $default_method = $m['id'];
             break;
         }
     }
     $view->assign('shipping', $selected_shipping ? $selected_shipping : array('id' => $default_method, 'rate_id' => ''));
     $checkout_flow = new shopCheckoutFlowModel();
     $step_number = shopOnestepCheckout::getStepNumber('shipping');
     // IF no errors
     $checkout_flow->add(array('step' => $step_number));
     // ELSE
     //        $checkout_flow->add(array(
     //            'step' => $step_number,
     //            'description' => ERROR MESSAGE HERE
     //        ));
 }
예제 #9
0
 public function shipping()
 {
     $plugin_model = new shopPluginModel();
     return $plugin_model->listPlugins('shipping');
 }