git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@163 97e9348a-65ac-dc4b-aefc-98561f571b83
262 lines
8.2 KiB
PHP
262 lines
8.2 KiB
PHP
<?php
|
|
class Customer extends AppModel {
|
|
|
|
var $name = 'Customer';
|
|
var $validate = array(
|
|
'id' => array('numeric'),
|
|
'name' => array('notempty'),
|
|
);
|
|
|
|
var $belongsTo = array(
|
|
'Account',
|
|
'PrimaryContact' => array(
|
|
'className' => 'Contact',
|
|
),
|
|
);
|
|
|
|
var $hasMany = array(
|
|
'CurrentLease' => array(
|
|
'className' => 'Lease',
|
|
'conditions' => 'CurrentLease.close_date IS NULL',
|
|
),
|
|
'Lease',
|
|
'Transaction',
|
|
);
|
|
|
|
var $hasAndBelongsToMany = array(
|
|
'Contact',
|
|
);
|
|
|
|
|
|
/**************************************************************************
|
|
**************************************************************************
|
|
**************************************************************************
|
|
* function: accountId
|
|
* - Returns the account ID for the given customer
|
|
*/
|
|
function accountId($id) {
|
|
$this->cacheQueries = true;
|
|
$customer = $this->find('first',
|
|
array('contain' => false,
|
|
'fields' => array('account_id'),
|
|
'conditions' => array(array('Customer.id' => $id))));
|
|
$this->cacheQueries = false;
|
|
|
|
return $customer['Customer']['account_id'];
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
**************************************************************************
|
|
**************************************************************************
|
|
* function: leaseIds
|
|
* - Returns the lease IDs for the given customer
|
|
*/
|
|
function leaseIds($id) {
|
|
$this->cacheQueries = true;
|
|
$customer = $this->find('first',
|
|
array('contain' =>
|
|
array('Lease' => array('fields' => array('id'))),
|
|
'fields' => array(),
|
|
'conditions' => array(array('Customer.id' => $id))));
|
|
$this->cacheQueries = false;
|
|
|
|
$ids = array();
|
|
foreach ($customer['Lease'] AS $lease)
|
|
$ids[] = $lease['id'];
|
|
|
|
return $ids;
|
|
}
|
|
|
|
/**************************************************************************
|
|
**************************************************************************
|
|
**************************************************************************
|
|
* function: findSecurityDeposits
|
|
* - Returns an array of security deposit entries
|
|
*/
|
|
function findSecurityDeposits($id, $link = null) {
|
|
/* pr(array('function' => 'Customer::findSecurityDeposits', */
|
|
/* 'args' => compact('id', 'link'), */
|
|
/* )); */
|
|
|
|
$entries = $this->Account->findLedgerEntriesRelatedToAccount
|
|
($this->accountId($id),
|
|
$this->Account->securityDepositAccountID(),
|
|
true, null, $link);
|
|
|
|
foreach ($this->leaseIds($id) AS $lease_id) {
|
|
$ledger_entries = $this->Lease->findSecurityDeposits($lease_id, $link);
|
|
$this->statsMerge($entries['summary'], $ledger_entries['summary']);
|
|
$entries['Entries'] = array_merge($entries['Entries'],
|
|
$ledger_entries['Entries']);
|
|
}
|
|
|
|
/* pr(array('function' => 'Customer::findSecurityDeposits', */
|
|
/* 'args' => compact('id', 'link'), */
|
|
/* 'vars' => compact('customer'), */
|
|
/* 'return' => compact('entries'), */
|
|
/* )); */
|
|
|
|
return $entries;
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
**************************************************************************
|
|
**************************************************************************
|
|
* function: findUnreconciledLedgerEntries
|
|
* - Returns ledger entries that are not yet reconciled
|
|
* (such as charges not paid).
|
|
*/
|
|
|
|
function findUnreconciledLedgerEntries($id = null, $fundamental_type = null) {
|
|
|
|
$unreconciled = $this->Account->findUnreconciledLedgerEntries
|
|
($this->accountId($id), $fundamental_type);
|
|
|
|
foreach ($this->leaseIds($id) AS $lease_id) {
|
|
$unrec = $this->Lease->findUnreconciledLedgerEntries($lease_id,
|
|
$fundamental_type);
|
|
|
|
foreach (array_keys($unreconciled) AS $type) {
|
|
$left = &$unreconciled[$type];
|
|
$right = &$unrec[$type];
|
|
|
|
$left['entry'] = array_merge($left['entry'], $right['entry']);
|
|
$left['balance'] += $right['balance'];
|
|
}
|
|
}
|
|
|
|
return $unreconciled;
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
**************************************************************************
|
|
**************************************************************************
|
|
* function: reconcileNewLedgerEntry
|
|
* - Returns which ledger entries a new credit/debit would
|
|
* reconcile, and how much.
|
|
*
|
|
* - REVISIT <AP> 20090617
|
|
* This should be subject to different algorithms, such
|
|
* as apply to oldest charges first, newest first, to fees
|
|
* before rent, etc. Until we get there, I'll hardcode
|
|
* whatever algorithm is simplest.
|
|
*/
|
|
|
|
function reconcileNewLedgerEntry($id, $fundamental_type, $amount) {
|
|
|
|
$reconciled = $this->Account->reconcileNewLedgerEntry
|
|
($this->accountId($id), $fundamental_type, $amount);
|
|
|
|
foreach ($this->leaseIds($id) AS $lease_id) {
|
|
foreach (array_keys($reconciled) AS $type) {
|
|
$rec = $this->Lease->reconcileNewLedgerEntry($lease_id,
|
|
$fundamental_type,
|
|
$reconciled[$type]['unapplied']);
|
|
|
|
$left = &$reconciled[$type];
|
|
$right = &$rec[$type];
|
|
|
|
$left['entry'] = array_merge($left['entry'], $right['entry']);
|
|
$left['balance'] += $right['balance'];
|
|
$left['applied'] += $right['applied'];
|
|
$left['unapplied'] = $right['unapplied'];
|
|
}
|
|
}
|
|
|
|
return $reconciled;
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
**************************************************************************
|
|
**************************************************************************
|
|
* function: details
|
|
* - Returns detail information for the customer
|
|
*/
|
|
|
|
function details($id = null) {
|
|
// Query the DB for need information.
|
|
$customer = $this->find
|
|
('first', array
|
|
('contain' => array
|
|
(// Models
|
|
'Contact' =>
|
|
array(// Models
|
|
'ContactPhone',
|
|
'ContactEmail',
|
|
'ContactAddress',
|
|
),
|
|
'Account',
|
|
'Lease' =>
|
|
array('Unit' =>
|
|
array('order' => array('sort_order'),
|
|
'fields' => array('id', 'name'),
|
|
),
|
|
),
|
|
),
|
|
|
|
'conditions' => array('Customer.id' => $id),
|
|
));
|
|
|
|
// Add the lease balance to each lease.
|
|
foreach ($customer['Lease'] AS &$lease) {
|
|
$stats = $this->Lease->stats($lease['id']);
|
|
$lease['balance'] = $stats['Account']['Ledger']['balance'];
|
|
}
|
|
|
|
// Figure out the outstanding balance of the current lease.
|
|
$customer['stats'] = $this->stats($id);
|
|
|
|
// Figure out the total security deposit for the current lease.
|
|
$customer['deposits'] = $this->findSecurityDeposits($id);
|
|
|
|
// Add statistics into the customer account.
|
|
$customer['Account'] = array_merge($customer['Account'],
|
|
$customer['stats']['Account']['Ledger']);
|
|
|
|
return $customer;
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
**************************************************************************
|
|
**************************************************************************
|
|
* function: stats
|
|
* - Returns summary data from the requested customer.
|
|
*/
|
|
|
|
function stats($id = null) {
|
|
if (!$id)
|
|
return null;
|
|
|
|
// Get the basic information necessary
|
|
$customer = $this->find('first',
|
|
array('contain' =>
|
|
array('Account' => array
|
|
('fields' => array('Account.id')),
|
|
|
|
'Lease' => array
|
|
('fields' => array('Lease.id'))
|
|
),
|
|
'conditions' => array
|
|
(array('Customer.id' => $id))));
|
|
|
|
// Get stats from the customer account, and each lease
|
|
$stats['Account'] = $this->Account->stats($customer['Account']['id']);
|
|
foreach ($customer['Lease'] AS $lease) {
|
|
$this->statsMerge($stats['Lease'], $this->Lease->stats($lease['id']));
|
|
}
|
|
|
|
// Merge the stats from both the customer specific account, as
|
|
// well as the leases. This will provide current customer standing.
|
|
$this->statsMerge($stats, $stats['Account']['Ledger']);
|
|
$this->statsMerge($stats, $stats['Lease']['Account']['Ledger']);
|
|
|
|
return $stats;
|
|
}
|
|
|
|
}
|
|
?>
|