<?php /** * AgileBill - Open Billing Software * * This body of work is free software; you can redistribute it and/or * modify it under the terms of the Open AgileBill License * License as published at http://www.agileco.com/agilebill/license1-4.txt * * For questions, help, comments, discussion, etc., please join the * Agileco community forums at http://forum.agileco.com/ * * @link http://www.agileco.com/ * @copyright 2004-2008 Agileco, LLC. * @license http://www.agileco.com/agilebill/license1-4.txt * @author Tony Landis <tony@agileco.com> * @package AgileBill * @version 1.4.93 */ class charge { var $xmlrpc=false; # Open the constructor for this mod function charge_construct() { # name of this module: $this->module = "charge"; # 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"]; } function sweep_daily() { $this->sweep('0'); } function sweep_weekly() { $this->sweep('1'); } function sweep_monthly() { $this->sweep('2'); } function sweep_quarterly() { $this->sweep('3'); } function sweep_semi_annually() { $this->sweep('4'); } function sweep_annually() { $this->sweep('5'); } ############################## ## API ## ############################## function sweep($type) { $this->charge_construct(); include_once(PATH_MODULES.'account_billing/account_billing.inc.php'); $account_billing = new account_billing; include_once(PATH_MODULES . 'tax/tax.inc.php'); $taxObj = new tax; include_once(PATH_MODULES . 'discount/discount.inc.php'); $db = &DB(); $sql = "SELECT DISTINCT ".AGILE_DB_PREFIX."charge.id, ".AGILE_DB_PREFIX."charge.account_id, ".AGILE_DB_PREFIX."charge.service_id, ".AGILE_DB_PREFIX."charge.amount, ".AGILE_DB_PREFIX."charge.taxable, ".AGILE_DB_PREFIX."charge.attributes, ".AGILE_DB_PREFIX."charge.quantity, ".AGILE_DB_PREFIX."charge.product_id, ".AGILE_DB_PREFIX."charge.description, ".AGILE_DB_PREFIX."account.affiliate_id, ".AGILE_DB_PREFIX."account.reseller_id, ".AGILE_DB_PREFIX."account.country_id, ".AGILE_DB_PREFIX."account.currency_id, ".AGILE_DB_PREFIX."account.state FROM ".AGILE_DB_PREFIX."charge LEFT JOIN ".AGILE_DB_PREFIX."account ON ".AGILE_DB_PREFIX."account.id = " . AGILE_DB_PREFIX."charge.account_id WHERE ".AGILE_DB_PREFIX."charge.site_id = " . $db->qstr(DEFAULT_SITE) . " AND ".AGILE_DB_PREFIX."account.site_id = " . $db->qstr(DEFAULT_SITE) . " AND ".AGILE_DB_PREFIX."charge.status = " . $db->qstr('0') ." AND ".AGILE_DB_PREFIX."charge.sweep_type = " . $db->qstr($type) ." ORDER BY ".AGILE_DB_PREFIX."charge.account_id"; $rs = $db->Execute($sql); if ($rs === false) { global $C_debug; $C_debug->error('charge.inc.php','charge :: sweep()', $db->ErrorMsg(). "\r\n\r\n". $sql); return false; } $account_id = false; $invoice_id = false; $i = false; $i_total = false; $invoice_count = 0; $sweep_count = 0; while(!$rs->EOF) { if( $rs->fields['account_id'] != $account_id ) { $account_id = $rs->fields['account_id']; $i=0; $i_total = $this->count_account_charges($account_id, $rs->CurrentRow(), $rs); $sub_total = 0; $taxable_amount = 0; $this_discount_total = 0; $tax_amt = 0; $discount_amt = 0; # Start a new transaction $trans = &DB(); $trans->StartTrans(); # Start a new invoice $invoice_id = $db->GenID(AGILE_DB_PREFIX . 'invoice_id'); # check for any discounts for the parent invoice or account_id (applied at checkout and should continue to be applied if recurring type discount) $discountObj = new discount; # get parent invoice id if service specified (for discount checking) $parent_invoice_id = false; if($rs->fields['service_id']) { $parentinv = $db->Execute(sqlSelect($db,"service","invoice_id","id={$rs->fields['service_id']}")); if($parentinv && $parentinv->RecordCount()) { $parent_invoice_id = $parentinv->fields['invoice_id']; } } # get available discounts to this account/service $discountObj->available_discounts($account_id, 1, $parent_invoice_id); } ########################### ##### LINE ITEM ACTIONS ### ########################### if( !empty($account_id) ) { ### Get the line item id $invoice_item_id = $db->GenID(AGILE_DB_PREFIX . 'invoice_item_id'); ### Set the invoice item details: $product_id = $rs->fields['product_id']; if(!empty($product_id) && empty($this->product["$product_id"])) { $sql = "SELECT sku FROM ".AGILE_DB_PREFIX."product WHERE id = " . $db->qstr($product_id) . " AND site_id = " . $db->qstr(DEFAULT_SITE); $prod = $db->Execute($sql); if($prod->RecordCount() > 0) { $sku = $prod->fields['sku']; $this->product["$product_id"] = $sku; $product_attr = ''; if(!empty($rs->fields['description'])) $product_attr = "Description=={$rs->fields['description']}\r\n"; $product_attr .= $rs->fields['attributes']; } else { $sku = $rs->fields['description']; $this->product["$product_id"] = $sku; $product_attr = $rs->fields['attributes']; } } elseif (!empty($this->product["$product_id"])) { $sku = $this->product["$product_id"]; $product_attr = $rs->fields['attributes']; } else { $sku = $rs->fields['description']; $product_attr = $rs->fields['attributes']; } $quantity = $rs->fields['quantity']; $price_base = $rs->fields['amount']; $item_total_amt = ($price_base * $quantity); // Calculate any recurring discounts for this account $item_discount_amt = $discountObj->calc_all_discounts(1, $invoice_item_id, $rs->fields['product_id'], $item_total_amt, $account_id, $sub_total+$item_total_amt); $item_total_amt -= $item_discount_amt; $sub_total += $item_total_amt; $discount_amt += $item_discount_amt; # calculate any taxes for this item $item_tax_amt=0; if($rs->fields['taxable']) { $item_tax_arr = $taxObj->calculate($item_total_amt, $rs->fields['country_id'], $rs->fields['state']); if(is_array($item_tax_arr)) foreach($item_tax_arr as $tx) $item_tax_amt += $tx['rate']; $tax_amt += $item_tax_amt; } ### Add line item to new invoice $sql = "INSERT INTO ".AGILE_DB_PREFIX."invoice_item SET id = ".$db->qstr( $invoice_item_id ) .", site_id = ".$db->qstr( DEFAULT_SITE ).", invoice_id = ".$db->qstr( $invoice_id ).", account_id = ".$db->qstr( $account_id ).", date_orig = ".$db->qstr( time() ).", product_id = ".$db->qstr( $product_id ).", sku = ".$db->qstr( $sku ).", quantity = ".$db->qstr( $quantity ).", item_type = ".$db->qstr( '0' ).", product_attr = ".$db->qstr( $product_attr ).", price_type = ".$db->qstr( '0' ).", price_base = ".$db->qstr( $price_base ).", price_setup = ".$db->qstr( 0 ) .", tax_amt = ".$db->qstr($item_tax_amt) . ", total_amt = ".$db->qstr($item_total_amt) . ", discount_amt = ".$db->qstr($item_discount_amt); $trans->Execute($sql); # Insert tax records $taxObj->invoice_item($invoice_id, $invoice_item_id, $account_id, @$item_tax_arr); # Insert discount records $discountObj->invoice_item($invoice_id, $invoice_item_id, $account_id); ### Update this charge status to billed $sql = "UPDATE ".AGILE_DB_PREFIX."charge SET status = ".$db->qstr( '1' ) ." WHERE site_id = ".$db->qstr( DEFAULT_SITE )." AND id = ".$db->qstr( $rs->fields['id'] ) ; $trans->Execute($sql); $i++; $sweep_count++; } ####################### ### INVOICE ACTIONS ### ####################### if($i_total == $i || $i == $rs->RecordCount()) { if( $invoice_id ) { ### Get the most recent billing id for this client: if(!isset($billing_id["$account_id"])) { $billing_arr = $account_billing->default_billing($account_id); $billing_id["$account_id"] = $billing_arr['billing_id']; $checkout_plugin_id["$account_id"] = $billing_arr['checkout_plugin_id']; } ### Affiliate & Reseller info: $affiliate_id = $rs->fields['affiliate_id']; $reseller_id = $rs->fields['reseller_id']; $actual_billed_currency_id = $rs->fields['currency_id']; # calculate any taxes @$total = $sub_total + $tax_amt; if($total <= 0) { $process_status = 1; $billing_status = 1; } else { $process_status = 0; $billing_status = 0; } ### Generate the invoice insert SQL: $sql = "INSERT INTO ".AGILE_DB_PREFIX."invoice SET id = ".$db->qstr($invoice_id).", site_id = ".$db->qstr(DEFAULT_SITE).", date_orig = ".$db->qstr(time()).", date_last = ".$db->qstr(time()).", process_status = ".$db->qstr($process_status).", billing_status = ".$db->qstr($billing_status).", print_status = ".$db->qstr('0').", account_id = ".$db->qstr($account_id).", account_billing_id = ".$db->qstr($billing_id["$account_id"]).", affiliate_id = ".$db->qstr($affiliate_id).", reseller_id = ".$db->qstr($reseller_id).", checkout_plugin_id = ".$db->qstr($checkout_plugin_id["$account_id"]).", tax_amt = ".$db->qstr($tax_amt).", discount_amt = ".$db->qstr($discount_amt).", actual_billed_currency_id = ".$db->qstr($actual_billed_currency_id).", actual_billed_amt = ".$db->qstr('0').", billed_currency_id = ".$db->qstr(DEFAULT_CURRENCY).", billed_amt = ".$db->qstr('0').", total_amt = ".$db->qstr($total).", notice_count = ".$db->qstr('0').", notice_max = ".$db->qstr(MAX_BILLING_NOTICE).", notice_next_date = ".$db->qstr(time()).", grace_period = ".$db->qstr(GRACE_PERIOD).", due_date = ".$db->qstr(time()); $trans->Execute($sql); ### Close this transaction $trans->CompleteTrans(); $i_total = false; $i = false; $account_id = false; $invoice_id = false; $discount = false; $cookie = false; $invoice_count++; } } $rs->MoveNext(); } global $C_debug; $C_debug->alert("Swept $sweep_count Charge(s) into $invoice_count Invoice(s)."); return true; } ### Get total charges for an account function count_account_charges($account, $start_pos, &$rs) { $rs->Move($start_pos); $i = 0; while(!$rs->EOF) { if($rs->fields['account_id'] != $account) { $rs->Move($start_pos); return $i; } $i++; $rs->MoveNext(); } $rs->Move($start_pos); return $i; } ############################## ## API ## ############################## function api($VAR) { $db = &DB(); # amount if(@$VAR['amount'] <= 0) { return $this->api_return(0,'','Invalid value supplied for the \'amount\' parameter, must be greater than 0'); } else { $amount = $VAR['amount']; } # sweep_type if(@$VAR['sweep_type'] <= 6) { $sweep_type = $VAR['sweep_type']; } else { return $this->api_return(0,'','Invalid value supplied for the \'sweep_type\' parameter, must be 0-6'); } # account_id OR service_id if(empty($VAR['account_id']) && empty($VAR['service_id'])) { return $this->api_return(0,'','Either the \'account_id\' or \'service_id\' parameter must be provided'); } else { # check the account id if(!empty($VAR['account_id'])) { $sql = "SELECT * FROM ".AGILE_DB_PREFIX."account WHERE id = " . $db->qstr($VAR['account_id']) . " OR username = " . $db->qstr($VAR['account_id']) . " AND site_id = " . $db->qstr(DEFAULT_SITE); $rs = $db->Execute($sql); if ($rs === false) { global $C_debug; $C_debug->error('charge.inc.php','charge :: api()', $db->ErrorMsg(). "\r\n\r\n". $sql); } if($rs->RecordCount() == 1) { $account_id = $rs->fields['id']; } else { return $this->api_return(0,'','The \'account_id\' value provided does not exist'); } } # check the service id elseif(!empty($VAR['service_id'])) { $sql = "SELECT id,account_id FROM ".AGILE_DB_PREFIX."service WHERE site_id = " . $db->qstr(DEFAULT_SITE) . " AND id = " . $db->qstr($VAR['service_id']); $rs = $db->Execute($sql); if ($rs === false) { global $C_debug; $C_debug->error('charge.inc.php','charge :: api()', $db->ErrorMsg(). "\r\n\r\n". $sql); } if($rs->RecordCount() == 1) { $service_id = $VAR['service_id']; $account_id = $rs->fields['account_id']; } else { return $this->api_return(0,'','The \'service_id\' value provided does not exist'); } } } # taxable if(empty($VAR['taxable'])) $taxable = 0; else $taxable = $VAR['taxable']; # attributes if(!empty($VAR['attributes'])) { @$attributes = ereg_replace("@@", "\r\n", $VAR['attributes']); @$attributes = ereg_replace("--", "==", $attributes); } else { $attributes = false; } # quantity if(empty($VAR['quantity'])) $quantity = 1; else $quantity = $VAR['quantity']; # product id if(empty($VAR['product_id'])) { $product_id = false; } else { $product_id = $VAR['product_id']; } # description if(empty($VAR['description'])) { $description = false; } else { $description = $VAR['description']; } /* Start: SQL Insert Statement */ $sql = "SELECT * FROM ".AGILE_DB_PREFIX."charge WHERE id = -1"; $rs = $db->Execute($sql); $id = $db->GenID(AGILE_DB_PREFIX . 'charge_id'); $insert = Array ( 'id' => $id, 'site_id' => DEFAULT_SITE, 'date_orig' => time(), 'status' => 0, 'sweep_type' => $sweep_type, 'account_id' => @$account_id, 'service_id' => @$service_id, 'product_id' => @$product_id, 'amount' => $amount, 'quantity' => $quantity, 'taxable' => $taxable, 'attributes' => $attributes, 'description' => $description ); $sql = $db->GetInsertSQL($rs, $insert); $result = $db->Execute($sql); if ($result === false) { global $C_debug; $C_debug->error('charge.inc.php','charge :: api()', $db->ErrorMsg(). "\r\n\r\n". $sql); return $this->api_return(0,'','The SQL insert failed!'); } else { return $this->api_return(1,$id,''); } return true; } function api_return($status=0,$id='',$error='') { if(!$this->xmlrpc) { echo "status=={$status}++charge_id={$id}++error=={$error}"; } else { $arr = array('status'=>$status, 'charge_id'=>$id, 'error'=> $error); #print_r($arr); return $arr; } } ############################## ## ADD ## ############################## function add($VAR) { $this->charge_construct(); if(!empty($VAR['attributes'])) { $attr = false; for($i=0; $i<count($VAR['attributes']); $i++) if (!empty($VAR['attributes'][$i][0])) $attr .= "{$VAR['attributes'][$i][0]}=={$VAR['attributes'][$i][1]}\r\n"; $VAR['charge_attributes'] = $attr; } $type = "add"; $this->method["$type"] = split(",", $this->method["$type"]); $db = new CORE_database; $db->add($VAR, $this, $type); } ############################## ## VIEW ## ############################## function view($VAR) { $this->charge_construct(); $type = "view"; $this->method["$type"] = split(",", $this->method["$type"]); $db = new CORE_database; $db->view($VAR, $this, $type); } ############################## ## UPDATE ## ############################## function update($VAR) { $this->charge_construct(); $type = "update"; $this->method["$type"] = split(",", $this->method["$type"]); $db = new CORE_database; $db->update($VAR, $this, $type); } ############################## ## DELETE ## ############################## function delete($VAR) { $this->charge_construct(); $db = new CORE_database; $db->mass_delete($VAR, $this, ""); } ############################## ## SEARCH FORM ## ############################## function search_form($VAR) { $this->charge_construct(); $type = "search"; $this->method["$type"] = split(",", $this->method["$type"]); $db = new CORE_database; $db->search_form($VAR, $this, $type); } ############################## ## SEARCH ## ############################## function search($VAR) { $this->charge_construct(); $type = "search"; $this->method["$type"] = split(",", $this->method["$type"]); $db = &DB(); include_once(PATH_CORE . 'validate.inc.php'); $validate = new CORE_validate; # set the search criteria array $arr = $VAR; # loop through the submitted field_names to get the WHERE statement $where_list = ''; $i=0; while (list ($key, $value) = each ($arr)) { if($i == 0) { if($value != '') { $pat = "^" . $this->module . "_"; if(eregi($pat, $key)) { $field = eregi_replace($pat,"",$key); if(eregi('%',$value)) { # do any data conversion for this field (date, encrypt, etc...) if(isset($this->field["$field"]["convert"])) { $value = $validate->convert($field, $value, $this->field["$field"]["convert"]); } $where_list .= " WHERE ".AGILE_DB_PREFIX."charge.".$field . " LIKE " . $db->qstr($value, get_magic_quotes_gpc()); $i++; } else { # check if array if(is_array($value)) { for($i_arr=0; $i_arr < count($value); $i_arr++) { if($value["$i_arr"] != '') { # determine any field options (=, >, <, etc...) $f_opt = '='; $pat_field = $this->module.'_'.$field; $VAR['field_option']["$pat_field"]["$i_arr"]; if(isset($VAR['field_option']["$pat_field"]["$i_arr"])) { $f_opt = $VAR['field_option']["$pat_field"]["$i_arr"]; # error checking, safety precaution if($f_opt != '=' && $f_opt != '>' && $f_opt != '<' && $f_opt != '>=' && $f_opt != '<=' && $f_opt != '!=') $f_opt = '='; } # do any data conversion for this field (date, encrypt, etc...) if(isset($this->field["$field"]["convert"])) { $value["$i_arr"] = $validate->convert($field, $value["$i_arr"], $this->field["$field"]["convert"]); } if($i_arr == 0) { $where_list .= " WHERE ".AGILE_DB_PREFIX."charge.".$field . " $f_opt " . $db->qstr($value["$i_arr"], get_magic_quotes_gpc()); $i++; } else { $where_list .= " AND ".AGILE_DB_PREFIX."charge.".$field . " $f_opt " . $db->qstr($value["$i_arr"], get_magic_quotes_gpc()); $i++; } } } } else { $where_list .= " WHERE ".AGILE_DB_PREFIX."charge.".$field . " = " . $db->qstr($value, get_magic_quotes_gpc()); $i++; } } } } } else { if($value != '') { $pat = "^" . $this->module . "_"; if(eregi($pat, $key)) { $field = eregi_replace($pat,"",$key); if(eregi('%',$value)) { # do any data conversion for this field (date, encrypt, etc...) if(isset($this->field["$field"]["convert"])) { $value = $validate->convert($field, $value, $this->field["$field"]["convert"]); } $where_list .= " AND ".AGILE_DB_PREFIX."charge.".$field . " LIKE " . $db->qstr($value, get_magic_quotes_gpc()); $i++; } else { # check if array if(is_array($value)) { for($i_arr=0; $i_arr < count($value); $i_arr++) { if($value["$i_arr"] != '') { # determine any field options (=, >, <, etc...) $f_opt = '='; $pat_field = $this->module.'_'.$field; if(isset($VAR['field_option']["$pat_field"]["$i_arr"])) { $f_opt = $VAR['field_option']["$pat_field"]["$i_arr"]; # error checking, safety precaution if($f_opt != '=' && $f_opt != '>' && $f_opt != '<' && $f_opt != '>=' && $f_opt != '<=' && $f_opt != '!=') $f_opt = '='; } # do any data conversion for this field (date, encrypt, etc...) if(isset($this->field["$field"]["convert"])) { $value["$i_arr"] = $validate->convert($field, $value["$i_arr"], $this->field["$field"]["convert"]); } $where_list .= " AND ".AGILE_DB_PREFIX."charge.". $field . " $f_opt " . $db->qstr($value["$i_arr"], get_magic_quotes_gpc()); $i++; } } } else { $where_list .= " AND ".AGILE_DB_PREFIX."charge.". $field . " = ". $db->qstr($value, get_magic_quotes_gpc()); $i++; } } } } } } # Code for attribute searches: if(!empty($VAR['item_attributes'])) { $attr_arr = $VAR['item_attributes']; for($ati=0; $ati<count($attr_arr); $ati++) { if(!empty($attr_arr[$ati]['0'])) { if($where_list == '') $where_list .= ' WHERE '; else $where_list .= ' AND '; $where_list .= AGILE_DB_PREFIX."charge.attributes LIKE " . $db->qstr("%{$attr_arr[$ati]['0']}=={$attr_arr[$ati]['1']}%"); } } } #### finalize the WHERE statement if($where_list == '') $where_list .= ' WHERE '; else $where_list .= ' AND '; # get limit type if(isset($VAR['limit'])) { $limit = $VAR['limit']; } else { $limit = $this->limit; } # get order by if(isset($VAR['order_by'])) { $order_by = $VAR['order_by']; } else { $order_by = $this->order_by; } $q = "SELECT ".AGILE_DB_PREFIX."charge.id FROM ".AGILE_DB_PREFIX."charge "; $q .= $where_list ." ".AGILE_DB_PREFIX."charge.site_id = " . $db->qstr(DEFAULT_SITE); $q_save = "SELECT DISTINCT %%fieldList%%, ".AGILE_DB_PREFIX."charge.id FROM ".AGILE_DB_PREFIX."charge "; $q_save .= $where_list ." %%whereList%% "; #echo $q; #exit; # run the database query $result = $db->Execute($q); # error reporting if ($result === false) { global $C_debug; $C_debug->error('charge.inc.php','search', $db->ErrorMsg()); return false; } # get the result count: $results = $result->RecordCount(); # get the first record id: if($results == 1) $record_id = $result->fields['id']; # define the DB vars as a Smarty accessible block global $smarty; # Create the definition for fast-forwarding to a single record: if ($results == 1 && !isset($this->fast_forward)) { $smarty->assign('record_id', $record_id); } # create the search record: if($results > 0) { # create the search record include_once(PATH_CORE . 'search.inc.php'); $search = new CORE_search; $arr['module'] = $this->module; $arr['sql'] = $q_save; $arr['limit'] = $limit; $arr['order_by']= $order_by; $arr['results'] = $results; $search->add($arr); # define the search id and other parameters for Smarty $smarty->assign('search_id', $search->id); # page: $smarty->assign('page', '1'); # limit: $smarty->assign('limit', $limit); # order_by: $smarty->assign('order_by', $order_by); } # define the result count $smarty->assign('results', $results); } ############################## ## SEARCH SHOW ## ############################## function search_show($VAR) { $this->charge_construct(); $type = "search"; $this->method["$type"] = split(",", $this->method["$type"]); # set the field list for this method: $arr = $this->method[$type]; $field_list = ''; $i=0; while (list ($key, $value) = each ($arr)) { if($i == 0) { $field_var = $this->table . '_' . $value; $field_list .= AGILE_DB_PREFIX . "charge" . "." . $value; // determine if this record is linked to another table/field if($this->field[$value]["asso_table"] != "") { $this->linked[] = array('field' => $value, 'link_table' => $this->field[$value]["asso_table"], 'link_field' => $this->field[$value]["asso_field"]); } } else { $field_var = $this->table . '_' . $value; $field_list .= "," . AGILE_DB_PREFIX . "charge" . "." . $value; // determine if this record is linked to another table/field if($this->field[$value]["asso_table"] != "") { $this->linked[] = array('field' => $value, 'link_table' => $this->field[$value]["asso_table"], 'link_field' => $this->field[$value]["asso_field"]); } } $i++; } # get the search details: if(isset($VAR['search_id'])) { include_once(PATH_CORE . 'search.inc.php'); $search = new CORE_search; $search->get($VAR['search_id']); } else { # invalid search! echo '<BR> The search terms submitted were invalid!'; # translate... # alert if(isset($this->trigger["$type"])) { include_once(PATH_CORE . 'trigger.inc.php'); $trigger = new CORE_trigger; $trigger->trigger($this->trigger["$type"], 0, $VAR); } } # get the sort order details: if(isset($VAR['order_by']) && $VAR['order_by'] != "") { $order_by = ' ORDER BY ' . $VAR['order_by']; $smarty_order = $VAR['order_by']; } else { $order_by = ' ORDER BY ' . $this->order_by; $smarty_order = $search->order_by; } # determine the sort order if(isset($VAR['desc'])) { $order_by .= ' DESC'; $smarty_sort = 'desc='; } else if(isset($VAR['asc'])) { $order_by .= ' ASC'; $smarty_sort = 'asc='; } else { if (!eregi('date',$smarty_order)) { $order_by .= ' ASC'; $smarty_sort = 'asc='; } else { $order_by .= ' DESC'; $smarty_sort = 'desc='; } } # generate the full query $db = &DB(); $q = eregi_replace("%%fieldList%%", $field_list, $search->sql); $q = eregi_replace("%%tableList%%", AGILE_DB_PREFIX.$construct->table, $q); $q = eregi_replace("%%whereList%%", "", $q); $q .= " site_id = " . $db->qstr(DEFAULT_SITE); $q .= $order_by; ////////////////// # echo "<BR> $q <BR>"; $current_page=1; $offset=-1; if (!empty($VAR['page'])) $current_page = $VAR['page']; if (empty($search->limit)) $search->limit=25; if($current_page>1) $offset = (($current_page * $search->limit) - $search->limit); $result = $db->SelectLimit($q, $search->limit, $offset); # error reporting if ($result === false) { global $C_debug; $C_debug->error('charge.inc.php','search', $db->ErrorMsg()); if(isset($this->trigger["$type"])) { include_once(PATH_CORE . 'trigger.inc.php'); $trigger = new CORE_trigger; $trigger->trigger($this->trigger["$type"], 0, $VAR); } return; } # put the results into a smarty accessable array $i=0; $class_name = TRUE; while (!$result->EOF) { $smart[$i] = $result->fields; if($class_name) { $smart[$i]['_C'] = 'row1'; $class_name = FALSE; } else { $smart[$i]['_C'] = 'row2'; $class_name = TRUE; } $result->MoveNext(); $i++; } # get any linked fields if($i > 0) { $db_join = new CORE_database; $this->result = $db_join->join_fields($smart, $this->linked); } else { $this->result = $smart; } # get the result count: $results = $result->RecordCount(); # define the DB vars as a Smarty accessible block global $smarty; # define the results $smarty->assign($this->table, $this->result); $smarty->assign('page', $VAR['page']); $smarty->assign('order', $smarty_order); $smarty->assign('sort', $smarty_sort); $smarty->assign('limit', $search->limit); $smarty->assign('search_id',$search->id); $smarty->assign('results', $search->results); # get the total pages for this search: if(empty($search->limit)) $this->pages = 1; else $this->pages = intval($search->results / $search->limit); if ($search->results % $search->limit) $this->pages++; # total pages $smarty->assign('pages', $this->pages); # current page $smarty->assign('page', $current_page); $page_arr = ''; for($i=0; $i <= $this->pages; $i++) { if ($this->page != $i) $page_arr[] = $i; } # page array for menu $smarty->assign('page_arr', $page_arr); } ############################## ## SEARCH EXPORT ## ############################## function search_export($VAR) { $this->charge_construct(); # require the export class require_once (PATH_CORE . "export.inc.php"); # Call the correct export function for inline browser display, download, email, or web save. if($VAR["format"] == "excel") { $type = "export_excel"; $this->method["$type"] = split(",", $this->method["$type"]); $export = new CORE_export; $export->search_excel($VAR, $this, $type); } else if ($VAR["format"] == "pdf") { $type = "export_pdf"; $this->method["$type"] = split(",", $this->method["$type"]); $export = new CORE_export; $export->search_pdf($VAR, $this, $type); } else if ($VAR["format"] == "xml") { $type = "export_xml"; $this->method["$type"] = split(",", $this->method["$type"]); $export = new CORE_export; $export->search_xml($VAR, $this, $type); } else if ($VAR["format"] == "csv") { $type = "export_csv"; $this->method["$type"] = split(",", $this->method["$type"]); $export = new CORE_export; $export->search_csv($VAR, $this, $type); } else if ($VAR["format"] == "tab") { $type = "export_tab"; $this->method["$type"] = split(",", $this->method["$type"]); $export = new CORE_export; $export->search_tab($VAR, $this, $type); } } ############################## ## IMPORT ## ############################## function import($VAR) { $this->charge_construct(); include_once(PATH_CORE.'import.inc.php'); $import = new CORE_import; if(!empty($VAR['confirm'])) { $import->do_import($VAR, $this); } else { $import->prepare_import($VAR, $this); } } } ?>