Compare commits

...

8 Commits

Author SHA1 Message Date
Abijah
8249ecc5cd Fixed defect found from visual inspection
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1037 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-03 03:05:03 +00:00
Abijah
f50db1a34b Added ability to get a customer's running balance. It's quite flaky, doesn't tolerate having a grid with sub-pages, is actually incorrect for at least some customers (not sure why), but it helps answer a fundamental question for most customers. If I had a better solution, I would surely go for it.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1036 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-02 18:26:01 +00:00
Abijah
f85481c7ec Removed the Quickbooks Invoice/Credits, since I created a line item in quickbooks for the credits and enter the whole thing in one shot.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1035 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 21:30:24 +00:00
Abijah
75c635a5ea Added customer ID to customer grid
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1034 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 02:09:40 +00:00
Abijah
4cc81c2ebc Added ability to re-open a lease
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1033 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 02:00:51 +00:00
Abijah
20df22a002 Changed sort order on the deposit slip, since date received is not useful to a bank teller.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1032 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 01:36:44 +00:00
Abijah
49a379d799 Changed column widths, spurred by the deposit slips not showing the item numbers fully, while giving too much room to Type
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1031 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 01:31:25 +00:00
Abijah
98d9849914 Merge in the hosted_migration_20130215 branch to the v0.3_work branch
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1030 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 01:24:21 +00:00
24 changed files with 237 additions and 124 deletions

View File

@@ -1,25 +1,20 @@
<IfModule mod_rewrite.c> <IfModule mod_rewrite.c>
RewriteEngine on RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L] RewriteRule ^$ webroot/ [L]
# Need this prevent a 400 error without trailing /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) webroot/$1 [L]
</IfModule> </IfModule>
# Lets deny everyone -- its a clean slate! # Need to make sure directories can't be listed, since the rewrite
order deny,allow # rule excludes rewriting when an actual directory is requested
deny from all Options -Indexes
# Now allow local access
# Localhost
# allow from 127.0.0
# Local subnet
# allow from 192.168.7
# Provide a mechanism for user authentication # Provide a mechanism for user authentication
AuthType Digest AuthType Basic
AuthName "Property Manager" AuthName "Valley Storage"
AuthUserFile "D:/Website/auth/pmgr.htpasswd" AuthUserFile "/home/perki2/valley_storage.pmgr.htpasswd"
Require valid-user Require valid-user
# Instead of satisfy all (too restrictive)
# This allows EITHER local domain OR authenticated user
satisfy any

View File

