Current File : /home/pacjaorg/public_html/km/administrator/components/com_djclassifieds/lib/djpayment.php |
<?php
/**
* @package DJ-Classifieds
* @copyright Copyright (C) DJ-Extensions.com, All rights reserved.
* @license http://www.gnu.org/licenses GNU/GPL
* @author url: http://dj-extensions.com
* @author email contact@dj-extensions.com
*/
defined('_JEXEC') or die('Restricted access');
require_once JPATH_ROOT.'/components/com_djclassifieds/model.php';
require_once(JPATH_ROOT.'/administrator/components/com_djclassifieds/lib/djseo.php');
require_once(JPATH_ROOT.'/administrator/components/com_djclassifieds/lib/djnotify.php');
class DJClassifiedsPayment
{
static $_payment_types = array(
0 => '',
1 => 'points',
2 => 'prom_top',
3 => 'plan',
4 => 'order',
5 => 'offer'
);
public static function getTypePrice($user_id, $type_id)
{
$db = JFactory::getDBO();
$query = "SELECT * FROM #__djcf_types WHERE published=1 AND id=".(int)$type_id." LIMIT 1";
$db->setQuery($query);
$type = $db->loadObject();
if($user_id && $type){
$user = JFactory::getUser($user_id);
if(count($user->groups)){
$g_list = implode(',',$user->groups);
$query = "SELECT gp.* FROM #__djcf_groups_prices gp "
."WHERE gp.type='type' AND gp.group_id in(".$g_list.") AND item_id= ".$type->id;
$db->setQuery($query);
$types_prices = $db->loadObjectList();
if($types_prices){
foreach($types_prices as $tp){
$type->price = $tp->price;
$type->points = $tp->points;
}
}
}
}
return $type;
}
public static function getDirectPaymentAddress($user_id)
{
JPluginHelper::importPlugin('djclassifiedspayment');
$app = JFactory::getApplication();
$pay_address = '';
if(JPluginHelper::isEnabled('djclassifiedspayment', 'djcfpaypal')){
$pay_address = self::getUserPaypal($user_id);
}elseif(JPluginHelper::isEnabled('djclassifiedspayment', 'djcfPaypal')){ // backward compatibility
$pay_address = self::getUserPaypal($user_id);
}
$plugin_address = $app->triggerEvent('onDJClassifiedsGetDirectPaymentAddress', array($user_id));
if(!empty($plugin_address[0])){
$pay_address = $plugin_address[0];
}
return $pay_address;
}
public static function getUserPaypal($user_id){
$db = JFactory::getDBO();
$query = "SELECT v.value FROM #__djcf_fields_values_profile v, #__djcf_fields f "
."WHERE f.name='paypal_email' AND f.source=2 AND v.field_id=f.id AND v.user_id=".$user_id." LIMIT 1";
$db->setQuery($query);
$paypay_user = $db->loadResult();
return $paypay_user;
}
public static function confirmUserPayment($item, $type, $price_total, $method, $coupon_code = '')
{
JTable::addIncludePath(JPATH_ROOT.'/administrator/components/com_djclassifieds/tables');
$app = JFactory::getApplication();
$user = JFactory::getUser();
$row = JTable::getInstance('Payments', 'DJClassifiedsTable');
$row->item_id = $item->id;
$row->user_id = $user->id;
$row->method = $method;
$row->status = 'Completed';
$row->ip_address = $app->input->server->getStr('REMOTE_ADDR');
$row->price = 0;
$row->coupon = $coupon_code;
if($coupon_code){
$row->coupon_discount = $price_total;
}
if($type=='plan'){
$row->type = 3;
if(!$row->store()){
throw new Exception($row->getError());
}
self::activatePlan($item, $user->id);
$message = JText::_('COM_DJCLASSIFIEDS_SUBSCRIPTION_PLAN_ACTIVATED');
$redirect = DJClassifiedsSEO::getViewUri('userplans');
}else if($type=='points'){
$row->type = 1;
if(!$row->store()){
throw new Exception($row->getError());
}
self::activatePoints($item, $user->id);
$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PACKAGES_ADDED');
$redirect = DJClassifiedsSEO::getViewUri('userpoints');
}else if($type=='prom_top'){
$row->type = 2;
if(!$row->store()){
throw new Exception($row->getError());
}
self::activateMoveToTop($item->id);
$message = JText::_('COM_DJCLASSIFIEDS_PROMOTION_MOVE_TO_TOP_ACTIVATED');
$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_alias);
}else{
$row->type = 0;
if(!$row->store()){
throw new Exception($row->getError());
}
$pub = self::activateItem($item);
$message = JText::_('COM_DJCLASSIFIEDS_THANKS_FOR_PAYMENT');
if($pub != null){
if($pub){
$message = JText::_('COM_DJCLASSIFIEDS_THANKS_FOR_PAYMENT_ADVERT_PUBLISHED');
}else{
$message = JText::_('COM_DJCLASSIFIEDS_THANKS_FOR_PAYMENT_WAIT_FOR_CONFIRMATION');
}
}
$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_alias);
}
$app->enqueueMessage($message, 'success');
$app->redirect(JRoute::_($redirect, false));
}
public static function processPayment($id, $type, $method)
{
JTable::addIncludePath(JPATH_ROOT.'/administrator/components/com_djclassifieds/tables');
$db = JFactory::getDBO();
$app = JFactory::getApplication();
$par = JComponentHelper::getParams('com_djclassifieds');
$user = JFactory::getUser();
$row = JTable::getInstance('Payments', 'DJClassifiedsTable');
$djmodel = new DJClassifiedsModel();
JPluginHelper::importPlugin('djclassifiedspayment');
$app->triggerEvent('onInitProcessPayment', array(&$par, $id, $type, $method));
$pdata = array();
$row->date = JFactory::getDate()->toSQL();
$row->item_id = $id;
$row->user_id = $user->id;
$row->method = $method;
$row->status = 'Start';
$row->ip_address = $app->input->server->getStr('REMOTE_ADDR');
if($type == 'prom_top'){
$item = $djmodel->getItemById($id);
if(!$item){
DJCLassifiedsSEO::redirectWrongItem();
}
$move_top_price_arr = DJClassifiedsPayment::getMoveTopPriceArr($par);
$row->price = $move_top_price_arr['price'];
$row->type = 2;
$pdata['amount'] = $move_top_price_arr['price'];
$pdata['itemname'] = $item->name;
$plug_obj = $item;
}else if($type == 'points'){
$points = $djmodel->getPointsPackage($id);
if(!$points){
DJCLassifiedsSEO::redirectWrongItem(null, 'COM_DJCLASSIFIEDS_WRONG_POINTS_PACKAGE');
}
$row->price = $points->price;
$row->type = 1;
$pdata['amount'] = $points->price;
$pdata['itemname'] = $points->name;
$plug_obj = $points;
}else if($type == 'plan'){
$plan = $djmodel->getPlan($id);
if(!$plan){
DJCLassifiedsSEO::redirectWrongItem('index.php?option=com_djclassifieds&view=plans', 'COM_DJCLASSIFIEDS_WRONG_SUBSCRIPTION_PLAN');
}
$row->price = $plan->price;
$row->type = 3;
$pdata['amount'] = $plan->price;
$pdata['itemname'] = $plan->name;
if($plan->recurring){
$row->type_details = 'recurring_init';
$pdata['recurring_init'] = 1;
}
$plug_obj = $plan;
}else if($type == 'order'){
$order = $djmodel->getOrder($id);
$query = "SELECT * FROM #__djcf_orders_shipping WHERE order_id=".$id." LIMIT 1";
$db->setQuery($query);
$order_shipping = $db->loadObject();
$item = $djmodel->getItemById($order->item_id);
if(!$item){
DJCLassifiedsSEO::redirectWrongItem();
}
$price_total = $order->price * $order->quantity;
if($order_shipping){
$price_total += $order_shipping->price;
}
$row->price = $price_total;
$row->type = 4;
$pdata['amount'] = $price_total;
$pdata['itemname'] = $item->name;
$plug_obj = $order;
}else if($type == 'offer'){
$offer = $djmodel->getOffer($id);
$item = $djmodel->getItemById($offer->item_id);
if(!$item){
DJCLassifiedsSEO::redirectWrongItem();
}
$price_total = $offer->price;
$row->price = $price_total;
$row->type = 5;
$pdata['amount'] = $price_total;
$pdata['itemname'] = $item->name;
$plug_obj = $offer;
}elseif($type == ''){
$item = $djmodel->getItemById($id);
if(!$item){
DJCLassifiedsSEO::redirectWrongItem();
}
DJClassifiedsPayment::deletePrevStartPayment($item->id); // deleting previous "trash" payment
$price_det = self::getItemPriceDetails($item);
$amount = $price_det['price_total'];
$row->price = $amount;
$row->type = 0;
$row->type_details = $item->pay_type;
$pdata['amount'] = $amount;
$pdata['itemname'] = $item->name;
$plug_obj = $item;
}else{
$item = new stdClass();
$app->triggerEvent('onPrepareProcessOtherPayment', array (&$item, &$par, $type, &$row, &$pdata));
$plug_obj = $item;
}
$app->triggerEvent('onPrepareProcessPayment', array (&$plug_obj, &$par, $type, &$row, &$pdata));
if(!$row->store()){
throw new Exception($row->getError());
}
$pdata['item_id'] = $row->id;
$pdata['item_cid'] = ''; // backward compatibility
$app->triggerEvent('onAfterPrepareProcessPayment', array (&$plug_obj, &$par, $type, &$row, &$pdata));
return $pdata;
}
public static function completePayment($id, $price, $txn_id = '')
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$par = JComponentHelper::getParams('com_djclassifieds');
$djmodel = new DJClassifiedsModel();
$query = "SELECT * FROM #__djcf_payments WHERE id=".$id;
$db->setQuery($query);
$payment = $db->loadObject();
if($payment){
if(round($price, 2) != round($payment->price, 2)){
return false;
}
$query = "SELECT id FROM #__djcf_payments WHERE id=".$id." AND status='Completed'";
$db->setQuery($query);
$p_completed = $db->loadResult();
if($p_completed){
return false;
}
if($payment->type == '5'){ // offer
$query = "UPDATE #__djcf_offers SET paid=1 WHERE id=".$payment->item_id;
$db->setQuery($query);
$db->execute();
}else if($payment->type == '4'){ // buy now
$query = "SELECT * FROM #__djcf_orders WHERE id=".$payment->item_id;
$db->setQuery($query);
$order = $db->loadObject();
$query = "SELECT * FROM #__djcf_items WHERE id=".$order->item_id;
$db->setQuery($query);
$item = $db->loadObject();
self::reduceItemQuantity($item, $order->quantity);
$query = "UPDATE #__djcf_orders SET status=1 WHERE id=".$order->id;
$db->setQuery($query);
$db->execute();
$buyer = JFactory::getUser($order->user_id);
DJClassifiedsNotify::notifyBuynowBuyer($item->id,$buyer,$order->quantity);
DJClassifiedsNotify::notifyBuynowAuthor($item->id,$buyer,$order->quantity);
}else if($payment->type == '3'){ // subscription plans
$plan = $djmodel->getPlan($payment->item_id);
if($plan){
self::activatePlan($plan, $payment->user_id);
}
}else if($payment->type == '2'){ // move to top
self::activateMoveToTop($payment->item_id);
}else if($payment->type == '1'){ // points
$query = "SELECT * FROM #__djcf_points WHERE id=".$payment->item_id;
$db->setQuery($query);
$points = $db->loadObject();
self::activatePoints($points, $payment->user_id);
}elseif($payment->type == '0'){ // advert
$item = $djmodel->getItemById($payment->item_id);
$pub = self::activateItem($item);
if($pub != null){
if($pub){
if($par->get('notify_status_change','0') > 0){
DJClassifiedsNotify::notifyUserPublication($payment->item_id, '1');
}
}
}
}else{
$app->triggerEvent('onOtherPaymentCompletePayment', array($payment));
}
$query = "UPDATE #__djcf_payments SET status='Completed', transaction_id=".$db->q($txn_id)." WHERE id=".$payment->id;
$db->setQuery($query);
$db->execute();
$payment->status = 'Completed';
$app->triggerEvent('onAfterPaymentStatusChange', array($payment));
if($par->get('notify_payment_complete', '0')){
DJClassifiedsNotify::notifyUserPaymentCompleted($payment);
}
return true;
}
return false;
}
static function pointsPayment($id, $type, $points_count)
{
JTable::addIncludePath(JPATH_ROOT.'/administrator/components/com_djclassifieds/tables');
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
$par = JComponentHelper::getParams('com_djclassifieds');
$row = JTable::getInstance('Payments', 'DJClassifiedsTable');
$djmodel = new DJClassifiedsModel();
$row->date = JFactory::getDate()->toSQL();
$p_amount = 0;
$pay_success = false;
$item_name = '';
$desc_arr = array();
$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PAYMENT_CONFIRMED');
$redirect = DJClassifiedsPayment::getRedirectPage($type, $id);
if($type == 'plan'){
$plan = $djmodel->getPlan($id);
if(!$plan){
DJClassifiedsSEO::redirectWrongItem(null, 'COM_DJCLASSIFIEDS_WRONG_SUBSCRIPTION_PLAN');
}
$p_amount = $plan->points;
$app->triggerEvent('onDJClassifiedsPaymentPoints', array(&$plan, &$par, $type, &$points_count, &$p_amount));
if($points_count >= $p_amount){
self::activatePlan($plan, $user->id);
$item_name = $plan->name;
$desc_arr = array(
'COM_DJCLASSIFIEDS_PAYMENT_FOR_SUBSCRIPTION_PLAN' => '',
'COM_DJCLASSIFIEDS_PLAN' => $plan->name
);
$row->type = 3;
$message = JText::_('COM_DJCLASSIFIEDS_SUBSCRIPTION_PLAN_ACTIVATED');
$pay_success = true;
}
}else if($type == 'prom_top'){
$item = $djmodel->getItemById($id);
if(!$item){
DJClassifiedsSEO::redirectWrongItem();
}
$move_top_price_arr = DJClassifiedsPayment::getMoveTopPriceArr($par);
$p_amount = $move_top_price_arr['points'];
$app->triggerEvent('onDJClassifiedsPaymentPoints', array(&$item, &$par, $type, &$points_count, &$p_amount));
if($points_count >= $p_amount){
self::activateMoveToTop($item->id);
$item_name = $item->name;
$desc_arr = array(
'COM_DJCLASSIFIEDS_PAYMENT_FOR_PROMOTION_MOVE_TO_TOP' => '',
'COM_DJCLASSIFIEDS_ADVERT_ID' => $item->id,
'COM_DJCLASSIFIEDS_TITLE' => $item->name
);
$row->type = 2;
$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PAYMENT_CONFIRMED_PROMOTION_MOVE_TO_TOP_ACTIVATED');
$pay_success = true;
}
}elseif($type == ''){
$item = $djmodel->getItemById($id);
if(!$item){
DJClassifiedsSEO::redirectWrongItem();
}
$item_price_det = DJClassifiedsPayment::getItemPriceDetails($item);
$p_amount = $item_price_det['points_total'];
$app->triggerEvent('onDJClassifiedsPaymentPoints', array(&$item, &$par, $type, &$points_count, &$p_amount));
if($points_count >= $p_amount){
$pub = self::activateItem($item);
$item_name = $item->name;
$desc_arr = array(
'COM_DJCLASSIFIEDS_PAYMENT_FOR_ADVERT' => '',
'COM_DJCLASSIFIEDS_ADVERT_ID' => $item->id,
'COM_DJCLASSIFIEDS_TITLE' => $item->name
);
$row->type = 0;
$row->type_details = $item->pay_type;
$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PAYMENT_CONFIRMED');
if($pub != null){
if($pub){
$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PAYMENT_CONFIRMED_ADVERT_PUBLISHED');
}else{
$message = JText::_('COM_DJCLASSIFIEDS_POINTS_PAYMENT_CONFIRMED_ADVERT_WAITING_FOR_PUBLISH');
}
}
$pay_success = true;
}
}else{
// backward compatibility START
$row->item_id = $id;
$row->user_id = $user->id;
$row->method = 'points';
$row->status = 'Start';
$row->ip_address = $app->input->server->getStr('REMOTE_ADDR');
// backward compatibility END
$app->triggerEvent('onOtherPaymentPoints', array(&$row, $points_count, $type, $id, &$p_amount, &$pay_success, &$item_name, &$desc_arr, &$message, &$redirect));
}
if($pay_success){
$query = "INSERT INTO #__djcf_users_points (`user_id`,`points`,`description`,`desc_json`) "
."VALUES (".$user->id.", -".$p_amount.", '', ".$db->q(json_encode($desc_arr)).")";
$db->setQuery($query);
$db->execute();
$payment_info = array();
$payment_info['itemname'] = $item_name;
$payment_info['amount'] = $p_amount;
$payment_info['info'] = DJClassifiedsTheme::decodeDescJson(json_encode($desc_arr));
$payment_info['payment_id'] = 0;
DJClassifiedsNotify::notifyAdminPaymentPoints($type, $payment_info);
$row->item_id = $id;
$row->user_id = $user->id;
$row->method = 'points';
$row->status = 'Completed';
$row->ip_address = $_SERVER['REMOTE_ADDR'];
$row->price = $p_amount;
if(!$row->store()){
throw new Exception($row->getError());
}
if($par->get('notify_payment_complete', '0') == '2'){
DJClassifiedsNotify::notifyUserPaymentCompleted($row);
}
}else{
DJClassifiedsSEO::redirectWrongItem(null, 'COM_DJCLASSIFIEDS_NOT_ENOUGHT_POINTS', 'warning');
}
$app->triggerEvent('onAfterPaymentStatusChange', array($row));
return array(
'payment_row' => $row,
'payment_info' => $payment_info,
'message' => $message,
'redirect' => $redirect
);
}
static function isPayTypePromsOnly($pay_type)
{
$pay_type_arr = array_filter(explode(',', $pay_type));
JFactory::getApplication()->triggerEvent('onDJClassifiedsCheckIfPromsOnly', array(&$pay_type_arr));
$only_proms = true;
foreach($pay_type_arr as $pay_type){
if(substr($pay_type, 0, 2) != 'p_'){
$only_proms = false;
break;
}
}
return $only_proms;
}
static function activatePlan($plan, $user_id)
{
$db = JFactory::getDBO();
$djmodel = new DJClassifiedsModel();
$registry = new JRegistry();
$registry->loadString($plan->params);
$plan_params = $registry->toObject();
$date_start = JFactory::getDate();
$date_exp = $plan_params->days_limit ? JFactory::getDate('now +'.$plan_params->days_limit.'day') : null;
$user_active_plans = $djmodel->getUserActivePlans($user_id);
$same_plan_active = isset($user_active_plans[$plan->id]) ? $user_active_plans[$plan->id] : null;
if($same_plan_active){ // 0 adverts plan renew
$query = "UPDATE #__djcf_plans_subscr SET date_exp=".$db->q(JFactory::getDate()->toSQL()).", notify=1 WHERE id=".$same_plan_active->subscr_id;
$db->setQuery($query);
$db->execute();
if($date_exp){
$addup_interval = date_diff(JFactory::getDate(), JFactory::getDate($same_plan_active->date_exp));
$date_exp->add($addup_interval);
}
}
$query = "INSERT INTO #__djcf_plans_subscr (`user_id`,`plan_id`,`adverts_limit`,`adverts_available`,`date_start`,`date_exp`,`plan_params`,`recurring`) "
."VALUES ('".$user_id."','".$plan->id."','".$plan_params->ad_limit."','".($plan_params->ad_limit == '-1' ? '9999999' : $plan_params->ad_limit)."','".$date_start->toSQL()."','".($date_exp ? $date_exp->toSQL() : '0000-00-00 00:00:00')."','".addslashes($plan->params)."',".$plan->recurring.")";
$db->setQuery($query);
$db->execute();
if(!empty($plan->groups_assignment)){
foreach(explode(',', $plan->groups_assignment) as $ug){
JUserHelper::addUserToGroup($user_id, $ug);
}
}
if(!empty($plan->groups_deassignment)){
foreach(explode(',', $plan->groups_deassignment) as $ug){
JUserHelper::removeUserFromGroup($user_id, $ug);
}
}
}
static function activatePoints($points, $user_id)
{
$db = JFactory::getDBO();
$desc_arr = array(
'COM_DJCLASSIFIEDS_POINTS_PACKAGE' => $points->name
);
$query = "INSERT INTO #__djcf_users_points (`user_id`,`points`,`description`,`desc_json`) "
."VALUES (".$user_id.",".$points->points.",'',".$db->q(json_encode($desc_arr)).")";
$db->setQuery($query);
$db->execute();
}
static function activateItem($item)
{
$par = JComponentHelper::getParams('com_djclassifieds');
JTable::addIncludePath(JPATH_ROOT.'/administrator/components/com_djclassifieds/tables');
$row = JTable::getInstance('Items', 'DJClassifiedsTable');
$row->load($item->id);
if($row->new){ // recalc exp_date for "new" (added or renewed) items
if($row->new == 2){ // newly renewed
$wait_interval = date_diff(JFactory::getDate($row->date_renew), JFactory::getDate());
}else{ // newly added
$wait_interval = date_diff(JFactory::getDate($row->date_start), JFactory::getDate());
}
$new_date_exp = JFactory::getDate($row->date_exp)->add($wait_interval);
$row->date_exp = $new_date_exp->toSQL();
$new_date_sort = JFactory::getDate($row->date_sort)->add($wait_interval);
$row->date_sort = $new_date_sort->toSQL();
}
self::applyPromotions($row);
$pub = null;
if(!self::isPayTypePromsOnly($item->pay_type)){ // if NOT promotions only - set/change 'published' status
DJClassifiedsAccess::overrideUserAutopublish($par);
if($item->c_autopublish == '0'){
if($par->get('autopublish','1') == '1' || $par->get('autopublish','1') == '2'){ // ignore 'edit only' on payments
$pub = 1;
}else{
$pub = 0;
}
}elseif($item->c_autopublish == '1' || $item->c_autopublish == '3'){ // ignore 'edit only' on payments
$pub = 1;
}elseif($item->c_autopublish == '2'){
$pub = 0;
}
$row->published = $pub;
}
$row->extra_images += $row->extra_images_to_pay; // increasing the number of paid images
$row->extra_chars += $row->extra_chars_to_pay; // increasing the number of paid chars
$row->pay_type = '';
$row->extra_images_to_pay = 0;
$row->extra_chars_to_pay = 0;
$row->new = 0;
if(!$row->store()){
throw new Exception($row->getError());
}
return $pub;
}
static function activateMoveToTop($item_id)
{
$db = JFactory::getDBO();
$date_sort = JFactory::getDate()->toSQL();
$query = "UPDATE #__djcf_items SET date_sort=".$db->q($date_sort)." WHERE id=".$item_id;
$db->setQuery($query);
$db->execute();
}
static function reduceItemQuantity($item, $quantity)
{
$db = JFactory::getDBO();
$new_quantity = $item->quantity - $quantity;
$query = "UPDATE #__djcf_items SET quantity=".$new_quantity." WHERE id=".$item->id;
$db->setQuery($query);
$db->execute();
if($new_quantity <= 0){
$query = "UPDATE #__djcf_items SET published=0 WHERE id=".$item->id;
$db->setQuery($query);
$db->execute();
$query = "UPDATE #__djcf_auctions SET closed=".$db->q(JFactory::getDate()->toSQL())." WHERE item_id=".$item->id." AND closed IS NULL";
$db->setQuery($query);
$db->execute();
}
}
static function deletePrevStartPayment($item_id, $type = '0')
{
$db = JFactory::getDBO();
$query = "SELECT * FROM #__djcf_payments WHERE status='Start' AND type=".$db->q($type)." AND item_id=".$item_id." ORDER BY id DESC LIMIT 1";
$db->setQuery($query);
$prev_payment = $db->loadObject();
if($prev_payment){
$query = "DELETE FROM #__djcf_payments WHERE id=".$prev_payment->id;
$db->setQuery($query);
$db->execute();
}
}
public static function applyPromotions($row)
{
$db = JFactory::getDBO();
$item_id = $row->id;
$query = "SELECT * FROM #__djcf_items_promotions WHERE item_id = ".$item_id." ORDER BY id";
$db->setQuery($query);
$old_promotions = $db->loadObjectList('prom_id');
$query = "SELECT * FROM #__djcf_items WHERE id = ".$item_id." LIMIT 1";
$db->setQuery($query);
$item = $db->loadObject();
$query = "SELECT * FROM #__djcf_promotions";
$db->setQuery($query);
$promotions = $db->loadObjectList('id');
if($item->pay_type){
$ins_arr = array();
$pay_type = explode(',', $item->pay_type);
foreach($pay_type as $pay_t){
if(strstr($pay_t, 'p_')){
$pay_prom = explode('_', $pay_t);
$prom_id = $pay_prom[2];
$prom_days = $pay_prom[3];
if($prom_id){
$prom_exp_date = JFactory::getDate('now + '.$pay_prom[3].' day');
if(isset($old_promotions[$prom_id])){
if($old_promotions[$prom_id]->date_exp >= JFactory::getDate()->toSQL()){
$time_left = date_diff(JFactory::getDate(), JFactory::getDate($old_promotions[$prom_id]->date_exp));
$prom_exp_date->add($time_left);
}
$query_del = "DELETE FROM #__djcf_items_promotions WHERE item_id=".$item->id." AND prom_id=".$prom_id;
$db->setQuery($query_del);
$db->execute();
}
$ins_arr[] = "(".$item->id.",".$prom_id.",'".JFactory::getDate()->toSQL()."','".$prom_exp_date->toSQL()."',".$prom_days.")";
}
}
}
if($ins_arr){
$query = "INSERT INTO #__djcf_items_promotions(`item_id`,`prom_id`,`date_start`,`date_exp`,`days`) VALUES "
.implode(', ', $ins_arr);
$db->setQuery($query);
$db->execute();
}
}
$date_now = JFactory::getDate()->toSQL();
$query = "SELECT * FROM #__djcf_items_promotions WHERE item_id = ".$item_id." AND date_exp>'".$date_now."' ORDER BY id";
$db->setQuery($query);
$new_promotions = $db->loadObjectList('prom_id');
$new_prom = '';
foreach($new_promotions as $prom){
$new_prom .= $promotions[$prom->prom_id]->name.',';
}
$row->promotions = $new_prom;
$row->special = strstr($new_prom, 'p_first') ? 1 : 0;
if(!$row->store()){
throw new Exception($row->getError());
}
return $new_promotions;
}
public static function updatePromotions()
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$date_now = JFactory::getDate()->toSQL();
$query = "SELECT item_id FROM #__djcf_items_promotions WHERE date_exp <= '".$date_now."' AND updated=0 GROUP BY item_id ";
$db->setQuery($query);
$items_ex = $db->loadObjectList();
if($items_ex){
$id_list = '';
$items_list = array();
foreach($items_ex as $item){
if($id_list){
$id_list .= ','.$item->item_id;
}else{
$id_list .= $item->item_id;
}
$items_list[$item->item_id] = '';
}
$query = "SELECT * FROM #__djcf_items_promotions WHERE date_exp > '".$date_now."' AND item_id IN (".$id_list.") ";
$db->setQuery($query);
$items_proms = $db->loadObjectList();
$query = "SELECT * FROM #__djcf_promotions ";
$db->setQuery($query);
$promotions = $db->loadObjectList('id');
foreach($items_proms as $item_prom){
$items_list[$item_prom->item_id] .= $promotions[$item_prom->prom_id]->name.',';
}
foreach($items_ex as $item){
$i_prom = $items_list[$item->item_id];
if(strstr($i_prom, 'p_first')){ $special = 1;
}else{ $special = 0;}
$query = "UPDATE #__djcf_items SET promotions = '".$i_prom."' , special = '".$special."' WHERE id = '".$item->item_id."' ";
$db->setQuery($query);
$db->execute();
}
$query = "UPDATE #__djcf_items_promotions SET updated=1 WHERE date_exp <= '".$date_now."' AND updated=0 ";
$db->setQuery($query);
$db->execute();
}
}
// re-apply active promotions to items
public static function updatePromotionsFix()
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$date_now = JFactory::getDate()->toSQL();
$query = "SELECT * FROM #__djcf_items_promotions WHERE date_exp > '".$date_now."' AND updated=0 GROUP BY item_id ";
$db->setQuery($query);
$items_tofix = $db->loadObjectList();
if(count($items_tofix)){
$id_list= '';
$items_list = array();
foreach($items_tofix as $item){
if($id_list){
$id_list .= ','.$item->item_id;
}else{
$id_list .= $item->item_id;
}
$items_list[$item->item_id] = '';
}
$query = "SELECT * FROM #__djcf_items_promotions WHERE date_exp > '".$date_now."' AND item_id IN (".$id_list.") ";
$db->setQuery($query);
$items_proms = $db->loadObjectList();
$query = "SELECT * FROM #__djcf_promotions ";
$db->setQuery($query);
$promotions = $db->loadObjectList('id');
foreach($items_proms as $item_prom){
$items_list[$item_prom->item_id] .= $promotions[$item_prom->prom_id]->name.',';
}
foreach($items_tofix as $item){
$i_prom = $items_list[$item->item_id];
if(strstr($i_prom, 'p_first')){ $special = 1;
}else{ $special = 0;}
$query = "UPDATE #__djcf_items SET promotions = '".$i_prom."' , special = '".$special."' WHERE id = '".$item->item_id."' ";
$db->setQuery($query);
$db->execute();
}
}
}
public static function checkApplyPromotions(&$row, $old_row, $promotions, $par)
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$prom_to_pay = '';
$query = "SELECT * FROM #__djcf_items_promotions WHERE item_id=".$row->id." ORDER BY id";
$db->setQuery($query);
$old_promotions = $db->loadObjectList('prom_id');
foreach($promotions as $prom){
$ins_prom = 0;
$time_left = null;
$days_left_default = 0;
if(isset($old_promotions[$prom->id])){
if($old_promotions[$prom->id]->date_exp >= JFactory::getDate()->toSQL()){
$old_prom_to_pay = $prom->name.'_'.$prom->id.'_'.$old_promotions[$prom->id]->days.',';
if($old_row && strstr($old_row->pay_type, $old_prom_to_pay)){
$time_left = null;
}else if($old_promotions[$prom->id]->date_exp > JFactory::getDate()->toSQL()){
$time_left = date_diff(JFactory::getDate(), JFactory::getDate($old_promotions[$prom->id]->date_exp));
$days_left_default = $old_promotions[$prom->id]->days;
}
}
}
if(!empty($time_left)){
$row->promotions .= $prom->name.',';
}
$prom_v = $app->input->getInt($prom->name, 0);
if($prom_v){
if(isset($prom->prices[$prom_v])){
$pp = $prom->prices[$prom_v];
if(!DJClassifiedsPayment::isFree($pp->price, $pp->points, $par)){
$new_prom = $prom->name.'_'.$prom->id.'_'.$pp->days.',';
if(!strstr($row->pay_type, $new_prom)){
$prom_to_pay .= $new_prom;
}
if($time_left){
$prom_exp_date = JFactory::getDate()->add($time_left)->toSQL();
$ins_prom++;
}
}else{
if($time_left){
$prom_exp_date = JFactory::getDate()->add($time_left)->toSQL();
}else{
$row->promotions .= $prom->name.',';
$prom_exp_date = JFactory::getDate('now + '.$pp->days.' day')->toSQL();
$days_left_default = $pp->days;
}
$ins_prom++;
}
}else if($time_left){
$prom_exp_date = JFactory::getDate()->add($time_left)->toSQL();
$ins_prom++;
}
}else{
if($time_left){
$prom_exp_date = JFactory::getDate()->add($time_left)->toSQL();
$ins_prom++;
}
}
if($ins_prom){
$query_del = "DELETE FROM #__djcf_items_promotions WHERE item_id=".$row->id." AND prom_id=".$prom->id." AND date_exp>".$db->q(JFactory::getDate()->toSQL());
$db->setQuery($query_del);
$db->execute();
$prom_query = "INSERT INTO #__djcf_items_promotions(`item_id`,`prom_id`,`date_start`,`date_exp`,`days`) VALUES "
."(".$row->id.",".$prom->id.",".$db->q(JFactory::getDate()->toSQL()).",".$db->q($prom_exp_date).",".$days_left_default.")";
$db->setQuery($prom_query);
$db->execute();
}
}
$row->special = strstr($row->promotions, 'p_first') ? 1 : 0;
$row->pay_type .= $prom_to_pay;
}
public static function getAfterPaymentRedirectUrl($payment_id, $context)
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$menus = $app->getMenu('site');
$djmodel = new DJClassifiedsModel();
$query = "SELECT * FROM #__djcf_payments WHERE id=".$payment_id;
$db->setQuery($query);
$payment = $db->loadObject();
if($payment->type == '0' || $payment->type == '1'){
$item = $djmodel->getItemById($payment->item_id);
$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_alias);
}elseif($payment->type == '2'){
$menu_userpoints_itemid = $menus->getItems('link', 'index.php?option=com_djclassifieds&view=userpoints', 1);
$userpoints_link='index.php?option=com_djclassifieds&view=userpoints';
if($menu_userpoints_itemid){
$userpoints_link .= '&Itemid='.$menu_userpoints_itemid->id;
}
$redirect = $userpoints_link;
}elseif($payment->type == '3'){
$userplans_link = 'index.php?option=com_djclassifieds&view=userplans';
$menu_userplans_itemid = $menus->getItems('link', $userplans_link, 1);
if($menu_userplans_itemid){
$userplans_link .= '&Itemid='.$menu_userplans_itemid->id;
}
$redirect = $userplans_link;
}else{
$redirect = DJClassifiedsSEO::getCategoryRoute('0:all');
}
$redirect = JRoute::_($redirect, false);
return $redirect;
}
static function changePaymentReturnStatus($payment_id, $new_status)
{
if(!$payment_id){
return;
}
$db = JFactory::getDBO();
$query = "SELECT status FROM #__djcf_payments WHERE id=".$payment_id;
$db->setQuery($query);
$old_status = $db->loadResult();
if($old_status == 'Start'){
$query = "UPDATE #__djcf_payments SET status=".$db->q($new_status)." WHERE id=".$payment_id;
$db->setQuery($query);
$db->execute();
}
}
static function getAdvertPaymentTypeDetails($type_details)
{
$a_pay_types = array(
'cat' => JText::_('COM_DJCLASSIFIEDS_CATEGORY'),
'mc' => JText::_('COM_DJCLASSIFIEDS_MULTICATEGORIES'),
'type' => JText::_('COM_DJCLASSIFIEDS_TYPE'),
'duration_renew' => JText::_('COM_DJCLASSIFIEDS_DURATION_RENEW'),
'duration' => JText::_('COM_DJCLASSIFIEDS_DURATION'),
'extra_img' => JText::_('COM_DJCLASSIFIEDS_EXTRA_IMAGES'),
'extra_chars' => JText::_('COM_DJCLASSIFIEDS_EXTRA_CHARS'),
'p_first' => JText::_('COM_DJCLASSIFIEDS_PROMOTION_FIRST'),
'p_bold' => JText::_('COM_DJCLASSIFIEDS_PROMOTION_BOLD'),
'p_border' => JText::_('COM_DJCLASSIFIEDS_PROMOTION_BORDER'),
'p_bg' => JText::_('COM_DJCLASSIFIEDS_PROMOTION_BG'),
'p_special' => JText::_('COM_DJCLASSIFIEDS_PROMOTION_SPECIAL')
);
JFactory::getApplication()->triggerEvent('onDJClassifiedsGetAdvertPaymentTypeDetails', array(&$a_pay_types));
$type_det = array_filter(explode(',', $type_details));
$output_arr = array();
foreach($type_det as $pay_type){
foreach($a_pay_types as $a_type => $a_type_label){
if(strpos($pay_type, $a_type) !== false){
$output_arr[$a_type] = $a_type_label;
break;
}
}
}
return $output_arr;
}
static function getItemPriceDetails($item)
{
$db = JFactory::getDBO();
$par = JComponentHelper::getParams('com_djclassifieds');
$djmodel = new DJClassifiedsModel();
$price_det = array();
$points_det = array();
if($par->get('durations_list','1')){
$duration = $djmodel->getDuration($item->exp_days, $item->cat_id, $item->user_id);
if($duration){
if(strstr($item->pay_type, 'duration_renew')){
$price_det['duration_renew'] = $duration->price_renew;
$points_det['duration_renew'] = $duration->points_renew;
}else if(strstr($item->pay_type, 'duration')){
$price_det['duration'] = $duration->price;
$points_det['duration'] = $duration->points;
}
}
}
$promotions = $djmodel->getPromotionsPrices();
foreach($promotions as $prom){
$pay_type_a = explode(',', $item->pay_type);
foreach($pay_type_a as $pay_type_e){
if(strstr($pay_type_e, $prom->name)){
$pay_type_ep = explode('_', $pay_type_e);
if(isset($prom->prices[$pay_type_ep[3]])){
$price_det[$pay_type_e] = $prom->prices[$pay_type_ep[3]]->price;
$points_det[$pay_type_e] = $prom->prices[$pay_type_ep[3]]->points;
}
}
}
}
$query = "SELECT * FROM #__djcf_categories WHERE published=1";
$db->setQuery($query);
$categories = $db->loadObjectList('id');
if(strstr($item->pay_type, 'cat')){
$price_det['cat'] = $categories[$item->cat_id]->price / 100;
$points_det['cat'] = $categories[$item->cat_id]->points;
}
if(strstr($item->pay_type, 'mc')){
$pay_elems = explode(',', $item->pay_type);
foreach($pay_elems as $pay_el){
if(strstr($pay_el, 'mc')){
$mc_id = str_ireplace('mc', '', $pay_el);
$mcat = $categories[$mc_id];
$price_det[$pay_el] = $mcat->price / 100;
$points_det[$pay_el] = $mcat->points;
}
}
}
if(strstr($item->pay_type, 'type')){
$itype = DJClassifiedsPayment::getTypePrice($item->user_id, $item->type_id);
$price_det['type'] = $itype->price;
$points_det['type'] = $itype->points;
}
if(strstr($item->pay_type, 'extra_img')){
$extraimg = $item->extra_images_to_pay;
if(strstr($item->pay_type, 'extra_img_renew')){
$img_price = $par->get('img_price_renew','0');
$img_points = $par->get('img_price_renew_points','0');
if(isset($duration->img_price_default)){
if($duration->img_price_default==0){
$img_price = $duration->img_price_renew;
$img_points = $duration->img_points_renew;
}
}
$price_det['extra_img_renew'] = $img_price*$extraimg;
$points_det['extra_img_renew'] = $img_points*$extraimg;
}else{
$img_price = $par->get('img_price','0');
$img_points = $par->get('img_price_points','0');
if(isset($duration->img_price_default)){
if($duration->img_price_default==0){
$img_price = $duration->img_price;
$img_points = $duration->img_points;
}
}
$price_det['extra_img'] = $img_price*$extraimg;
$points_det['extra_img'] = $img_points*$extraimg;
}
}
if(strstr($item->pay_type, 'extra_chars')){
$extrachar = $item->extra_chars_to_pay;
if(strstr($item->pay_type, 'extra_chars_renew')){
$char_price = $par->get('desc_char_price_renew','0');
$char_points = $par->get('desc_char_price_renew_points','0');
if(isset($duration->char_price_default)){
if($duration->char_price_default==0){
$char_price = $duration->char_price_renew;
$char_points = $duration->char_points_renew;
}
}
$price_det['extra_chars_renew'] = $char_price*$extrachar;
$points_det['extra_chars_renew'] = $char_points*$extrachar;
}else{
$char_price = $par->get('desc_char_price','0');
$char_points = $par->get('desc_char_price_points','0');
if(isset($duration->char_price_default)){
if($duration->char_price_default==0){
$char_price = $duration->char_price;
$char_points = $duration->char_points;
}
}
$price_det['extra_chars'] = $char_price*$extrachar;
$points_det['extra_chars'] = $char_points*$extrachar;
}
}
$price_total = 0;
foreach($price_det as $price){
$price_total += $price;
}
$points_total = 0;
foreach($points_det as $points){
$points_total += $points;
}
return array(
'price_det' => $price_det,
'price_total' => $price_total,
'points_det' => $points_det,
'points_total' => $points_total
);
}
static function getMoveTopPriceArr($par = null)
{
$user = JFactory::getUser();
$par = $par ? $par : JComponentHelper::getParams('com_djclassifieds');
$price = $par->get('promotion_move_top_price','0');
$points = $par->get('promotion_move_top_points','0');
$ug_prices = $par->get('promotion_move_top_ug_prices', array());
if($ug_prices){
$ug_arr = DJClassifiedsAccess::getUserGroups($user->id);
foreach($ug_prices as $ug_price){
foreach($ug_price->ug as $ug){
if(in_array($ug, $ug_arr)){
$price = $ug_price->price;
$points = $ug_price->points;
}
}
}
}
return array(
'price' => $price,
'points' => $points
);
}
static function getRidOfTheLegacyPlugin($pluginname)
{
$plugins_dir = JPATH_ROOT.'/plugins/djclassifiedspayment';
if(JFolder::exists($plugins_dir)){
try {
$dir = opendir($plugins_dir);
if(!empty($dir) && get_resource_type($dir) == 'stream'){
while(($plugin = readdir($dir)) !== false){
if($plugin === $pluginname){
JFolder::delete($plugins_dir.'/'.$plugin);
break;
}
}
closedir($dir);
}
} catch (Exception $e) {
return false;
}
}
}
static function getFreeWhere($free = true)
{
$par = JComponentHelper::getParams('com_djclassifieds');
$where_arr = array();
if($par->get('points','0') != '2'){
$where_arr[] = 'price > 0';
}
if($par->get('points','0')){
$where_arr[] = 'points > 0';
}
return ($free ? '!' : '').'('.implode(' OR ', $where_arr).')';
}
static function isFree($price, $points, $par)
{
return (($par->get('points','0') != '2' && $price > 0) || ($par->get('points','0') && $points > 0)) ? false : true;
}
static function getPriceText($price, $points, $par)
{
$prices = array();
if($par->get('points','0') != '2' && $price > 0){
$prices[] = DJClassifiedsTheme::priceFormat($price, $par->get('unit_price','EUR'));
}
if($par->get('points','0') && $points > 0){
$prices[] = $points.' '.JText::_(($points == '1' && JText::_('COM_DJCLASSIFIEDS_POINT_SHORT') != 'COM_DJCLASSIFIEDS_POINT_SHORT') ? 'COM_DJCLASSIFIEDS_POINT_SHORT' : 'COM_DJCLASSIFIEDS_POINTS_SHORT');
}
if($prices){
return implode(JText::_($par->get('point_price_separator', ' - ')), $prices);
}
}
static function getRedirectPage($type, $item_id, $success = true)
{
$djmodel = new DJClassifiedsModel();
$par = JComponentHelper::getParams('com_djclassifieds');
$redirect = DJClassifiedsSEO::getCategoryRoute('0:all');
if(is_numeric($type) && isset(self::$_payment_types[$type])){
$type = self::$_payment_types[$type];
}
$use_default = false;
$redirect_map = $par->get('payment_redirect_map', array());
foreach($redirect_map as $r){
if($r->payment_redirect_type == ($success ? 'ok' : 'cancel') && $r->payment_type == $type){
if($r->payment_redirect){
return 'index.php?Itemid='.$r->payment_redirect;
}else{
$use_default = true;
break;
}
}
}
if($success){
if($par->get('payment_ok_redirect') && !$use_default){
$redirect = 'index.php?Itemid='.$par->get('payment_ok_redirect');
}else{
if($type == 'plan'){
$redirect = DJClassifiedsSEO::getViewUri('userplans');
}elseif($type == 'points'){
$redirect = DJClassifiedsSEO::getViewUri('userpoints');
}elseif($type == '' || $type == 'prom_top'){
$item = $djmodel->getItemById($item_id);
$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_name);
}elseif($type == 'order'){
$redirect = DJClassifiedsSEO::getViewUri('ordershistory');
}elseif($type == 'offer'){
$redirect = DJClassifiedsSEO::getViewUri('userofferssub');
}
}
}else{
if($par->get('payment_cancel_redirect') && !$use_default){
$redirect = 'index.php?Itemid='.$par->get('payment_cancel_redirect');
}else{
if($type == 'plan'){
$redirect = DJClassifiedsSEO::getViewUri('plans');
}elseif($type == 'points'){
$redirect = DJClassifiedsSEO::getViewUri('points');
}elseif($type == '' || $type == 'prom_top'){
$item = $djmodel->getItemById($item_id);
$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_name);
}elseif($type == 'order'){
$order = $djmodel->getOrder($item_id);
$item = $djmodel->getItemById($order->item_id);
$redirect = DJClassifiedsSEO::getItemRoute($item->id.':'.$item->alias, $item->cat_id.':'.$item->c_alias, $item->region_id.':'.$item->r_name);
}elseif($type == 'offer'){
$redirect = DJClassifiedsSEO::getViewUri('userofferssub');
}
}
}
return $redirect;
}
}