'payment_id');
var $deleteToggle = array('payment' => array('payment_type', 'payment_id'));
function getMethods(&$order, $currency = '') {
$pluginClass = hikashop_get('class.plugins');
$shipping = '';
if(!empty($order->shipping))
$shipping = $order->shipping[0]->shipping_type.'_'.$order->shipping[0]->shipping_id;
$rates = $pluginClass->getMethods('payment', '', $shipping, $currency);
if(bccomp($order->total->prices[0]->price_value,0,5) && !empty($rates)) {
$currencyClass = hikashop_get('class.currency');
$currencyClass->convertPayments($rates);
}
return $rates;
}
function &getPayments(&$order,$reset=false) {
static $usable_methods = null;
static $errors = array();
if($reset){
$usable_methods = null;
$errors = array();
}
if(!is_null($usable_methods)){
$this->errors = $errors;
return $usable_methods;
}
JPluginHelper::importPlugin('hikashoppayment');
$dispatcher = JDispatcher::getInstance();
$max = 0;
$payment = '';
if(!empty($order->payment->payment_type) && !empty($order->payment->payment_id))
$payment = $order->payment->payment_type.'_'.$order->payment->payment_id;
$currency = @$order->total->prices[0]->price_currency_id;
if(empty($currency))
$currency = hikashop_getCurrency();
$methods = $this->getMethods($order, $currency);
if(empty($methods)) {
$errors[] = JText::_('CONFIGURE_YOUR_PAYMENT_METHODS');
$this->errors = $errors;
$usable_methods = false;
return $usable_methods;
}
$already = array();
$price_all = @$order->full_total->prices[0]->price_value_with_tax;
if(isset($order->full_total->prices[0]->price_value_without_payment_with_tax)) {
$price_all = $order->full_total->prices[0]->price_value_without_payment_with_tax;
}
$zoneClass = hikashop_get('class.zone');
$zones = $zoneClass->getOrderZones($order);
foreach($methods as $k => $method) {
if(!empty($method->payment_zone_namekey) && !in_array($method->payment_zone_namekey, $zones)) {
unset($methods[$k]);
continue;
}
if(!empty($method->payment_params->payment_zip_prefix) || !empty($method->payment_params->payment_min_zip) || !empty($method->payment_params->payment_max_zip) || !empty($method->payment_params->payment_zip_suffix)) {
$checkDone = false;
if(!empty($order->shipping_address) && !empty($order->shipping_address->address_post_code)) {
if(preg_match('#([a-z]*)([0-9]+)(.*)#i', preg_replace('#[^a-z0-9]#i', '', $order->shipping_address->address_post_code), $match)) {
$checkDone = true;
$prefix = $match[1];
$main = $match[2];
$suffix = $match[3];
if(!empty($method->payment_params->payment_zip_prefix) && $method->payment_params->payment_zip_prefix != $prefix) {
unset($methods[$k]);
continue;
}
if(!empty($method->payment_params->payment_min_zip) && $method->payment_params->payment_min_zip > $main) {
unset($methods[$k]);
continue;
}
if(!empty($method->payment_params->payment_max_zip) && $method->payment_params->payment_max_zip < $main) {
unset($methods[$k]);
continue;
}
if(!empty($method->payment_params->payment_zip_suffix) && $method->payment_params->payment_zip_suffix != $suffix) {
unset($methods[$k]);
continue;
}
}
}
if(!$checkDone) {
unset($methods[$k]);
continue;
}
}
$currencyClass = hikashop_get('class.currency');
$methods[$k]->payment_price = $currencyClass->round((@$order->full_total->prices[0]->price_value_without_shipping * (float)@$method->payment_params->payment_percentage / 100) + @$method->payment_price,$currencyClass->getRounding($currency,true));
$methods[$k]->ordering = $method->payment_ordering;
if(!empty($method->ordering) && $max < $method->ordering){
$max = $method->ordering;
}
}
foreach($methods as $k => $method) {
if(empty($method->ordering)) {
$max++;
$methods[$k]->ordering = $max;
}
while(isset($already[$methods[$k]->ordering])) {
$max++;
$methods[$k]->ordering = $max;
}
$already[$methods[$k]->ordering] = true;
}
$cartClass = hikashop_get('class.cart');
$paymentRecurringType = $cartClass->checkSubscription($order);
$order->paymentOptions = array(
'recurring' => ($paymentRecurringType == 'recurring'),
'term' => false,
'recurring' => false
);
$this->checkPaymentOptions($order);
$usable_methods = array();
$dispatcher->trigger('onPaymentDisplay', array(&$order, &$methods, &$usable_methods));
if(is_array($usable_methods) && !empty($usable_methods)) {
foreach($usable_methods as $k => $usable_method) {
if($paymentRecurringType == 'noRecurring' && (!empty($usable_method->features['recurring']) || (isset($usable_method->recurring) && $usable_method->recurring == 1))) {
unset($usable_methods[$k]);
continue;
}
if($paymentRecurringType == 'recurring' && empty($usable_method->features['recurring']) && (!isset($usable_method->recurring) || $usable_method->recurring != 1)) {
unset($usable_methods[$k]);
continue;
}
if(!empty($order->paymentOptions['term']) && empty($usable_method->features['authorize_capture'])) {
unset($usable_methods[$k]);
continue;
}
if(!empty($order->paymentOptions['refund']) && empty($usable_method->features['refund'])) {
unset($usable_methods[$k]);
continue;
}
}
}
if(empty($usable_methods)) {
$errors[] = JText::_('NO_PAYMENT_METHODS_FOUND');
$this->errors = $errors;
$usable_methods = false;
return $usable_methods;
}
ksort($usable_methods);
$this->errors = $errors;
return $usable_methods;
}
function computePrice($order, &$payment, $price_all, $payment_price, $currency) {
$currencyClass = hikashop_get('class.currency');
$zone_id = hikashop_getZone('shipping');
$payment->payment_currency_id = $currency;
if ( !empty( $payment->payment_params->payment_algorithm) && $payment->payment_params->payment_algorithm == 'realcost') {
if ( !empty( $payment->payment_params->payment_tax_id) && @$order->full_total->prices[0]->price_value != @$order->full_total->prices[0]->price_value_with_tax) {
$payment_price_with_tax = $currencyClass->getTaxedPrice( $payment_price,$zone_id, $payment->payment_params->payment_tax_id);
$payment_percentage = ((float)@$payment->payment_params->payment_percentage / 100);
$payment_percentage_with_tax = $currencyClass->getTaxedPrice( $payment_percentage,$zone_id, $payment->payment_params->payment_tax_id);
} else {
$payment_price_with_tax = $payment_price;
$payment_percentage_with_tax = ((float)@$payment->payment_params->payment_percentage / 100);
}
$payment_checkout = ($price_all + $payment_price_with_tax) / (1- $payment_percentage_with_tax);
$payment->payment_price_with_tax = $currencyClass->round( $payment_checkout - $price_all,$currencyClass->getRounding( $currency, true));
$payment->payment_price = $currencyClass->getUntaxedPrice( $payment->payment_price_with_tax,$zone_id, $payment->payment_params->payment_tax_id);
$payment->payment_tax = $payment->payment_price_with_tax - $payment->payment_price;
return $payment->payment_price;
} else {
$payment->payment_price = $currencyClass->round((@$order->full_total->prices[0]->price_value_without_shipping * (float)@$payment->payment_params->payment_percentage / 100) + $payment_price,$currencyClass->getRounding( $currency, true));
if ( !empty( $payment->payment_params->payment_tax_id) && isset($order->full_total->prices[0]->price_value_without_payment_with_tax)) {
$payment->payment_price_with_tax = $currencyClass->getTaxedPrice( $payment->payment_price,$zone_id, $payment->payment_params->payment_tax_id);
$payment->payment_tax = $payment->payment_price_with_tax - $payment->payment_price;
return $payment->payment_price_with_tax;
}
}
return $payment->payment_price;
}
function get($id, $default = '') {
static $cachedElements = array();
if($id=='reset_cache'){
$cachedElements = array();
}
if(!isset($cachedElements[$id])){
$result = parent::get($id);
if(!empty($result->payment_params)) {
$result->payment_params = unserialize($result->payment_params);
}
$cachedElements[$id] = $result;
}
return $cachedElements[$id];
}
function save(&$element, $reorder = true) {
JPluginHelper::importPlugin('hikashop');
$dispatcher = JDispatcher::getInstance();
$do = true;
if(empty($element->payment_id))
$dispatcher->trigger('onBeforeHikaPluginCreate', array('payment', &$element, &$do));
else
$dispatcher->trigger('onBeforeHikaPluginUpdate', array('payment', &$element, &$do));
if(!$do)
return false;
if(isset($element->payment_params) && !is_string($element->payment_params)){
$element->payment_params = serialize($element->payment_params);
}
if(isset($element->payment_shipping_methods) && is_array($element->payment_shipping_methods)) {
$element->payment_shipping_methods = implode("\n", $element->payment_shipping_methods);
}
if(isset($element->payment_currency) && is_array($element->payment_currency)) {
$element->payment_currency = implode(",", $element->payment_currency);
if(!empty($element->payment_currency))
$element->payment_currency = ','.$element->payment_currency.',';
}
if(empty($element->payment_id))
unset($element->payment_id);
$status = parent::save($element);
if($status){
$this->get('reset_cache');
}
if($status && empty($element->payment_id)) {
$element->payment_id = $status;
if($reorder) {
$orderClass = hikashop_get('helper.order');
$orderClass->pkey = 'payment_id';
$orderClass->table = 'payment';
$orderClass->groupVal = $element->payment_type;
$orderClass->orderingMap = 'payment_ordering';
$orderClass->reOrder();
}
}
if($status && !empty($element->payment_published) && !empty($element->payment_id)) {
$db = JFactory::getDBO();
$query = 'SELECT payment_type FROM ' . hikashop_table('payment') . ' WHERE payment_id = ' . (int)$element->payment_id;
$db->setQuery($query);
$name = $db->loadResult();
if(!HIKASHOP_J16) {
$query = 'UPDATE '.hikashop_table('plugins',false).' SET published = 1 WHERE published = 0 AND element = ' . $db->Quote($name) . ' AND folder = ' . $db->Quote('hikashoppayment');
} else {
$query = 'UPDATE '.hikashop_table('extensions',false).' SET enabled = 1 WHERE enabled = 0 AND type = ' . $db->Quote('plugin') . ' AND element = ' . $db->Quote($name) . ' AND folder = ' . $db->Quote('hikashoppayment');
}
$db->setQuery($query);
$db->query();
}
return $status;
}
function checkPaymentOptions(&$order) {
$ret = null;
JPluginHelper::importPlugin('hikashop');
$dispatcher = JDispatcher::getInstance();
$dispatcher->trigger('onCheckPaymentOptions', array( &$order->paymentOptions, &$order ) );
if(!empty($order->paymentOptions['term'])) {
if(empty($order->order_payment_params))
$order->order_payment_params = new stdClass();
$order->order_payment_params->need_authorization = true;
if(isset($order->order_full_price))
$order->order_payment_params->authorization_price = $order->order_full_price;
if(isset($order->full_total)) {
$order->order_payment_params->authorization_price = $order->full_total->prices[0]->price_value;
if(isset($order->full_total->prices[0]->price_value_with_tax))
$order->order_payment_params->authorization_price = $order->full_total->prices[0]->price_value_with_tax;
}
}
if(!empty($order->paymentOptions['refund'])) {
if(empty($order->order_payment_params))
$order->order_payment_params = new stdClass();
if(isset($order->order_full_price))
$order->order_payment_params->original_price = $order->order_full_price;
if(isset($order->full_total)) {
$order->order_payment_params->original_price = $order->full_total->prices[0]->price_value;
if(isset($order->full_total->prices[0]->price_value_with_tax))
$order->order_payment_params->original_price = $order->full_total->prices[0]->price_value_with_tax;
}
}
return $ret;
}
function readCC() {
$app = JFactory::getApplication();
$payment = $app->getUserState( HIKASHOP_COMPONENT.'.payment_method');
$payment_id = $app->getUserState( HIKASHOP_COMPONENT.'.payment_id');
$payment_data = $app->getUserState( HIKASHOP_COMPONENT.'.payment_data');
$ret = true;
if(!empty($payment_data->ask_cc)){
$cc_number = $app->getUserState( HIKASHOP_COMPONENT.'.cc_number');
$cc_month = $app->getUserState( HIKASHOP_COMPONENT.'.cc_month');
$cc_year = $app->getUserState( HIKASHOP_COMPONENT.'.cc_year');
$cc_CCV = $app->getUserState( HIKASHOP_COMPONENT.'.cc_CCV');
$cc_type = $app->getUserState( HIKASHOP_COMPONENT.'.cc_type');
$cc_owner = $app->getUserState( HIKASHOP_COMPONENT.'.cc_owner');
if(empty($cc_number) || empty($cc_month) || empty($cc_year) || (empty($cc_CCV)&&!empty($payment_data->ask_ccv)) || (empty($cc_owner)&&!empty($payment_data->ask_owner))){
$ret = false;
$cc_numbers = JRequest::getVar( 'hikashop_credit_card_number', array(), '', 'array' );
$cc_number='';
if(!empty($cc_numbers[$payment.'_'.$payment_id])){
$cc_number=preg_replace('#[^0-9]#','',$cc_numbers[$payment.'_'.$payment_id]);
}
$cc_months = JRequest::getVar( 'hikashop_credit_card_month', array(), '', 'array' );
$cc_month='';
if(!empty($cc_months[$payment.'_'.$payment_id])){
$cc_month=substr(preg_replace('#[^0-9]#','',$cc_months[$payment.'_'.$payment_id]),0,2);
if(strlen($cc_month)==1){
$cc_month='0'.$cc_month;
}
}
$cc_years = JRequest::getVar( 'hikashop_credit_card_year', array(), '', 'array' );
$cc_year='';
if(!empty($cc_years[$payment.'_'.$payment_id])){
$cc_year=substr(preg_replace('#[^0-9]#','',$cc_years[$payment.'_'.$payment_id]),0,2);
if(strlen($cc_year)==1){
$cc_year='0'.$cc_year;
}
}
$cc_CCVs = JRequest::getVar( 'hikashop_credit_card_CCV', array(), '', 'array' );
$cc_CCV='';
if(!empty($cc_CCVs[$payment.'_'.$payment_id])){
$cc_CCV=substr(preg_replace('#[^0-9]#','',$cc_CCVs[$payment.'_'.$payment_id]),0,4);
if(strlen($cc_CCV)<3){
$cc_CCV='';
}
}
$cc_types = JRequest::getVar( 'hikashop_credit_card_type', array(), '', 'array' );
$cc_type='';
if(!empty($cc_types[$payment.'_'.$payment_id])){
$cc_type=$cc_types[$payment.'_'.$payment_id];
}
$cc_owners = JRequest::getVar( 'hikashop_credit_card_owner', array(), '', 'array' );
$cc_owner='';
if(!empty($cc_owners[$payment.'_'.$payment_id])){
$cc_owner=strip_tags($cc_owners[$payment.'_'.$payment_id]);
}
$new_cc_valid = !(empty($cc_number) || empty($cc_month) || empty($cc_year) || (empty($cc_CCV)&&!empty($payment_data->ask_ccv)) || (empty($cc_owner)&&!empty($payment_data->ask_owner)));
if($new_cc_valid){
$app->setUserState( HIKASHOP_COMPONENT.'.cc_number',base64_encode($cc_number));
$app->setUserState( HIKASHOP_COMPONENT.'.cc_month',base64_encode($cc_month));
$app->setUserState( HIKASHOP_COMPONENT.'.cc_year',base64_encode($cc_year));
$app->setUserState( HIKASHOP_COMPONENT.'.cc_CCV',base64_encode($cc_CCV));
$app->setUserState( HIKASHOP_COMPONENT.'.cc_type',base64_encode($cc_type));
$app->setUserState( HIKASHOP_COMPONENT.'.cc_owner',base64_encode($cc_owner));
$ret = true;
}
}
}
return $ret;
}
function fillListingColumns(&$rows, &$listing_columns, &$view) {
$listing_columns['price'] = array(
'name' => 'PRODUCT_PRICE',
'col' => 'col_display_price'
);
$listing_columns['restriction'] = array(
'name' => 'HIKA_RESTRICTIONS',
'col' => 'col_display_restriction'
);
if(empty($rows)) return;
foreach($rows as &$row) {
if(!empty($row->payment_params) && is_string($row->payment_params))
$row->plugin_params = unserialize($row->payment_params);
$row->col_display_price = '';
if(bccomp($row->payment_price, 0, 3)) {
$row->col_display_price = $view->currencyClass->displayPrices(array($row), 'payment_price', 'payment_currency');
}
if(isset($row->plugin_params->payment_percentage) && bccomp($row->plugin_params->payment_percentage, 0, 3)) {
$row->col_display_price .= '
';
$row->col_display_price .= $row->plugin_params->payment_percentage.'%';
}
$restrictions = array();
if(!empty($row->plugin_params->payment_min_volume))
$restrictions[] = JText::_('SHIPPING_MIN_VOLUME') . ':' . $row->plugin_params->payment_min_volume . $row->plugin_params->payment_size_unit;
if(!empty($row->plugin_params->payment_max_volume))
$restrictions[] = JText::_('SHIPPING_MAX_VOLUME') . ':' . $row->plugin_params->payment_max_volume . $row->plugin_params->payment_size_unit;
if(!empty($row->plugin_params->payment_min_weight))
$restrictions[] = JText::_('SHIPPING_MIN_WEIGHT') . ':' . $row->plugin_params->payment_min_weight . $row->plugin_params->payment_weight_unit;
if(!empty($row->plugin_params->payment_max_weight))
$restrictions[] = JText::_('SHIPPING_MAX_WEIGHT') . ':' . $row->plugin_params->payment_max_weight . $row->plugin_params->payment_weight_unit;
if(isset($row->plugin_params->payment_min_price) && bccomp($row->plugin_params->payment_min_price, 0, 5)) {
$row->payment_min_price = $row->plugin_params->payment_min_price;
$restrictions[] = JText::_('SHIPPING_MIN_PRICE') . ':' . $view->currencyClass->displayPrices(array($row), 'payment_min_price', 'payment_currency');
}
if(isset($row->plugin_params->payment_max_price) && bccomp($row->plugin_params->payment_max_price, 0, 5)) {
$row->payment_max_price = $row->plugin_params->payment_max_price;
$restrictions[] = JText::_('SHIPPING_MAX_PRICE') . ':' . $view->currencyClass->displayPrices(array($row), 'payment_max_price', 'payment_currency');
}
if(!empty($row->plugin_params->payment_zip_prefix))
$restrictions[] = JText::_('SHIPPING_PREFIX') . ':' . $row->plugin_params->payment_zip_prefix;
if(!empty($row->plugin_params->payment_min_zip))
$restrictions[] = JText::_('SHIPPING_MIN_ZIP') . ':' . $row->plugin_params->payment_min_zip;
if(!empty($row->plugin_params->payment_max_zip))
$restrictions[] = JText::_('SHIPPING_MAX_ZIP') . ':' . $row->plugin_params->payment_max_zip;
if(!empty($row->plugin_params->payment_zip_suffix))
$restrictions[] = JText::_('SHIPPING_SUFFIX') . ':' . $row->plugin_params->payment_zip_suffix;
if(!empty($row->payment_zone_namekey)) {
$zone = $view->zoneClass->get($row->payment_zone_namekey);
$restrictions[] = JText::_('ZONE') . ':' . $zone->zone_name_english;
}
$row->col_display_restriction = implode('
', $restrictions);
unset($row);
}
}
}