@@ -37,7 +37,7 @@
class AppController extends Controller { class AppController extends Controller {
var $uses = array('Option', 'Permission'); var $uses = array('Option', 'Permission');
var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid'); var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid');
var $components = array('DebugKit.Toolbar'); //var $components = array('DebugKit.Toolbar');
var $sidemenu = array('areas' => array('SITE' => false, 'REPORT' => false, 'CONTROLLER' => false, 'ACTION' => false, 'SANDBOX' => false)); var $sidemenu = array('areas' => array('SITE' => false, 'REPORT' => false, 'CONTROLLER' => false, 'ACTION' => false, 'SANDBOX' => false));
var $std_area = 10; var $std_area = 10;
@@ -272,25 +272,25 @@ class AppController extends Controller {
$this->addSideMenuLink('Unpaid Charges', $this->addSideMenuLink('Unpaid Charges',
array('controller' => 'statement_entries', 'action' => 'unpaid'), null, array('controller' => 'statement_entries', 'action' => 'unpaid'), null,
'REPORT'); 'REPORT');
$this->addSideMenuLink('Lease Up',
array('controller' => 'leases', 'action' => 'overview'), null,
'REPORT');
$this->addSideMenuLink('Unit Summary', $this->addSideMenuLink('Unit Summary',
array('controller' => 'units', 'action' => 'overview'), null, array('controller' => 'units', 'action' => 'overview'), null,
'REPORT'); 'REPORT');
$this->addSideMenuLink('Lease Up',
array('controller' => 'leases', 'action' => 'overview'), null,
'REPORT');
/* $this->addSideMenuLink('Monthly Income', */ /* $this->addSideMenuLink('Monthly Income', */
/* array('controller' => 'statement_entries', 'action' => 'incomebymonth'), null, */ /* array('controller' => 'statement_entries', 'action' => 'incomebymonth'), null, */
/* 'REPORT'); */ /* 'REPORT'); */
/* $this->addSideMenuLink('Monthly Expenses', */ /* $this->addSideMenuLink('Monthly Expenses', */
/* array('controller' => 'statement_entries', 'action' => 'expensebymonth'), null, */ /* array('controller' => 'statement_entries', 'action' => 'expensebymonth'), null, */
/* 'REPORT'); */ /* 'REPORT'); */
$this->addSideMenuLink('Quickbook Invoice', /* $this->addSideMenuLink('Quickbook Invoice', */
array('controller' => 'statement_entries', 'action' => 'incomebymonth', 4, 1), null, /* array('controller' => 'statement_entries', 'action' => 'incomebymonth', 4, 1), null, */
'REPORT'); /* 'REPORT'); */
$this->addSideMenuLink('Quickbook Credits', /* $this->addSideMenuLink('Quickbook Credits', */
array('controller' => 'statement_entries', 'action' => 'expensebymonth', 4, 0), null, /* array('controller' => 'statement_entries', 'action' => 'expensebymonth', 4, 0), null, */
'REPORT'); /* 'REPORT'); */
$this->addSideMenuLink('Monthly Net', $this->addSideMenuLink('Monthly Income',
array('controller' => 'statement_entries', 'action' => 'netbymonth'), null, array('controller' => 'statement_entries', 'action' => 'netbymonth'), null,
'REPORT'); 'REPORT');
} }
@@ -464,7 +464,8 @@ class AppController extends Controller {
App::import('Helper', 'Html'); App::import('Helper', 'Html');
$url = HtmlHelper::url($url, true); $url = HtmlHelper::url($url, true);
if (headers_sent()) { if (headers_sent() ||
($this->dev() && $this->Option->enabled('dev'))) {
// If we've already sent the headers, it's because // If we've already sent the headers, it's because
// we're debugging, and our debug output has gotten // we're debugging, and our debug output has gotten
// out before the redirect. That's probably a good // out before the redirect. That's probably a good
@@ -538,6 +539,9 @@ class AppController extends Controller {
// Retreive the appropriate subset of data // Retreive the appropriate subset of data
$records = $this->gridDataRecords($params, $model, $pagination); $records = $this->gridDataRecords($params, $model, $pagination);
// If subtotaling, figure out the running total before pagination...
$this->gridDataRecordsRunningSubtotal($params, $model, $pagination);
// Post process the records // Post process the records
$this->gridDataPostProcess($params, $model, $records); $this->gridDataPostProcess($params, $model, $records);
@@ -1034,6 +1038,53 @@ class AppController extends Controller {
return $model->find($type, $query); return $model->find($type, $query);
} }
function gridDataRecordsRunningSubtotal(&$params, $model, $pagination) {
// REVISIT <AP>: 20090722
// Horrible solution to something that should be done
// in SQL. Doesn't really work, but for a grid that contains
// ALL records, and is sorted on the correct field, it does
// actually work.
//
// If this function worked correctly, this mechanism would also
// work for grids that did not contain ALL records.
$subtotals = array();
foreach ($params['post']['fields'] AS $field) {
if (preg_match('/subtotal-(.*)$/', $field, $matches))
$subtotals[] = array('field' => $matches[1],
'name' => $field,
'amount' => 0);
}
// This part, if functioning, should do a sub-total off all records
// that are not part of the grid, instead of starting at zero, so that
// the totals come out correctly for the each record entry.
/* $pagination['start'] = $pagination['start'] + $pagination['limit']; */
/* $pagination['limit'] = 10000000; */
/* // Retreive the appropriate subset of data */
/* $params_copy = $params; */
/* $records = $this->gridDataRecords($params_copy, $model, $pagination); */
/* foreach ($records AS &$record) { */
/* foreach ($subtotals AS &$subtotal) { */
/* $field = $subtotal['field']; */
/* if (preg_match("/\./", $field)) { */
/* list($tbl, $col) = explode(".", $field); */
/* $record['subtotal-'.$tbl][$col] = */
/* ($subtotal['amount'] += $record[$tbl][$col]); */
/* } */
/* else { */
/* $record[$model->alias]['subtotal-'.$field] = */
/* ($subtotal['amount'] += $record[$model->alias][$field]); */
/* } */
/* } */
/* } */
$params['subtotals'] = $subtotals;
}
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
@@ -1084,15 +1135,11 @@ class AppController extends Controller {
// REVISIT <AP>: 20090722 // REVISIT <AP>: 20090722
// Horrible solution to something that should be done // Horrible solution to something that should be done
// in SQL. But, it works for now, so what the heck... // in SQL. Doesn't really work, but for a grid that contains
// ALL records, and is sorted on the correct field, it does
// actually work.
$subtotals = array(); $subtotals = $params['subtotals'];
foreach ($params['post']['fields'] AS $field) {
if (preg_match('/subtotal-(.*)$/', $field, $matches))
$subtotals[] = array('field' => $matches[1],
'name' => $field,
'amount' => 0);
}
foreach ($records AS &$record) { foreach ($records AS &$record) {
foreach ($subtotals AS &$subtotal) { foreach ($subtotals AS &$subtotal) {

View File

@@ -1,5 +0,0 @@
@echo off
mysqldump --user=pmgr --password=pmgruser --opt property_manager > H:\pmgr_dev.sql
mysql --user=pmgr --password=pmgruser --database=pmgr_dev < H:\pmgr_dev.sql
del H:\pmgr_dev.sql
echo Build Complete!

View File

@@ -1,5 +0,0 @@
@echo off
mysqldump --user=pmgr --password=pmgruser --opt property_manager > H:\pmgr_sand.sql
mysql --user=pmgr --password=pmgruser --database=pmgr_sand < H:\pmgr_sand.sql
del H:\pmgr_sand.sql
echo Build Complete!

View File

@@ -5,17 +5,17 @@ class DATABASE_CONFIG {
'driver' => 'mysql', 'driver' => 'mysql',
'persistent' => false, 'persistent' => false,
'host' => 'localhost', 'host' => 'localhost',
'login' => 'pmgr', 'login' => 'perki2_pmgruser',
'password' => 'pmgruser', 'password' => 'pmgrauth',
'database' => 'property_manager', 'database' => 'perki2_pmgr',
'prefix' => 'pmgr_', 'prefix' => '',
); );
function __construct() { function __construct() {
if (devbox()) if (devbox())
$this->default['database'] = 'pmgr_dev'; $this->default['database'] = 'perki2_pmgr_dev';
if (sandbox()) if (sandbox())
$this->default['database'] = 'pmgr_sand'; $this->default['database'] = 'perki2_pmgr_sand';
} }
} }
?> ?>

View File

@@ -334,15 +334,6 @@ class LeasesController extends AppController {
* - Closes a lease to any further action * - Closes a lease to any further action
*/ */
// REVISIT <AP>: 20090809
// While cleaning up the sitelink data, then delete reldep()
function reldep($id) {
$this->Lease->id = $id;
$stamp = $this->Lease->field('moveout_date');
$this->Lease->releaseSecurityDeposits($id, $stamp);
$this->redirect(array('action'=>'view', $id));
}
function close($id) { function close($id) {
// REVISIT <AP>: 20090708 // REVISIT <AP>: 20090708
// We should probably seek confirmation first... // We should probably seek confirmation first...
@@ -355,6 +346,21 @@ class LeasesController extends AppController {
$this->redirect(array('action'=>'view', $id)); $this->redirect(array('action'=>'view', $id));
} }
/**************************************************************************
**************************************************************************
**************************************************************************
* action: open
* - Re-opens a lease for further action
*/
function open($id) {
// REVISIT <AP>: 20131204
// We should probably seek confirmation first, since this wipes out
// the old close date, with no way to restore that date.
$this->Lease->reopen($id);
$this->redirect(array('action'=>'view', $id));
}
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
@@ -574,13 +580,18 @@ class LeasesController extends AppController {
$this->addSideMenuLink('Write-Off', $this->addSideMenuLink('Write-Off',
array('action' => 'bad_debt', $id), null, array('action' => 'bad_debt', $id), null,
'ACTION'); 'ACTION');
if ($this->Lease->closeable($id))
$this->addSideMenuLink('Close',
array('action' => 'close', $id), null,
'ACTION');
} }
if ($this->Lease->closeable($id))
$this->addSideMenuLink('Close',
array('action' => 'close', $id), null,
'ACTION');
if ($this->Lease->isClosed($id))
$this->addSideMenuLink('Re-Open',
array('action' => 'open', $id), null,
'ACTION');
// Prepare to render // Prepare to render
$title = 'Lease: #' . $lease['Lease']['id']; $title = 'Lease: #' . $lease['Lease']['id'];
$this->set(compact('lease', 'title', $this->set(compact('lease', 'title',

View File

@@ -297,7 +297,7 @@ class StatementEntriesController extends AppController {
'conditions' => array('LedgerEntry.account_id' => $this->StatementEntry->Account->securityDepositAccountID(), 'conditions' => array('LedgerEntry.account_id' => $this->StatementEntry->Account->securityDepositAccountID(),
"effective_date >= $datefrom", "effective_date >= $datefrom",
"effective_date <= $dateto", "effective_date <= $dateto",
'StatementEntry.id = (SELECT MIN(id) FROM pmgr_statement_entries WHERE transaction_id = `Transaction`.id)' 'StatementEntry.id = (SELECT MIN(id) FROM statement_entries WHERE transaction_id = `Transaction`.id)'
), ),
'group' => array('YEAR(effective_date)', 'MONTH(effective_date)', 'Account.id'), 'group' => array('YEAR(effective_date)', 'MONTH(effective_date)', 'Account.id'),
'order' => array('YEAR(effective_date) DESC', 'MONTH(effective_date) DESC', 'Account.type', 'Account.name'), 'order' => array('YEAR(effective_date) DESC', 'MONTH(effective_date) DESC', 'Account.type', 'Account.name'),

View File

@@ -93,7 +93,8 @@ class TransactionsController extends AppController {
$fields[] = ("IF(Transaction.type = 'DEPOSIT'," . $fields[] = ("IF(Transaction.type = 'DEPOSIT'," .
" COUNT(DepositTender.id)," . " COUNT(DepositTender.id)," .
" COUNT(StatementEntry.id)) AS entries"); " COUNT(StatementEntry.id)) AS entries");
return $fields; return array_merge($fields,
$this->Transaction->LedgerEntry->debitCreditFields(false, true, 'Transaction'));
} }
function gridDataConditions(&$params, &$model) { function gridDataConditions(&$params, &$model) {
@@ -503,8 +504,8 @@ class TransactionsController extends AppController {
foreach ($deposit['types'] AS $type) foreach ($deposit['types'] AS $type)
$deposit_total += $type['total']; $deposit_total += $type['total'];
if ($deposit['Transaction']['amount'] != $deposit_total) if (abs($deposit['Transaction']['amount'] - $deposit_total) >= .001)
$this->INTERNAL_ERROR("Deposit items do not add up to deposit slip total"); $this->INTERNAL_ERROR("Deposit items ($deposit_total) do not add up to deposit slip total (".$deposit['Transaction']['amount'].")");
$this->addSideMenuLink('View', $this->addSideMenuLink('View',
array('action' => 'view', $id), null, array('action' => 'view', $id), null,

View File

@@ -91,8 +91,8 @@ class UnitSizesController extends AppController {
$fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionUnavailable() . ', 1, 0)) AS unavailable'; $fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionUnavailable() . ', 1, 0)) AS unavailable';
$fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionAvailable() . ', 1, 0)) AS available'; $fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionAvailable() . ', 1, 0)) AS available';
$fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 1, 0)) AS occupied'; $fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 1, 0)) AS occupied';
$fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 0, 1)) / COUNT(unit.id) AS vacancy'; $fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 0, 1)) / COUNT(Unit.id) AS vacancy';
$fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 1, 0)) / COUNT(unit.id) AS occupancy'; $fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 1, 0)) / COUNT(Unit.id) AS occupancy';
return $fields; return $fields;
} }

View File

@@ -4,31 +4,6 @@ class UtilController extends AppController {
var $uses = array(); var $uses = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* function: reset_data
* - Development function. TO BE DELETED
*/
function reset_data() {
$this->layout = null;
$this->autoLayout = false;
$this->autoRender = false;
Configure::write('debug', '0');
$script = $_SERVER['DOCUMENT_ROOT'] . '/pmgr/build.cmd';
echo "<P>" . date('r') . "\n";
//echo "<P>Script: $script" . "\n";
$handle = popen($script . ' 2>&1', 'r');
//echo "<P>Handle: $handle; " . gettype($handle) . "\n";
echo "<P><PRE>\n";
while (($read = fread($handle, 2096))) {
echo $read;
}
echo "</PRE>\n";
pclose($handle);
}
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
************************************************************************** **************************************************************************
@@ -40,21 +15,20 @@ class UtilController extends AppController {
$this->autoLayout = false; $this->autoLayout = false;
$this->autoRender = false; $this->autoRender = false;
Configure::write('debug', '0'); Configure::write('debug', '0');
$script = preg_replace('%/webroot/index.php$%',
'/build_'.$type.'box.cmd',
$_SERVER['SCRIPT_FILENAME']);
// REVISIT <AP>: 20090828 $usrpass = '--user=perki2_pmgruser --password=pmgrauth';
// Just use system call $boxdb = 'perki2_pmgr_' . $type;
$handle = popen($script . ' 2>&1', 'r');
$handle = popen("mysqldump $usrpass --opt perki2_pmgr" .
" | mysql $usrpass --database=$boxdb", 'r');
while (($read = fread($handle, 2096))) { while (($read = fread($handle, 2096))) {
// Do nothing // Do nothing
} }
pclose($handle); pclose($handle);
$url = $_SERVER['HTTP_REFERER']; $url = $_SERVER['HTTP_REFERER'];
if (empty($url)) if (empty($url) || $url == 'undefined')
$url = "/"; $url = "/$type";
$this->redirect($url); $this->redirect($url);
} }

View File

@@ -91,7 +91,7 @@ class Contact extends AppModel {
// If the user has entered all new data, we need to // If the user has entered all new data, we need to
// save that as a brand new entry. // save that as a brand new entry.
if (!isset($item['id'])) { if (!isset($item['id']) || $item['source'] == 'new') {
$I = new $class(); $I = new $class();
$I->create(); $I->create();
if (!$I->save($item, false)) { if (!$I->save($item, false)) {

View File

@@ -728,6 +728,53 @@ class Lease extends AppModel {
} }
/**************************************************************************
**************************************************************************
**************************************************************************
* function: reopen
* - Re-Opens the lease for further action
*/
function reopen($id) {
$this->prEnter(compact('id'));
if (!$this->isClosed($id))
return $this->prReturn(false);
// Reset the data
$this->create();
$this->id = $id;
// Set the close date
$this->data['Lease']['close_date'] = null;
// Save it!
$this->save($this->data, false);
// Update the current lease count for the customer
$this->Customer->updateLeaseCount($this->field('customer_id'));
return $this->prReturn(true);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: isClosed
* - Checks to see if the lease is closed
*/
function isClosed($id) {
$this->prEnter(compact('id'));
$this->recursive = -1;
$this->read(null, $id);
return $this->prReturn(!empty($this->data['Lease']['close_date']));
}
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
************************************************************************** **************************************************************************

View File

@@ -163,7 +163,7 @@ class ToolbarComponent extends Object {
trigger_error(sprintf(__('Could not load DebugToolbar panel %s', true), $panel), E_USER_WARNING); trigger_error(sprintf(__('Could not load DebugToolbar panel %s', true), $panel), E_USER_WARNING);
continue; continue;
} }
$panelObj =& new $className(); $panelObj = new $className();
if (is_subclass_of($panelObj, 'DebugPanel') || is_subclass_of($panelObj, 'debugpanel')) { if (is_subclass_of($panelObj, 'DebugPanel') || is_subclass_of($panelObj, 'debugpanel')) {
$this->panels[$panel] =& $panelObj; $this->panels[$panel] =& $panelObj;
} }
@@ -456,7 +456,7 @@ class LogPanel extends DebugPanel {
* @return array * @return array
*/ */
function _parseFile($filename) { function _parseFile($filename) {
$file =& new File($filename); $file = new File($filename);
$contents = $file->read(); $contents = $file->read();
$timePattern = '/(\d{4}-\d{2}\-\d{2}\s\d{1,2}\:\d{1,2}\:\d{1,2})/'; $timePattern = '/(\d{4}-\d{2}\-\d{2}\s\d{1,2}\:\d{1,2}\:\d{1,2})/';
$chunks = preg_split($timePattern, $contents, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); $chunks = preg_split($timePattern, $contents, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

View File

@@ -30,14 +30,14 @@ $timers = DebugKitDebugger::getTimers();
?> ?>
<h2><?php __('Timers'); ?></h2> <h2><?php __('Timers'); ?></h2>
<p class="request-time"> <p class="request-time">
<?php $totalTime = sprintf(__('%s (seconds)', true), $number->precision(DebugKitDebugger::requestTime(), 6)); ?> <?php $totalTime = sprintf(__('%.6s (seconds)', true), DebugKitDebugger::requestTime()); ?>
<?php echo $toolbar->message(__('Total Request Time:', true), $totalTime)?> <?php echo $toolbar->message(__('Total Request Time:', true), $totalTime)?>
</p> </p>
<?php foreach ($timers as $timerName => $timeInfo): <?php foreach ($timers as $timerName => $timeInfo):
$rows[] = array( $rows[] = array(
$timeInfo['message'], $timeInfo['message'],
$number->precision($timeInfo['time'], 6) sprintf(__('%.6s', true), $timeInfo['time'])
); );
$headers = array(__('Message', true), __('time in seconds', true)); $headers = array(__('Message', true), __('time in seconds', true));
endforeach; endforeach;

View File

@@ -0,0 +1,9 @@
abijah:Property Manager:a2369e3cc9e231ea6f02ce799a8b9970
anja:Property Manager:4539d5a6e58dd5895f2f3891d29705b0
kevin:Property Manager:f01accc9f5e5cdfc028dcf0cca837cf1
adam:Property Manager:ae6835569bb2fc0a0a4a773580ac8cda
shirley:Property Manager:e7e9d674c700796c99cdbf3cf105e739
admin:Property Manager:bab2226685d9b4b66220db8df80f1822
dev:Property Manager:e5c27b3c025e47239a45daceea2c0a00
vasst:Property Manager:523abc6c2b8458b463d5a9baa4f58f2e
answerfirst:Property Manager:6ac128447fab8be985c74ba7539c39b3

View File

@@ -68,7 +68,7 @@ function contactMethodDiv($obj, $type, $legend, $values = null) {
'</DIV>' . "\n" . '</DIV>' . "\n" .
// BEGIN method-div // BEGIN method-div
'<div id="'.$type.'-%{id}-method-div"' . "\n" . '<div id="'.$type.'-%{id}-method-div"' . '>' . "\n" .
$obj->element $obj->element
('form_table', ('form_table',
@@ -131,14 +131,18 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
elseif ($stype === 'new') { elseif ($stype === 'new') {
$fields = array $fields = array
('type' => array('label_attributes' => array('class' => 'required'), ('type' => array('label_attributes' => array('class' => 'required'),
'opts' => array('options' => $obj->varstore['phoneTypes']), 'opts' => array('autocomplete' => 'off',
'options' => $obj->varstore['phoneTypes']),
'after' => "Physical type of the phone."), 'after' => "Physical type of the phone."),
'phone' => array('label_attributes' => array('class' => 'required empty'), 'phone' => array('label_attributes' => array('class' => 'required empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Required: Phone number."), 'after' => "Required: Phone number."),
'ext' => array('name' => "Extension", 'ext' => array('name' => "Extension",
'label_attributes' => array('class' => 'optional empty'), 'label_attributes' => array('class' => 'optional empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Optional: Extension number."), 'after' => "Optional: Extension number."),
'comment' => array('label_attributes' => array('class' => 'optional empty'), 'comment' => array('label_attributes' => array('class' => 'optional empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Optional: Comments about this phone number."), 'after' => "Optional: Comments about this phone number."),
); );
} }
@@ -167,17 +171,23 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
elseif ($stype === 'new') { elseif ($stype === 'new') {
$fields = array $fields = array
('address' => array('label_attributes' => array('class' => 'required empty'), ('address' => array('label_attributes' => array('class' => 'required empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Required: First line of mailing address."), 'after' => "Required: First line of mailing address."),
'city' => array('label_attributes' => array('class' => 'required empty'), 'city' => array('label_attributes' => array('class' => 'required empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Required."), 'after' => "Required."),
'state' => array('label_attributes' => array('class' => 'required empty'), 'state' => array('label_attributes' => array('class' => 'required empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Required."), 'after' => "Required."),
'postcode' => array('name' => 'Zip Code', 'postcode' => array('name' => 'Zip Code',
'label_attributes' => array('class' => 'required empty'), 'label_attributes' => array('class' => 'required empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Required."), 'after' => "Required."),
'country' => array('label_attributes' => array('class' => 'optional empty'), 'country' => array('label_attributes' => array('class' => 'optional empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Optional: USA is presumed."), 'after' => "Optional: USA is presumed."),
'comment' => array('label_attributes' => array('class' => 'optional empty'), 'comment' => array('label_attributes' => array('class' => 'optional empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Optional: Comments about this mailing address."), 'after' => "Optional: Comments about this mailing address."),
); );
} }
@@ -208,8 +218,10 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
elseif ($stype === 'new') { elseif ($stype === 'new') {
$fields = array $fields = array
('email' => array('label_attributes' => array('class' => 'required empty'), ('email' => array('label_attributes' => array('class' => 'required empty'),
'after' => "Required: E-mail address."), 'opts' => array('autocomplete' => 'off'),
'after' => "Required: E-mail address."),
'comment' => array('label_attributes' => array('class' => 'optional empty'), 'comment' => array('label_attributes' => array('class' => 'optional empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Optional: Comments about this email address."), 'after' => "Optional: Comments about this email address."),
); );
} }

View File

@@ -157,13 +157,14 @@ echo $this->element('contacts', array
/********************************************************************** /**********************************************************************
* Customer Account History * Customer Statement History
*/ */
echo $this->element('statement_entries', array echo $this->element('statement_entries', array
(// Grid configuration (// Grid configuration
'config' => array 'config' => array
('caption' => 'Customer Statement', ('caption' => 'Customer Statement',
'grid_setup' => array('hiddengrid' => true),
'filter' => array('Customer.id' => $customer['Customer']['id'], 'filter' => array('Customer.id' => $customer['Customer']['id'],
'type !=' => 'VOID'), 'type !=' => 'VOID'),
//'include' => array('Sub-Total'), //'include' => array('Sub-Total'),
@@ -171,6 +172,28 @@ echo $this->element('statement_entries', array
))); )));
/**********************************************************************
* Customer Transaction History
*/
echo $this->element('transactions', array
(// Grid configuration
'config' => array
('caption' => 'Balance History',
'limit' => 10000,
'limitOptions' => array('10000'),
'sort_column' => 'Timestamp',
'sort_order' => 'ASC',
'grid_setup' => array('hiddengrid' => true),
'filter' => array('Customer.id' => $customer['Customer']['id']),
'include' => array('Comment', 'PosNeg', 'Balance'),
'exclude' => array('Amount', 'Entries'),
'remap' => array(//'ID' => 'Invoice',
'PosNeg' => 'Amount',
//'Entries' => 'Charges',
),
)));
/* End "detail supporting" div */ /* End "detail supporting" div */
echo '</div>' . "\n"; echo '</div>' . "\n";

View File

@@ -2,6 +2,7 @@
// Define the table columns // Define the table columns
$cols = array(); $cols = array();
$cols['Customer'] = array('index' => 'Customer.id', 'formatter' => 'id');
$cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum'); $cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum');
$cols['Name'] = array('index' => 'Customer.name', 'formatter' => 'longname'); $cols['Name'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Last Name'] = array('index' => 'PrimaryContact.last_name', 'formatter' => 'name'); $cols['Last Name'] = array('index' => 'PrimaryContact.last_name', 'formatter' => 'name');

View File

@@ -113,7 +113,7 @@ foreach ($fields AS $field => $config) {
if (isset($config['with_value_after'])) if (isset($config['with_value_after']))
$value = $value . $config['with_value_after']; $value = $value . $config['with_value_after'];
elseif (isset($with_value_after)) elseif (isset($with_value_after))
$value = $valeu . $with_value_after; $value = $value . $with_value_after;
$cells[] = $value; $cells[] = $value;
if ($include_after) { if ($include_after) {

View File

@@ -130,12 +130,12 @@ foreach ($jqGridColumns AS $header => &$col) {
elseif ($col['formatter'] === 'currency') { elseif ($col['formatter'] === 'currency') {
// Use our custom formatting for currency // Use our custom formatting for currency
$col['formatter'] = array('--special' => 'currencyFormatter'); $col['formatter'] = array('--special' => 'currencyFormatter');
$default['width'] = 85; $default['width'] = 65;
$default['align'] = 'right'; $default['align'] = 'right';
} }
elseif ($col['formatter'] === 'date') { elseif ($col['formatter'] === 'date') {
$default['formatoptions'] = array('newformat' => 'm/d/Y'); $default['formatoptions'] = array('newformat' => 'm/d/Y');
$default['width'] = 95; $default['width'] = 90;
$default['align'] = 'center'; $default['align'] = 'center';
} }
elseif (preg_match("/^(long|short)?name$/", elseif (preg_match("/^(long|short)?name$/",

View File

@@ -5,7 +5,7 @@ $cols = array();
$cols['Date'] = array('index' => 'Transaction.stamp', 'formatter' => 'date'); $cols['Date'] = array('index' => 'Transaction.stamp', 'formatter' => 'date');
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname'); $cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Item'] = array('index' => 'Tender.name', 'formatter' => 'longname'); $cols['Item'] = array('index' => 'Tender.name', 'formatter' => 'longname');
$cols['Type'] = array('index' => 'TenderType.name', 'formatter' => 'name'); $cols['Type'] = array('index' => 'TenderType.name', 'formatter' => 'shortname');
$cols['Comment'] = array('index' => 'Tender.comment', 'formatter' => 'comment'); $cols['Comment'] = array('index' => 'Tender.comment', 'formatter' => 'comment');
$cols['Amount'] = array('index' => 'LedgerEntry.amount', 'formatter' => 'currency'); $cols['Amount'] = array('index' => 'LedgerEntry.amount', 'formatter' => 'currency');
$cols['Sub-Total'] = array('index' => 'subtotal-LedgerEntry.amount', 'formatter' => 'currency'); $cols['Sub-Total'] = array('index' => 'subtotal-LedgerEntry.amount', 'formatter' => 'currency');

View File

@@ -11,9 +11,11 @@ $cols['ID'] = array('index' => 'Transaction.id', 'formatter' =
$cols['Type'] = array('index' => 'Transaction.type', 'formatter' => 'enum'); $cols['Type'] = array('index' => 'Transaction.type', 'formatter' => 'enum');
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname'); $cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Timestamp'] = array('index' => 'Transaction.stamp', 'formatter' => 'date'); $cols['Timestamp'] = array('index' => 'Transaction.stamp', 'formatter' => 'date');
$cols['Comment'] = array('index' => 'Transaction.comment', 'formatter' => 'comment', 'sortable' => false);
$cols['Entries'] = array('index' => 'entries', 'formatter' => 'number'); $cols['Entries'] = array('index' => 'entries', 'formatter' => 'number');
$cols['Amount'] = array('index' => 'Transaction.amount', 'formatter' => 'currency'); $cols['Amount'] = array('index' => 'Transaction.amount', 'formatter' => 'currency');
$cols['Comment'] = array('index' => 'Transaction.comment', 'formatter' => 'comment'); $cols['PosNeg'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Balance'] = array('index' => 'subtotal-balance', 'formatter' => 'currency', 'sortable' => false);
// Render the grid // Render the grid
$grid $grid
@@ -22,4 +24,4 @@ $grid
->defaultFields(array('ID', 'Timestamp')) ->defaultFields(array('ID', 'Timestamp'))
->searchFields(array('Type', 'Comment')) ->searchFields(array('Type', 'Comment'))
->render($this, isset($config) ? $config : null, ->render($this, isset($config) ? $config : null,
array_merge($include, array_diff(array_keys($cols), array('Customer', 'Comment')))); array_merge($include, array_diff(array_keys($cols), array('Customer', 'PosNeg', 'Balance', 'Comment'))));

View File

@@ -64,6 +64,7 @@ else {
'config' => array 'config' => array
( (
'caption' => 'Deposited Items', 'caption' => 'Deposited Items',
'sort_column' => 'Item',
'filter' => array('deposit_transaction_id' 'filter' => array('deposit_transaction_id'
=> $deposit['Transaction']['id'], => $deposit['Transaction']['id'],
), ),

View File

@@ -55,7 +55,7 @@
* *
*/ */
if (!defined('CAKE_CORE_INCLUDE_PATH')) { if (!defined('CAKE_CORE_INCLUDE_PATH')) {
define('CAKE_CORE_INCLUDE_PATH', 'D:\Website\localhost\CakePHP'); define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . APP_DIR . DS . 'CakePHP');
} }
/** /**