diff --git a/app_controller.php b/app_controller.php index c1e74e5..46af502 100644 --- a/app_controller.php +++ b/app_controller.php @@ -35,13 +35,14 @@ * @subpackage cake.app */ class AppController extends Controller { - var $helpers = array('Html', 'Format'); + var $helpers = array('Html', 'Format', 'Time'); function sideMenuLinks() { return array( array('name' => 'Common', 'header' => true), array('name' => 'Site Map', 'url' => array('controller' => 'maps', 'action' => 'view', 1)), array('name' => 'Units', 'url' => array('controller' => 'units', 'action' => 'index')), + array('name' => 'Leases', 'url' => array('controller' => 'leases', 'action' => 'index')), array('name' => 'Customers', 'url' => array('controller' => 'customers', 'action' => 'index')), array('name' => 'Contacts', 'url' => array('controller' => 'contacts', 'action' => 'index')), array('name' => 'Accounts', 'url' => array('controller' => 'accounts', 'action' => 'index')), diff --git a/controllers/leases_controller.php b/controllers/leases_controller.php new file mode 100644 index 0000000..bb85591 --- /dev/null +++ b/controllers/leases_controller.php @@ -0,0 +1,152 @@ + 100, + 'group' => 'Lease.id', + 'order' => array('Lease.movein_date' => 'DESC')); + + var $sidemenu_links = + array(array('name' => 'Leases', 'header' => true), + array('name' => 'Active', 'url' => array('controller' => 'leases', 'action' => 'active')), + array('name' => 'Closed', 'url' => array('controller' => 'leases', 'action' => 'closed')), + array('name' => 'All', 'url' => array('controller' => 'leases', 'action' => 'all')), + ); + + + /************************************************************************** + ************************************************************************** + ************************************************************************** + * override: sideMenuLinks + * - Generates controller specific links for the side menu + */ + function sideMenuLinks() { + return array_merge(parent::sideMenuLinks(), $this->sidemenu_links); + } + + + /************************************************************************** + ************************************************************************** + ************************************************************************** + * action: index + * - Lists current leases + */ + + function index() { + $this->active(); + } + + + /************************************************************************** + ************************************************************************** + ************************************************************************** + * action: active + * - Lists all active leases + */ + + function active() { + $leases = $this->paginate(array('Lease.close_date IS NULL')); + + // Get the balance on each lease. + foreach ($leases AS &$lease) { + $stats = $this->Lease->stats($lease['Lease']['id']); + $lease['Lease']['balance'] = $stats['Account']['Ledger']['balance']; + } + + $title = 'Active Leases'; + $this->set('title', $title); $this->set('heading', $title); + $this->set('leases', $leases); + $this->render('index'); + } + + + /************************************************************************** + ************************************************************************** + ************************************************************************** + * action: closed + * - Lists all closed (inactive) leases + */ + + function closed() { + $leases = $this->paginate(array('Lease.close_date IS NOT NULL')); + + // Get the balance on each lease. + foreach ($leases AS &$lease) { + $stats = $this->Lease->stats($lease['Lease']['id']); + $lease['Lease']['balance'] = $stats['Account']['Ledger']['balance']; + } + + $title = 'Past Leases'; + $this->set('title', $title); $this->set('heading', $title); + $this->set('leases', $leases); + $this->render('index'); + } + + + /************************************************************************** + ************************************************************************** + ************************************************************************** + * action: all + * - Lists all leases + */ + + function all() { + $leases = $this->paginate(); + + // Get the balance on each lease. + foreach ($leases AS &$lease) { + $stats = $this->Lease->stats($lease['Lease']['id']); + $lease['Lease']['balance'] = $stats['Account']['Ledger']['balance']; + } + + $title = 'All Leases'; + $this->set('title', $title); $this->set('heading', $title); + $this->set('leases', $leases); + $this->render('index'); + } + + + /************************************************************************** + ************************************************************************** + ************************************************************************** + * action: view + * - Displays information about a specific lease + */ + + function view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid Item.', true)); + $this->redirect(array('action'=>'index')); + } + + // Get details about the lease and its ledgers (no ledger entries yet) + $this->Lease->Behaviors->attach('Containable'); + $lease = $this->Lease->find + ('first', + array('contain' => + array(// Models + 'LeaseType', + 'Unit', + 'Account' => array('Ledger'), + 'Customer', + ), + 'conditions' => array(array('Lease.id' => $id)), + 'limit' => 2 + ) + ); + $this->Lease->Behaviors->detach('Containable'); + + // Summarize each ledger + $this->Lease->statsMerge($lease, + $this->Lease->stats($lease['Lease']['id'])); + + // Obtain the overall lease balance + $this->Lease->statsMerge($lease['Lease'], + array('stats' => $this->Lease->stats($id))); + $balance = $lease['Lease']['stats']['Account']['Ledger']['balance']; + + // Prepare to render + $title = 'Lease: #' . $lease['Lease']['id']; + $this->set(compact('lease', 'title', 'balance')); + } +} diff --git a/controllers/ledger_entries_controller.php b/controllers/ledger_entries_controller.php index a389a56..21ed6af 100644 --- a/controllers/ledger_entries_controller.php +++ b/controllers/ledger_entries_controller.php @@ -5,11 +5,7 @@ class LedgerEntriesController extends AppController { 'group' => 'Entry.id', 'order' => array('Entry.stamp' => 'ASC')); - var $sidemenu_links = - array(array('name' => 'Entries', 'header' => true), - array('name' => 'Cleared', 'url' => array('controller' => 'ledger_entries', 'action' => 'cleared')), - array('name' => 'Unresolved', 'url' => array('controller' => 'ledger_entries', 'action' => 'unresolved')), - ); + var $sidemenu_links = array(); /************************************************************************** @@ -36,22 +32,56 @@ class LedgerEntriesController extends AppController { $this->redirect(array('controller' => 'accounts', 'action'=>'index')); } + // Get the LedgerEntry and related fields $this->LedgerEntry->Behaviors->attach('Containable'); - $this->LedgerEntry->contain - (array(// Models - 'MonetarySource' => array('MonetaryType'), - 'Transaction', - 'DebitLedger', - 'CreditLedger', - ) - ); - $entry = $this->LedgerEntry->read(null, $id); + $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'), + )); $this->LedgerEntry->Behaviors->detach('Containable'); - $title = "Entry #{$entry['LedgerEntry']['id']} ({$entry['LedgerEntry']['name']})"; - $this->set(compact('entry', 'title')); + // 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. - pr($entry); - $this->autoRender = false; + // Get the Account from DebitLedger + $this->LedgerEntry->DebitLedger->Account->Behaviors->attach('Containable'); + $account = $this->LedgerEntry->DebitLedger->Account->find + ('first', + array('contain' => true, + 'fields' => array('Account.id', 'Account.name', 'Account.type'), + 'conditions' => array('Account.id' => $entry['DebitLedger']['account_id']), + )); + $entry['DebitLedger'] = array_merge($entry['DebitLedger'], $account); + $this->LedgerEntry->DebitLedger->Account->Behaviors->detach('Containable'); + + // Get the Account from CreditLedger + $this->LedgerEntry->CreditLedger->Account->Behaviors->attach('Containable'); + $account = $this->LedgerEntry->CreditLedger->Account->find + ('first', + array('contain' => true, + 'fields' => array('Account.id', 'Account.name', 'Account.type'), + 'conditions' => array('Account.id' => $entry['CreditLedger']['account_id']), + )); + $entry['CreditLedger'] = array_merge($entry['CreditLedger'], $account); + $this->LedgerEntry->CreditLedger->Account->Behaviors->detach('Containable'); + + // Prepare to render. + $title = "Ledger Entry #{$entry['LedgerEntry']['id']}"; + $this->set(compact('entry', 'title')); } } diff --git a/controllers/transactions_controller.php b/controllers/transactions_controller.php index 8641019..6a49247 100644 --- a/controllers/transactions_controller.php +++ b/controllers/transactions_controller.php @@ -100,9 +100,22 @@ class TransactionsController extends AppController { $this->Transaction->Behaviors->attach('Containable'); $this->Transaction->contain (array(// Models - 'LedgerEntry' => array(//Models - 'DebitLedger', - 'CreditLedger', + 'LedgerEntry' => array('fields' => array('LedgerEntry.id', + 'LedgerEntry.amount', + 'LedgerEntry.comment'), + //Models + + 'DebitLedger' => array + ('fields' => array('DebitLedger.id', 'DebitLedger.sequence'), + 'Account' => array + ('fields' => array('Account.id', 'Account.name')), + ), + + 'CreditLedger' => array + ('fields' => array('CreditLedger.id', 'CreditLedger.sequence'), + 'Account' => array + ('fields' => array('Account.id', 'Account.name')), + ), ), ) ); diff --git a/models/lease.php b/models/lease.php index b482b2a..a7da73e 100644 --- a/models/lease.php +++ b/models/lease.php @@ -9,10 +9,10 @@ class Lease extends AppModel { 'unit_id' => array('numeric'), 'late_schedule_id' => array('numeric'), 'lease_date' => array('date'), - 'movein_planed_date' => array('date'), + 'movein_planned_date' => array('date'), 'movein_date' => array('date'), 'moveout_date' => array('date'), - 'moveout_planed_date' => array('date'), + 'moveout_planned_date' => array('date'), 'notice_given_date' => array('date'), 'notice_received_date' => array('date'), 'close_date' => array('date'), diff --git a/views/elements/leases.ctp b/views/elements/leases.ctp index bb4e56a..098da00 100644 --- a/views/elements/leases.ctp +++ b/views/elements/leases.ctp @@ -17,14 +17,17 @@ foreach (array_intersect($headers, array('Lease', 'Unit')) AS $k => $v) { foreach (array_intersect($headers, array('Balance')) AS $k => $v) { $column_class[$k] = 'currency'; } +foreach (array_intersect($headers, array('Comment')) AS $k => $v) { + $column_class[$k] = 'slack'; +} if (isset($paginator)) { echo $paginator->counter(array('format' => __('Page %page% of %pages%, showing %current% records (%start% - %end%) of %count% total', true))); $headers = array_merge(array($paginator->sort('Lease')), isset($leases[0]['Unit']) - ? $paginator->sort('Unit', 'Unit.id') - : $paginator->sort('Customer.id'), + ? array($paginator->sort('Unit', 'Unit.id')) + : array($paginator->sort('Customer.id')), array($paginator->sort('Signed', 'lease_date'), $paginator->sort('Move-In', 'movein_date'), $paginator->sort('Move-Out', 'moveout_date'), diff --git a/views/leases/index.ctp b/views/leases/index.ctp new file mode 100644 index 0000000..e003f18 --- /dev/null +++ b/views/leases/index.ctp @@ -0,0 +1,3 @@ +