* @package AgileBill
* @version 1.4.93
*/
class asset_invoice
{
/** get menu of asset pools */
function main($var) {
$db=&DB();
$p=AGILE_DB_PREFIX;
$rs = $db->Execute("select id,name from {$p}asset_pool");
if($rs && $rs->RecordCount()) {
global $smarty;
$pools=array();
while(!$rs->EOF) {
array_push($pools, $rs->fields);
$rs->MoveNext();
}
$smarty->assign('pools', $pools);
}
}
/** show pending invoices */
function invoice($v) {
// verify pool
if(empty($v['pool_id']))
return false;
else
$pool_id = $v['pool_id'];
$db=&DB();
$p=AGILE_DB_PREFIX;
// get all products ids set for manual assignment or this pool
$prodIds=array();
$prod = $db->Execute("select id,prod_plugin_data from {$p}product
WHERE prod_plugin = 1 and prod_plugin_file = 'ASSET'");
if($prod && $prod->RecordCount()) {
while(!$prod->EOF) {
@$d = unserialize($prod->fields['prod_plugin_data']);
// is this asset pool
if(!empty($d['AssetPool']) && $d['AssetPool'] == $pool_id) {
array_push($prodIds, $prod->fields['id']);
// is manual enabled
} elseif(!empty($d['manual']) && $d['manual'] == '1') {
array_push($prodIds, $prod->fields['id']);
}
$prod->MoveNext();
}
}
if(count($prodIds)==0) {
echo '
No products defined for the selected asset pool or manual assignment.
';
return false;
}
$rs = $db->Execute($sql="select distinct a.*,
b.first_name, b.last_name, b.city, b.state, b.zip from {$p}invoice a
join {$p}account b on (a.account_id = b.id)
WHERE
a.billing_status = 1 AND a.process_status <> 1 AND a.refund_status <> 1
AND a.id in
( select c.invoice_id from {$p}invoice_item c where
c.product_id
in (".implode(',', $prodIds).")
) ");
if($rs && $rs->RecordCount()) {
$invoices=array();
global $smarty;
while(!$rs->EOF) {
/** select invoice items */
$rs2 = $db->Execute("select distinct a.id,a.product_id,a.sku,a.quantity, b.name
from {$p}invoice_item a
left join {$p}product_translate b on (a.product_id=b.product_id and language_id='".DEFAULT_LANGUAGE."')
where a.invoice_id = {$rs->fields['id']}
and a.product_id in (".implode(',', $prodIds).")
");
$itemsJs = '';
if($rs2 && $rs2->RecordCount()) {
$i=0;
$jname = 'items_'. $rs->fields['id'];
while(!$rs2->EOF) {
$itemsJs .= "{$jname}[{$i}] = {'id':{$rs2->fields['id']}, 'value':0}; \r\n";
$rs->fields['items'][] = $rs2->fields;
$rs2->MoveNext();
$i++;
}
}
$rs->fields['itemsJs'] = $itemsJs;
array_push($invoices, $rs->fields);
$rs->MoveNext();
}
$smarty->assign('invoices', $invoices);
/** get available assets for this category */
$rs = $db->Execute("select id,asset as name from {$p}asset where status <> 1 and pool_id = ".$db->qstr($pool_id));
if($rs && $rs->RecordCount()) {
$assets=array();
while(!$rs->EOF) {
array_push($assets, $rs->fields);
$rs->MoveNext();
}
$smarty->assign('assets', $assets);
}
}
}
/** define asset ids for services and approve invoice */
function assign($v) {
@$id = $v['invoice_id'];
@$items = $v['items'];
/** input valid? */
if(empty($id) || empty($items) || !is_array($items)) {
echo 'Invalid data passed';
return false;
}
$db=&DB();
$p=AGILE_DB_PREFIX;
// validate all items set
foreach ($items as $key=>$item) {
if(empty($item) || $item=='0') {
echo 'All items must be assigned';
return false;
}
// validate that asset is available
$assetRs=$db->Execute("select a.id,a.asset,b.name as poolName from {$p}asset a, {$p}asset_pool b where a.pool_id=b.id and a.status <> 1 and a.id = ".$db->qstr($item));
if(!$assetRs || !$assetRs->RecordCount()) {
echo "Asset $item is already assigned or non-existant!";
return false;
} else {
$assets[] = array('item'=>$key, 'value'=>$item, 'asset'=> $assetRs->fields['asset'], 'poolname'=>$assetRs->fields['poolName'],);
}
}
// loop through each line item and update the product_attr_cart field
foreach ($assets as $asset) {
$item = $asset['item'];
$value = $asset['value'];
$name = $asset['asset'];
$pool = $asset['poolname'];
$s = $db->GetOne($sql="select product_attr_cart from {$p}invoice_item where id = ".$db->qstr($item)." and invoice_id = ".$db->qstr($id) );
if(empty($s)) {
$s['AssetId']=$value;
} else {
$s = unserialize($s);
$s['AssetId']=$value;
}
@$ss=serialize($s);
/** formatting for invoice view */
$old='';
$oldAttr = $db->Execute("select product_attr from {$p}invoice_item where id = ".$db->qstr($item)." and invoice_id = ".$db->qstr($id) );
if($oldAttr && $oldAttr->RecordCount()) $old = $oldAttr->fields['product_attr'];
$product_attr = "{$pool}=={$name} (ID: {$value})\r\n".$old;
/** update invoice */
$db->Execute("update {$p}invoice_item set product_attr=".$db->qstr($product_attr).", product_attr_cart=".$db->qstr($ss)." where id = ".$db->qstr($item)." and invoice_id = ".$db->qstr($id) );
/** update service if exists */
$db->Execute("update {$p}service set prod_attr=".$db->qstr($product_attr).", prod_attr_cart=".$db->qstr($ss)." where invoice_item_id = ".$db->qstr($item)." and invoice_id = ".$db->qstr($id) );
}
// process invoice => service
require_once(PATH_MODULES.'invoice/invoice.inc.php');
$inv = new invoice();
$result = $inv->approveInvoice(array('id'=>$id),&$inv);
if($result)
echo 'true';
else
echo 'Error occurred while approving invoice.';
}
}
?>