sidemenu_links); } /************************************************************************** ************************************************************************** ************************************************************************** * virtuals: jqGridData * - With the application controller handling the jqGridData action, * these virtual functions ensure that the correct data is passed * to jqGrid. */ function jqGridDataSetup(&$params) { parent::jqGridDataSetup($params); if (isset($params['custom']['collected_account_id'])) $params['custom']['account_id'] = $params['custom']['collected_account_id']; } function jqGridDataTables(&$params, &$model) { $link = array(// Models 'Account' => array('fields' => array('id', 'name', 'type'), ), 'Ledger' => array('fields' => array('id', 'sequence'), ), 'DoubleEntry' => array ('Transaction' => array('fields' => array('id', 'stamp'), ), 'DebitLedger' => array('fields' => array('id'), 'Account' => array('alias' => 'DebitAccount', 'fields' => array('id', 'name'), ), ), 'CreditLedger' => array('fields' => array('id'), 'Account' => array('alias' => 'CreditAccount', 'fields' => array('id', 'name'), ), ), 'Customer' => array('fields' => array('id', 'name'), ), 'Lease' => array('fields' => array('id', 'number'), 'Unit' => array('fields' => array('id', 'name'), ), ), ), ); if (count(array_intersect($params['fields'], array('applied'))) == 1) { $link['Payment'] = array('DoubleEntry' => array('alias' => 'PaymentDoubleEntry', 'Receipt'), 'Account' => array('alias' => 'PaymentAccount'), ); $link['Charge'] = array('DoubleEntry' => array('alias' => 'ChargeDoubleEntry', 'Invoice'), 'Account' => array('alias' => 'ChargeAccount'), ); } elseif (isset($params['custom']['customer_id']) || isset($params['custom']['lease_id'])) { $link['Charge'] = array('DoubleEntry' => array('alias' => 'ChargeDoubleEntry', 'Invoice'), 'Account' => array('alias' => 'ChargeAccount'), ); } return array('link' => $link); } function jqGridDataFields(&$params, &$model) { $fields = parent::jqGridDataFields($params, $model); if (!isset($fields)) $fields = array('Entry.*'); /* if (isset($params['custom']['reconcile_id'])) { */ /* $fields[] = array("IF(Entry.type = 'CHARGE',", */ /* " COALESCE(AppliedCharge.amount,0),", */ /* " COALESCE(AppliedPayment.amount,0))", */ /* " AS 'applied'"); */ /* $fields[] = array("Entry.amount - (", */ /* "IF(Entry.type = 'CHARGE',", */ /* " COALESCE(AppliedCharge.amount,0),", */ /* " COALESCE(AppliedPayment.amount,0))", */ /* ") AS 'balance'"); */ /* } */ if (isset($params['custom']['customer_id']) || isset($params['custom']['lease_id'])) { $fields[] = "IF(Entry.type = 'CHARGE', DoubleEntry.amount, NULL) AS debit"; $fields[] = "IF(Entry.type = 'PAYMENT', DoubleEntry.amount, NULL) AS credit"; $fields[] = "IF(Entry.type = 'CHARGE', 1, -1) * DoubleEntry.amount AS balance"; } else { if (count(array_intersect($params['fields'], array('applied'))) == 1) $fields[] = ('SUM(COALESCE(AppliedPayment.amount,0)' . ' + COALESCE(AppliedCharge.amount,0)) AS applied'); if (count(array_intersect($params['fields'], array('debit', 'credit'))) >= 1) { $fields = array_merge($fields, $this->Entry->DoubleEntry->debitCreditFields()); /* $fields = array_merge($fields, */ /* $this->Entry->Account->debitCreditFields()); */ /* $fields[] = "IF(Entry.crdr = 'CREDIT', DoubleEntry.amount, NULL) AS credit"; */ /* $fields[] = "IF(Entry.crdr = 'DEBIT', DoubleEntry.amount, NULL) AS debit"; */ /* $fields[] = "IF(Account.type IN Entry.crdr = 'DEBIT', DoubleEntry.amount, NULL) AS debit"; */ } } if ($params['action'] === 'collected') $fields[] = 'MAX(Receipt.stamp) AS last_paid'; return $fields; } function jqGridDataConditions(&$params, &$model) { $conditions = parent::jqGridDataConditions($params, $model); if ($params['action'] === 'collected') { extract($params['custom']); if (!isset($params['custom']['account_id'])) die("INTERNAL ERROR: ACCOUNT ID NOT SET"); if (!empty($collected_from_date)) $conditions[] = array('Receipt.stamp >=' => $this->Entry->Transaction->dateFormatBeforeSave($collected_from_date)); if (!empty($collected_through_date)) $conditions[] = array('Receipt.stamp <=' => $this->Entry->Transaction->dateFormatBeforeSave($collected_through_date . ' 23:59:59')); if (isset($collected_payment_accounts)) $conditions[] = array('PaymentAccount.id' => $collected_payment_accounts); else $conditions[] = array('NOT' => array(array('PaymentAccount.id' => null))); } if (isset($params['custom']['ledger_id'])) { $ledger_id = $params['custom']['ledger_id']; $conditions[] = array('Ledger.id' => $ledger_id); } if (isset($params['custom']['reconcile_id'])) { $conditions[] = array('OR' => array('AppliedCharge.id' => $reconcile_id), array('AppliedPayment.id' => $reconcile_id)); } if (isset($params['custom']['account_id'])) { $account_id = $params['custom']['account_id']; $conditions[] = array('Account.id' => $account_id); } if (isset($params['custom']['customer_id'])) { $customer_id = $params['custom']['customer_id']; $conditions[] = array('OR' => array(array(array('Entry.type' => 'CHARGE'), array('DoubleEntry.customer_id' => $customer_id)), array(array('Entry.type' => 'PAYMENT'), array('ChargeDoubleEntry.customer_id' => $customer_id)), ), ); } if (isset($params['custom']['lease_id'])) { $lease_id = $params['custom']['lease_id']; $conditions[] = array('OR' => array(array(array('Entry.type' => 'CHARGE'), array('DoubleEntry.lease_id' => $lease_id)), array(array('Entry.type' => 'PAYMENT'), array('ChargeDoubleEntry.lease_id' => $lease_id)), ), ); /* array('OR' => */ /* array('AND' => */ /* array(array('Entry.type' => 'CHARGE'), */ /* array('DoubleEntry.lease_id' => $lease_id)) */ /* ), */ /* array('AND' => */ /* array(array('Entry.type' => 'PAYMENT'), */ /* array('ChargeDoubleEntry.lease_id' => $lease_id)), */ /* ), */ /* ); */ } if (isset($params['custom']['transaction_id'])) { $conditions[] = array('Transaction.id' => $params['custom']['transaction_id']); } return $conditions; } function jqGridRecordLinks(&$params, &$model, &$records, $links) { $links['Transaction'] = array('id'); $links['Entry'] = array('id'); $links['Account'] = array('controller' => 'accounts', 'name'); $links['DebitAccount'] = array('controller' => 'accounts', 'name'); $links['CreditAccount'] = array('controller' => 'accounts', 'name'); $links['MonetarySource'] = array('name'); $links['Customer'] = array('name'); $links['Lease'] = array('number'); $links['Unit'] = array('name'); return parent::jqGridRecordLinks($params, $model, $records, $links); } function jqGridDataGroup(&$params, &$model) { return parent::jqGridDataGroup($params, $model); } function jqGridDataOrder(&$params, &$model, $index, $direction) { /* if ($index === 'balance') */ /* return ($index .' '. $direction); */ $order = parent::jqGridDataOrder($params, $model, $index, $direction); if ($index === 'Transaction.stamp') { $order[] = 'Entry.id ' . $direction; } return $order; } function jqGridDataRecords(&$params, &$model, $query) { if ($params['action'] === 'collected') { $tquery = array_diff_key($query, array(/*'fields'=>1,*/'group'=>1,'limit'=>1,'order'=>1)); $tquery['group'] = array('AppliedPayment.id'); $tquery['fields'] = array("IF(Entry.type = 'CHARGE',", " SUM(COALESCE(AppliedCharge.amount,0)),", " SUM(COALESCE(AppliedPayment.amount,0)))", " AS 'applied'", "Charge.amount - (", "IF(Entry.type = 'CHARGE',", " SUM(COALESCE(AppliedCharge.amount,0)),", " SUM(COALESCE(AppliedPayment.amount,0)))", ") AS 'balance'", ); $total = $model->find('first', $tquery); $params['userdata']['total'] = $total[0]['applied']; $params['userdata']['balance'] = $total[0]['balance']; } return parent::jqGridDataRecords($params, $model, $query); } /************************************************************************** ************************************************************************** ************************************************************************** * action: reverse the ledger entry */ function reverse($id) { $this->Entry->reverse($id); $this->redirect(array('action'=>'view', $id)); } /************************************************************************** ************************************************************************** ************************************************************************** * action: view * - Displays information about a specific entry */ function view($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid Item.', true)); $this->redirect(array('controller' => 'accounts', 'action'=>'index')); } // Get the Entry and related fields $entry = $this->Entry->find ('first', array('contain' => array ('Account' => array('id', 'name', 'type', 'trackable'), 'DoubleEntry' => array (//'fields' => array('id'), 'DebitEntry' => array('fields' => array('id', 'crdr')), 'CreditEntry' => array('fields' => array('id', 'crdr')), 'Transaction' => array('fields' => array('id', 'stamp')), 'Customer' => array('fields' => array('id', 'name')), 'Lease' => array('fields' => array('id')), ), ), 'conditions' => array('Entry.id' => $id), )); $entry['Entry']['opposite_crdr'] = ucfirst($this->Entry->Account->fundamentalOpposite($entry['Entry']['crdr'])); $entry['Entry']['matching_entry_id'] = $entry['DoubleEntry'][ ucfirst(strtolower($entry['Entry']['opposite_crdr'])) . 'Entry']['id']; /* if ($entry['DoubleEntry']['DebitEntry']['id'] == $entry['Entry']['id']) */ /* $entry['Entry']['matching_entry_id'] = $entry['DoubleEntry']['CreditEntry']['id']; */ /* if ($entry['DoubleEntry']['CreditEntry']['id'] == $entry['Entry']['id']) */ /* $entry['Entry']['matching_entry_id'] = $entry['DoubleEntry']['DebitEntry']['id']; */ //pr(compact('entry')); $reconciled = $this->Entry->reconciledEntries($id); //pr(compact('reconciled')); /* // REVISIT : 20090711 */ /* // It's not clear whether we should be able to reverse charges that have */ /* // already been paid/cleared/reconciled. Certainly, that will be the */ /* // case when someone has pre-paid and then moves out early. However, this */ /* // will work well for items accidentally charged but not yet paid for. */ /* if ((!$entry['DebitLedger']['Account']['trackable'] || */ /* $stats['debit']['amount_reconciled'] == 0) && */ /* (!$entry['CreditLedger']['Account']['trackable'] || */ /* $stats['credit']['amount_reconciled'] == 0) */ /* && 0 */ /* ) */ /* { */ /* // Set up dynamic menu items */ /* $this->sidemenu_links[] = */ /* array('name' => 'Operations', 'header' => true); */ /* $this->sidemenu_links[] = */ /* array('name' => 'Undo', */ /* 'url' => array('action' => 'reverse', */ /* $id)); */ /* } */ /* if ($this->Entry->Ledger->Account->type */ /* ($entry['CreditLedger']['Account']['id']) == 'INCOME') */ /* { */ /* // Set up dynamic menu items */ /* $this->sidemenu_links[] = */ /* array('name' => 'Operations', 'header' => true); */ /* $this->sidemenu_links[] = */ /* array('name' => 'Reverse', */ /* 'url' => array('action' => 'reverse', */ /* $id)); */ /* } */ // Prepare to render. $title = "Ledger Entry #{$entry['Entry']['id']}"; $this->set(compact('entry', 'title', 'reconciled')); } function tst($id = null) { $entry = $this->Entry->find ('first', array('contain' => array('Account', 'DoubleEntry', 'Payment' => array('fields' => array('Payment.*'/*, 'AppliedPayment.*'*/), 'DoubleEntry'/* => array('alias' => 'PaymentDoubleEntry')*/), 'Charge' => array('fields' => array('Charge.*'/*, 'AppliedCharge.*'*/), 'DoubleEntry'/* => array('alias' => 'ChargeDoubleEntry')*/), ), 'conditions' => array('Entry.id' => $id), )); pr($entry); } }