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 jqGridDataTables(&$params, &$model) { $link = array(// Models 'Transaction' => array('fields' => array('id', 'stamp'), ), 'MonetarySource' => array('fields' => array('id', 'name'), ), ); if (isset($params['custom']['account_ftype'])) { $ftype = $params['custom']['account_ftype']; $ftype = ucfirst($ftype); //$ftype = $this->LedgerEntry->DebitLedger->Account->fundamentalOpposite($ftype); $link[$ftype . 'Ledger'] = array('fields' => array('id', 'sequence'), 'Account' => array('class' => 'Account', 'fields' => array('id', 'name'), ), ); } elseif (isset($params['custom']['ledger_id'])) { $ledger_id = $params['custom']['ledger_id']; $link['Ledger'] = array('fields' => array('id', 'sequence'), 'conditions' => ("Ledger.id = IF(LedgerEntry.debit_ledger_id = $ledger_id," . " LedgerEntry.credit_ledger_id," . " LedgerEntry.debit_ledger_id)"), 'Account' => array( 'fields' => array('id', 'name'), ), ); } else { $link['DebitLedger'] = array('fields' => array('id', 'sequence'), 'DebitAccount' => array('class' => 'Account', 'fields' => array('id', 'name'), ), ); $link['CreditLedger'] = array('fields' => array('id', 'sequence'), 'CreditAccount' => array('class' => 'Account', 'fields' => array('id', 'name'), ), ); } if (isset($params['custom']['reconcile_id'])) { $ftype = $params['custom']['account_ftype']; $ftype = $this->LedgerEntry->DebitLedger->Account->fundamentalOpposite($ftype); $ftype = ucfirst($ftype); $link[$ftype.'ReconciliationLedgerEntry'] = array('fields' => array('Reconciliation.amount')); } return array('link' => $link); } function jqGridDataFields(&$params, &$model) { $ledger_id = (isset($params['custom']['ledger_id']) ? $params['custom']['ledger_id'] : null); $account_type = (isset($params['custom']['account_type']) ? $params['custom']['account_type'] : null); return $model->ledgerContextFields($ledger_id, $account_type); } function jqGridDataConditions(&$params, &$model) { $ledger_id = (isset($params['custom']['ledger_id']) ? $params['custom']['ledger_id'] : null); $account_type = (isset($params['custom']['account_type']) ? $params['custom']['account_type'] : null); $conditions = parent::jqGridDataConditions($params, $model); if ($params['action'] === 'ledger') { $conditions[] = $model->ledgerContextConditions($ledger_id, $account_type); } if (isset($params['custom']['reconcile_id'])) { $ftype = $params['custom']['account_ftype']; //$ftype = $this->LedgerEntry->DebitLedger->Account->fundamentalOpposite($ftype); $conditions[] = array('Reconciliation.'.$ftype.'_ledger_entry_id' => $params['custom']['reconcile_id']); } return $conditions; } function jqGridRecordLinks(&$params, &$model, &$records, $links) { $links['Transaction'] = array('id'); $links['LedgerEntry'] = array('id'); if (isset($params['custom']['account_ftype']) || isset($params['custom']['ledger_id'])) { $links['Account'] = array('controller' => 'accounts', 'name'); } else { $links['DebitAccount'] = array('controller' => 'accounts', 'name'); $links['CreditAccount'] = array('controller' => 'accounts', 'name'); } $links['MonetarySource'] = array('name'); return parent::jqGridRecordLinks($params, $model, $records, $links); } /************************************************************************** ************************************************************************** ************************************************************************** * 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 LedgerEntry and related fields $entry = $this->LedgerEntry->find ('first', array('contain' => array('MonetarySource.id', 'MonetarySource.MonetaryType.id', 'Transaction.id', 'Transaction.stamp', 'DebitLedger.id', 'DebitLedger.sequence', 'DebitLedger.account_id', 'CreditLedger.id', 'CreditLedger.sequence', 'CreditLedger.account_id', ), 'fields' => array('LedgerEntry.id', 'LedgerEntry.amount', 'LedgerEntry.comment'), 'conditions' => array('LedgerEntry.id' => $id), )); // Because 'DebitLedger' and 'CreditLedger' both relate to 'Account', // CakePHP will not include them in the LedgerEntry->find (or so it // seems). We'll have to break out each Account separately. // Get the Account from DebitLedger $entry['DebitLedger'] += $this->LedgerEntry->DebitLedger->Account->find ('first', array('contain' => true, 'fields' => array('Account.id', 'Account.name', 'Account.type', 'Account.trackable'), 'conditions' => array('Account.id' => $entry['DebitLedger']['account_id']), )); // Get the Account from CreditLedger $entry['CreditLedger'] += $this->LedgerEntry->CreditLedger->Account->find ('first', array('contain' => true, 'fields' => array('Account.id', 'Account.name', 'Account.type', 'Account.trackable'), 'conditions' => array('Account.id' => $entry['CreditLedger']['account_id']), )); // Get the reconciliation balances for this ledger entry $stats = $this->LedgerEntry->stats($id); if ($entry['DebitLedger']['Account']['trackable']) $stats['debit_amount_remaining'] = $entry['LedgerEntry']['amount'] - $stats['debit_amount_reconciled']; if ($entry['CreditLedger']['Account']['trackable']) $stats['credit_amount_remaining'] = $entry['LedgerEntry']['amount'] - $stats['credit_amount_reconciled']; //pr($stats); $reconciled = $this->LedgerEntry->findReconciledLedgerEntries($id); //pr($reconciled); // Prepare to render. $title = "Ledger Entry #{$entry['LedgerEntry']['id']}"; $this->set(compact('entry', 'title', 'reconciled', 'stats')); } }