* @package AgileBill * @version 1.4.93 */ class affiliate_commission { # Open the constructor for this mod function affiliate_commission() { # name of this module: $this->module = "affiliate_commission"; # location of the construct XML file: $this->xml_construct = PATH_MODULES . "" . $this->module . "/" . $this->module . "_construct.xml"; # open the construct file for parsing $C_xml = new CORE_xml; $construct = $C_xml->xml_to_array($this->xml_construct); $this->method = $construct["construct"]["method"]; $this->trigger = $construct["construct"]["trigger"]; $this->field = $construct["construct"]["field"]; $this->table = $construct["construct"]["table"]; $this->module = $construct["construct"]["module"]; $this->cache = $construct["construct"]["cache"]; $this->order_by = $construct["construct"]["order_by"]; $this->limit = $construct["construct"]["limit"]; } ############################## ## ADD ## ############################## function add($VAR) { $search_limit = 50; global $C_debug, $C_translate; include_once(PATH_CORE . 'validate.inc.php'); $validate = new CORE_validate; $this->start_date = false; if(!empty($VAR['affiliate_commission_start_date'])) $this->start_date = $validate->convert('', $VAR['affiliate_commission_start_date'], 'date'); $this->end_date=false; if(!empty($VAR['affiliate_commission_end_date'])) $this->end_date = $validate->convert('', $VAR['affiliate_commission_end_date'], 'date'); # determine the offset & limit if(!empty($VAR['page'])) { $current_page = $VAR['page']; } else { $current_page = '1'; } # determine the offset & limit $offset=-1; if($current_page == 1) { $offset = 0; } else { $offset = (($current_page * $search_limit) - $search_limit); } $db = &DB(); if($current_page == 1) $this->GenID = $db->GenID(AGILE_DB_PREFIX . 'affiliate_commission_id'); else $this->GenID = @$VAR['GenID']; # Generate the SQL for this commission generation session: $sql = "SELECT id,affiliate_id,total_amt,tax_amt,type FROM ".AGILE_DB_PREFIX."invoice WHERE site_id = ".$db->qstr(DEFAULT_SITE)." AND process_status = 1 AND billing_status = 1 AND ( affiliate_id IS NOT NULL AND affiliate_id !='' ) AND total_amt > 0 "; if($this->start_date) $sql .= " AND date_orig >= ".$db->qstr($this->start_date); if($this->end_date) $sql .= " AND date_orig <= ".$db->qstr($this->end_date); $result = $db->SelectLimit($sql, $search_limit, $offset); #echo $sql; #echo "

"; #print_r($result->fields); #exit; # No more results - print link to export data: if($result->RecordCount() == 0 && $current_page > 1) { $msg = $C_translate->translate('generated','affiliate_commission',''); $msg .= '    '.$C_translate->translate('submit','','').''; $msg .= ''; $C_debug->alert($msg); return; } # Loop through the results: $count = 0; while (!$result->EOF) { $do = true; $level = 1; unset($affiliate_arr); $affiliate_id = $result->fields["affiliate_id"]; # check if the commissions for this invoice have already been issued... $sql = "SELECT id FROM ".AGILE_DB_PREFIX."invoice_commission WHERE site_id = ".$db->qstr(DEFAULT_SITE)." AND invoice_id = ".$db->qstr($result->fields["id"]); $result2 = $db->Execute($sql); if ($result2->RecordCount() == 0) { # loop through all affiliate levels to generate the commissions... while ( $level < 100 && @$affiliate_id) { for($i=0; $ifields["id"]} GROUP BY invoice_id"; $rsi=$db->Execute($sqli); if($rsi && $rsi->RecordCount()) { $invoice_amount = $rsi->fields["invoice_amount"]; $arr = $this->calc_commission($affiliate_id, $invoice_amount, $result->fields["type"], $level); if (@$arr["amount"] > 0) $this->add_invoice_commission($arr['amount'], $affiliate_id, $result->fields["id"]); unset($affiliate_id); if (isset($arr["affiliate_id"])) $affiliate_id = $arr['affiliate_id']; $count++; } } $level++; } } # add this invoice to the processed list... $result->MoveNext(); } # Create the affiliate_commission record: if($count == 0) { $msg = $C_translate->translate('no_results','affiliate_commission',''); $C_debug->alert($msg); } else { $start = ($search_limit * $current_page) - $search_limit; $stop = ($search_limit * $current_page); $page = $current_page + 1; $C_translate->value['affiliate_commission']['start'] = $start; $C_translate->value['affiliate_commission']['stop'] = $stop; $C_translate->value['affiliate_commission']['genid'] = $this->GenID; $C_translate->value['affiliate_commission']['page'] = $page; $C_translate->value['affiliate_commission']['unixtime_start_date'] = $this->start_date; $C_translate->value['affiliate_commission']['unixtime_stop_date'] = $this->end_date; $msg = $C_translate->translate('continue','affiliate_commission',''); $url = '?_page=core:blank&do[]=affiliate_commission:add&GenID='.$this->GenID. '&page='.$page. '&affiliate_commission_start_date='.@$VAR['affiliate_commission_start_date']. '&affiliate_commission_start_date='.@$VAR['affiliate_commission_start_date']; $msg .= '    '.$C_translate->translate('submit','','').''; $msg .= ''; $C_debug->alert($msg); } } ############################## ## CALCULATE COMMISSIONS ## ############################## function calc_commission( $affiliate_id, $amount, $type, $level ) { $db = &DB(); $sql = "SELECT * FROM ".AGILE_DB_PREFIX."affiliate WHERE site_id = ".$db->qstr(DEFAULT_SITE)." AND id = ".$db->qstr($affiliate_id); $result = $db->Execute($sql); if ($result->RecordCount() == 0) return false; # can affiliate recieve commissions from this level? if($result->fields['max_tiers'] >= $level) { ## Order Type: 0 = new, 1 = recurring charge if($type == 0) { $rate = unserialize($result->fields['new_commission_rate']); $calc = $result->fields['new_commission_type']; } else { $rate = unserialize($result->fields['recurr_commission_rate']); $calc = $result->fields['recurr_commission_type']; } $i = $level - 1; $amount2 = $rate[$i] * $amount; $ret['amount'] = $amount2; } else { $ret['amount'] = false; } # get the parent affiliate id, if any: if ( $result->fields['parent_affiliate_id'] != $affiliate_id) $ret['affiliate_id'] = $result->fields['parent_affiliate_id']; return $ret; } ############################## ## INCREMENT COMMISSION ## ############################## function add_invoice_commission( $amount, $affiliate_id, $invoice_id ) { $db = &DB(); $id = $db->GenID(AGILE_DB_PREFIX . 'invoice_commission_id'); $sql = "INSERT INTO ".AGILE_DB_PREFIX."invoice_commission SET id = ".$db->qstr($id).", site_id = ".$db->qstr(DEFAULT_SITE).", date_orig = ".$db->qstr(time()).", date_last = ".$db->qstr(time()).", affiliate_commission_id = ".$db->qstr($this->GenID).", invoice_id = ".$db->qstr($invoice_id).", affiliate_id = ".$db->qstr($affiliate_id).", commission = ".$db->qstr($amount).", status = ".$db->qstr("0"); $result = $db->Execute($sql); ### Increment the affiliate_commission totals: $sql = "SELECT commissions FROM ".AGILE_DB_PREFIX."affiliate_commission WHERE id = ".$db->qstr($this->GenID)." AND site_id = ".$db->qstr(DEFAULT_SITE); $result = $db->Execute($sql); if($result->RecordCount() > 0) { ### Update the affiliate_commission total: if( $result->fields['commissions'] > 0 ) $current = $result->fields['commissions'] + $amount; else $current = $amount; $sql = "UPDATE ".AGILE_DB_PREFIX."affiliate_commission SET commissions = ".$db->qstr($current)." WHERE id = ".$db->qstr($this->GenID)." AND site_id = ".$db->qstr(DEFAULT_SITE); $result = $db->Execute($sql); } else { ### Create new affiliate_commission record $sql = "INSERT INTO ".AGILE_DB_PREFIX."affiliate_commission SET id = ".$db->qstr($this->GenID).", site_id = ".$db->qstr(DEFAULT_SITE).", date_orig = ".$db->qstr(time()).", date_begin = ".$db->qstr($this->start_date).", date_end = ".$db->qstr($this->end_date).", commissions = ".$db->qstr($amount); $result = $db->Execute($sql); } } ############################## ## GET ARRAY OF AFFILIATES ## ############################## function plugin_affiliate_list($plugin_name, $affiliate_commission_id) { # Get each affiliate in this commission: $db = &DB(); $sql = "SELECT DISTINCT affiliate_id FROM ".AGILE_DB_PREFIX."invoice_commission WHERE affiliate_commission_id = ".$db->qstr($affiliate_commission_id)." AND site_id = ".$db->qstr(DEFAULT_SITE); $result = $db->Execute($sql); if ($result->RecordCount() == 0) return false; while(!$result->EOF) { # check if the affiliate is using plugin_name specified: $sql = "SELECT id FROM ".AGILE_DB_PREFIX."affiliate WHERE id = ".$db->qstr($result->fields['affiliate_id'])." AND affiliate_plugin = ".$db->qstr($plugin_name)." AND site_id = ".$db->qstr(DEFAULT_SITE); $result2 = $db->Execute($sql); if ($result2->RecordCount() >= 1) { $arr[] = $result->fields['affiliate_id']; } $result->MoveNext(); } if(count(@$arr) > 0) return $arr; else return false; } ############################## ## VIEW ## ############################## function view($VAR) { $type = "view"; $this->method["$type"] = explode(",", $this->method["$type"]); $db = new CORE_database; $db->view($VAR, $this, $type); ################################################# # Get the data for each affiliate plugin: global $C_translate, $smarty; $id = @$VAR['id']; $path = PATH_PLUGINS . '/affiliate/'; $pre = ''; $ext = '.php'; $count = 0; chdir($path); $dir = opendir($path); while ($file_name = readdir($dir)) { $display = true; if($file_name != '..' && $file_name != '.') { if(!empty($ext)) { $cute = eregi_replace($ext.'$', "", $file_name); if(!eregi($ext.'$', $file_name)) $display = false; } if(!empty($pre)) { $cute = eregi_replace('^'.$pre, "", $cute); if(!eregi('^'.$pre, $file_name)) $display = false; } if($display) { $name = $cute; if($arr_count = $this->plugin_affiliate_list($cute, $id)) $count = count($arr_count); else $count = 0; $cute = eregi_replace("_"," ",$cute); $cute = eregi_replace("-"," ",$cute); $smart[] = Array ( 'name' => $cute, 'plugin' => $name, 'count' => $count); $count++; } } } $smarty->assign('plugindata', $smart); } ############################## ## RUN AFFILIATE PLUGIN ## ############################## function export($VAR) { # make sure the required vars are set: id, plugin, if(!isset($VAR['id']) || !isset($VAR['plugin'])) echo "Invalid parameters passed.."; # Load the plugin $file = $VAR['plugin']; include_once(PATH_PLUGINS . 'affiliate/'. $file.'.php'); eval ( '$_PLUGIN = new plgn_aff_'. strtoupper ( $file ) . ';' ); # Get each affiliate to be paid a commisson for this affiliate_commission ID $db = &DB(); $export=''; if($arr_count = $this->plugin_affiliate_list($VAR['plugin'], $VAR['id'])) { for($i=0; $iExecute($sql); # Run PLUGIN->commission to add the data to the return text if($result && $result->RecordCount() && $result->fields['commission'] > 0) $export .= $_PLUGIN->commission(round($result->fields['commission'],2), $arr_count[$i], $VAR['id']); } # Run the PLUGIN->header method to set any req. headers. $_PLUGIN->header(); # include detailed commission details? $detail = ''; if(is_callable($_PLUGIN->commission_detailed)) { $sql = "SELECT comm.affiliate_id, comm.invoice_id, comm.commission, invoice.date_orig, invoice.total_amt, account.first_name, account.last_name, affiliate.plugin_data from ".AGILE_DB_PREFIX."invoice_commission as comm join ".AGILE_DB_PREFIX."invoice as invoice on (invoice.id=comm.invoice_id) join ".AGILE_DB_PREFIX."account as account on (account.id=invoice.account_id) join ".AGILE_DB_PREFIX."affiliate as affiliate on (affiliate.id=comm.affiliate_id) WHERE comm.affiliate_commission_id = ".$db->qstr($VAR['id'])." AND comm.site_id = ".$db->qstr(DEFAULT_SITE)." order by comm.affiliate_id"; /* SELECT affiliate_id,sum(commission) as commission from ab_invoice_commission group by affiliate_id */ $result = $db->Execute($sql); # Run PLUGIN->commission to add the data to the return text if($result && $result->RecordCount()) $detail = $_PLUGIN->commission_detailed($result); } # Print the data echo $export . "\r\n\r\n". $detail; } else { echo 'An error occurred: no affiliates are associated with this plugin'; } } ############################## ## UPDATE ## ############################## function update($VAR) { $type = "update"; $this->method["$type"] = explode(",", $this->method["$type"]); $db = new CORE_database; $db->update($VAR, $this, $type); } ############################## ## DELETE ## ############################## function delete($VAR) { $this->associated_DELETE[] = Array ('table' => 'invoice_commission', 'field' => 'affiliate_commission_id'); $db = new CORE_database; $db->mass_delete($VAR, $this, ""); # Delete all associated discounts: if(isset($VAR['id'])) { $id = $VAR['id']; for($i=0; $iqstr($q)." AND site_id = ".$db->qstr(DEFAULT_SITE); $result = $db->Execute($sql); } } } else { $id = $VAR['delete_id']; $q = '%Affiliate Commission ID '. $id.'%'; $db = &DB(); $sql = "DELETE FROM ".AGILE_DB_PREFIX."discount WHERE notes LIKE ".$db->qstr($q)." AND site_id = ".$db->qstr(DEFAULT_SITE); $result = $db->Execute($sql); } } ############################## ## SEARCH FORM ## ############################## function search_form($VAR) { $type = "search"; $this->method["$type"] = explode(",", $this->method["$type"]); $db = new CORE_database; $db->search_form($VAR, $this, $type); } ############################## ## SEARCH ## ############################## function search($VAR) { $type = "search"; $this->method["$type"] = explode(",", $this->method["$type"]); $db = new CORE_database; $db->search($VAR, $this, $type); } ############################## ## SEARCH SHOW ## ############################## function search_show($VAR) { $type = "search"; $this->method["$type"] = explode(",", $this->method["$type"]); $db = new CORE_database; $db->search_show($VAR, $this, $type); } } ?>