Merge in from pre_0.1 branch

git-svn-id: file:///svn-source/pmgr/trunk/site@847 97e9348a-65ac-dc4b-aefc-98561f571b83
This commit is contained in:
abijah
2009-09-15 02:38:28 +00:00
parent 7b3707ef89
commit cc12d5ff93
128 changed files with 4126 additions and 1330 deletions

View File

@@ -3,3 +3,23 @@
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>
# Lets deny everyone -- its a clean slate!
order deny,allow
deny from all
# Now allow local access
# Localhost
# allow from 127.0.0
# Local subnet
# allow from 192.168.7
# Provide a mechanism for user authentication
AuthType Digest
AuthName "Property Manager"
AuthUserFile "D:/Website/auth/pmgr.htpasswd"
Require valid-user
# Instead of satisfy all (too restrictive)
# This allows EITHER local domain OR authenticated user
satisfy any

View File

@@ -35,16 +35,312 @@
* @subpackage cake.app
*/
class AppController extends Controller {
var $uses = array('Option', 'Permission');
var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid');
var $components = array('DebugKit.Toolbar');
var $sidemenu = array('areas' => array('SITE' => false, 'CONTROLLER' => false, 'ACTION' => false, 'SANDBOX' => false));
var $std_area = 10;
var $admin_area = 20;
var $dev_area = 30;
var $op_area = 40;
var $new_area = 50;
function __construct() {
$this->params['dev'] = false;
$this->params['admin'] = false;
parent::__construct();
}
function sideMenuLinks() {
/**************************************************************************
**************************************************************************
**************************************************************************
* function: sideMenuAreaVerify
* - Verifies the validity of the sidemenu area/subarea/priority,
* and ensures the class member is set to appropriately handle it.
*/
function sideMenuAreaVerify(&$area, $subarea, $priority = null) {
$area = strtoupper($area);
if (!array_key_exists($area, $this->sidemenu['areas']))
$this->INTERNAL_ERROR("Sidemenu link '{$area}': Unknown");
if ($area == 'SITE')
$name = 'Navigation';
elseif ($area == 'CONTROLLER')
$name = Inflector::humanize($this->params['controller']);
elseif ($area == 'ACTION')
$name = Inflector::humanize(Inflector::singularize($this->params['controller']));
elseif ($area == 'SANDBOX')
$name = 'Sandbox';
if (empty($this->sidemenu['areas'][$area]))
$this->sidemenu['areas'][$area]
= array('enable' => true, 'name' => $name, 'subareas' => array());
if (empty($subarea))
return;
$subname = $name;
if ($subarea == $this->std_area)
$subname .= '';
elseif ($subarea == $this->op_area)
//$subname .= '-Ops';
$subname = 'Actions';
elseif ($subarea == $this->new_area)
//$subname .= '-New';
$subname = 'Creation';
elseif ($subarea == $this->admin_area)
$subname .= '-Admin';
elseif ($subarea == $this->dev_area)
$subname .= '-Dev';
else
$subname .= '-' . $subarea;
if (empty($this->sidemenu['areas'][$area]['subareas'][$subarea]))
$this->sidemenu['areas'][$area]['subareas'][$subarea]
= array('enable' => true, 'name' => $subname, 'priorities' => array());
if (empty($priority))
return;
if (empty($this->sidemenu['areas'][$area]['subareas'][$subarea]['priorities'][$priority]))
$this->sidemenu['areas'][$area]['subareas'][$subarea]['priorities'][$priority]
= array();
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: sideMenuAreaName
* - Sets the name of the sidemenu area/subarea
*/
function sideMenuAreaName($name, $area, $subarea = null) {
$this->sideMenuAreaVerify($area, $subarea);
if (empty($subarea))
$this->sidemenu['areas'][$area]['name'] = $name;
else
$this->sidemenu['areas'][$area]['subareas'][$subarea]['name'] = $name;
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: sideMenuAreaActivate
* - Sets the selected area/subarea to be active when the
* page is first loaded.
*/
function sideMenuAreaActivate($area, $subarea = null) {
$this->sidemenu['active'] = compact('area', 'subarea');
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: sideMenuEnable
* - Enables/Disables an area or subarea of the sidemenu
*/
function sideMenuEnable($area, $subarea = null, $enable = true) {
$this->sideMenuAreaVerify($area, $subarea);
if (isset($subarea))
$this->sidemenu['areas'][$area]['subareas'][$subarea]['enable'] = $enable;
else
$this->sidemenu['areas'][$area]['enable'] = $enable;
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addSideMenuLink
* - Adds another link to the sidemenu area/subarea/priority
*/
function addSideMenuLink($name, $url, $extra, $area, $subarea = null, $priority = 10) {
if (empty($subarea))
$subarea = $this->std_area;
$this->sideMenuAreaVerify($area, $subarea);
$this->sidemenu['areas'][$area]['subareas'][$subarea]['priorities'][$priority][]
= array('name' => $name, 'url' => $url) + (empty($extra) ? array() : $extra);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addDefaultSideMenuLinks
* - Adds the standard links present on all generated pages
*/
function addDefaultSideMenuLinks() {
$this->addSideMenuLink('Site Map',
array('controller' => 'maps', 'action' => 'view', 1), null,
'SITE');
$this->addSideMenuLink('Unit Sizes',
array('controller' => 'unit_sizes', 'action' => 'index'), null,
'SITE');
$this->addSideMenuLink('Units',
array('controller' => 'units', 'action' => 'index'), null,
'SITE');
$this->addSideMenuLink('Leases',
array('controller' => 'leases', 'action' => 'index'), null,
'SITE');
$this->addSideMenuLink('Customers',
array('controller' => 'customers', 'action' => 'index'), null,
'SITE');
$this->addSideMenuLink('Deposits',
array('controller' => 'transactions', 'action' => 'deposit'), null,
'SITE');
$this->addSideMenuLink('Accounts',
array('controller' => 'accounts', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Contacts',
array('controller' => 'contacts', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Ledgers',
array('controller' => 'ledgers', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Tenders',
array('controller' => 'tenders', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Transactions',
array('controller' => 'transactions', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Ldgr Entries',
array('controller' => 'ledger_entries', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Stmt Entries',
array('controller' => 'statement_entries', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Un-Nuke',
'#', array('htmlAttributes' =>
array('onclick' => '$(".pr-section").show(); return false;')),
'SITE', $this->dev_area);
$this->addSideMenuLink('New Ledgers',
array('controller' => 'accounts', 'action' => 'newledger'), null,
'SITE', $this->dev_area);
//array('name' => 'RESET DATA', array('controller' => 'accounts', 'action' => 'reset_data'));
$this->addSideMenuLink('New Receipt',
array('controller' => 'customers', 'action' => 'receipt'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('New Invoice',
array('controller' => 'leases', 'action' => 'invoice'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('Move-In',
array('controller' => 'customers', 'action' => 'move_in'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('Move-Out',
array('controller' => 'leases', 'action' => 'move_out'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('New Deposit',
array('controller' => 'tenders', 'action' => 'deposit'), null,
'SITE', $this->op_area);
if (!empty($this->params['admin']))
$this->addSideMenuLink('Assess Charges',
array('controller' => 'leases', 'action' => 'assess_all'), null,
'SITE', $this->op_area);
$url_components = array('plugin', 'controller', 'action', 'named');
if (devbox()) {
/* $sources = ConnectionManager::sourceList(); */
/* $db = ConnectionManager::getDataSource($sources[0])->config['database']; */
/* $this->sideMenuAreaName($db, 'SANDBOX', $this->std_area); */
$this->sideMenuAreaName('DevBox', 'SANDBOX', $this->std_area);
$this->addSideMenuLink('Rebuild DevBox',
array('controller' => 'util', 'action' => 'rebuild_devbox'), null,
'SANDBOX');
}
elseif (sandbox()) {
$this->addSideMenuLink('Rebuild Sandbox',
array('controller' => 'util', 'action' => 'rebuild_sandbox'), null,
'SANDBOX');
$this->addSideMenuLink('Leave Sandbox',
array('sand_route' => false)
+ array_intersect_key($this->params, array_flip($url_components))
+ $this->params['pass'],
null, 'SANDBOX');
}
else {
$this->addSideMenuLink('Enter Sandbox',
array('sand_route' => true)
+ array_intersect_key($this->params, array_flip($url_components))
+ $this->params['pass'],
null, 'SANDBOX');
}
// REVISIT <AP>: 20090824
// Depending on preference, we may put this into the gridView
// function, making the links available only when navigating.
$this->addGridViewSideMenuLinks();
}
/**************************************************************************
**************************************************************************
**************************************************************************
* virtual: addGridViewSideMenuLinks
* - Adds the grid view specific navigation links, if overridden.
*/
function addGridViewSideMenuLinks() {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* hook: beforeFilter
* - Called just before the action function
*/
function beforeFilter() {
$this->params['user'] = $this->Permission->User->currentUser();
$this->params['admin'] = $this->Option->enabled('admin');
$this->params['dev'] = devbox();
if ($this->params['dev'] && !$this->Option->enabled('dev'))
$this->redirect("/");
if (!$this->params['dev'])
Configure::write('debug', '0');
$this->addDefaultSideMenuLinks();
//$this->sideMenuEnable('SITE', $this->op_area, false);
foreach ($this->sidemenu['areas'] AS $area_name => $area) {
if (empty($this->params['dev']))
$this->sideMenuEnable($area_name, $this->dev_area, false);
if (empty($this->params['admin']))
$this->sideMenuEnable($area_name, $this->admin_area, false);
}
$this->authorize("controller.{$this->params['controller']}");
$this->authorize("action.{$this->params['controller']}.{$this->params['action']}");
$this->log('----------------------------------------------------------------------', 'request');
$this->log('----------------------------------------------------------------------', 'request');
$this->log($this->params, 'request');
}
/**************************************************************************
**************************************************************************
**************************************************************************
* hook: beforeRender
* - Called just before rendering the page
*/
function beforeRender() {
// Stupid Cake... our constructor sets admin/dev,
// but cake stomps it somewhere along the way
// after constructing the CakeError controller.
@@ -53,51 +349,56 @@ class AppController extends Controller {
$this->params['admin'] = false;
}
$menu = array();
$menu[] = array('name' => 'Common', 'header' => true);
$menu[] = array('name' => 'Site Map', 'url' => array('controller' => 'maps', 'action' => 'view', 1));
$menu[] = array('name' => 'Units', 'url' => array('controller' => 'units', 'action' => 'index'));
$menu[] = array('name' => 'Leases', 'url' => array('controller' => 'leases', 'action' => 'index'));
$menu[] = array('name' => 'Customers', 'url' => array('controller' => 'customers', 'action' => 'index'));
$menu[] = array('name' => 'Deposits', 'url' => array('controller' => 'transactions', 'action' => 'deposit'));
foreach ($this->sidemenu['areas'] AS $aname => &$area) {
if (empty($area['enable']))
$area = array();
if (empty($area['subareas']))
continue;
ksort($area['subareas']);
if ($this->params['admin']) {
$menu[] = array('name' => 'Admin', 'header' => true);
$menu[] = array('name' => 'Accounts', 'url' => array('controller' => 'accounts', 'action' => 'index'));
$menu[] = array('name' => 'Contacts', 'url' => array('controller' => 'contacts', 'action' => 'index'));
$menu[] = array('name' => 'Ledgers', 'url' => array('controller' => 'ledgers', 'action' => 'index'));
$menu[] = array('name' => 'Tenders', 'url' => array('controller' => 'tenders', 'action' => 'index'));
$menu[] = array('name' => 'Transactions', 'url' => array('controller' => 'transactions', 'action' => 'index'));
$menu[] = array('name' => 'Ldgr Entries', 'url' => array('controller' => 'ledger_entries', 'action' => 'index'));
$menu[] = array('name' => 'Stmt Entries', 'url' => array('controller' => 'statement_entries', 'action' => 'index'));
$menu[] = array('name' => 'New Ledgers', 'url' => array('controller' => 'accounts', 'action' => 'newledger'));
$menu[] = array('name' => 'Assess Charges', 'url' => array('controller' => 'leases', 'action' => 'assess_all'));
foreach ($area['subareas'] AS $sname => &$subarea) {
if (empty($subarea['enable']))
$subarea = array();
if (empty($subarea['priorities']))
continue;
ksort($subarea['priorities']);
foreach ($subarea['priorities'] AS $pname => &$priority) {
if (empty($priority))
unset($subarea['priorities'][$pname]);
}
unset($priority);
if (empty($subarea['priorities']))
unset($area['subareas'][$sname]);
}
unset($subarea);
if (empty($area['subareas']))
unset($this->sidemenu['areas'][$aname]);
}
unset($area);
// Activate a default section (unless already specified)
foreach (array_reverse(array_diff_key($this->sidemenu['areas'], array('SANDBOX'=>1))) AS $area_name => $area) {
if (empty($area))
continue;
if (empty($this->sidemenu['active']) ||
empty($this->sidemenu['areas'][$this->sidemenu['active']['area']]))
$this->sideMenuAreaActivate($area_name);
}
if ($this->params['dev']) {
$menu[] = array('name' => 'Development', 'header' => true);
$menu[] = array('name' => 'Un-Nuke', 'url' => '#', 'htmlAttributes' =>
array('onclick' => '$(".pr-section").show(); return false;'));
$menu[] = array('name' => 'New Ledgers', 'url' => array('controller' => 'accounts', 'action' => 'newledger'));
//array('name' => 'RESET DATA', 'url' => array('controller' => 'accounts', 'action' => 'reset_data'));
//pr($this->sidemenu);
$this->set('sidemenu', $this->sidemenu);
}
return $menu;
}
function beforeFilter() {
$this->params['dev'] =
(!empty($this->params['dev_route']));
$this->params['admin'] =
(!empty($this->params['admin_route']) || !empty($this->params['dev_route']));
if (!$this->params['dev'])
Configure::write('debug', '0');
}
function beforeRender() {
$this->set('sidemenu', $this->sideMenuLinks());
}
/**************************************************************************
**************************************************************************
**************************************************************************
* override: redirect
*/
function redirect($url, $status = null, $exit = true) {
// OK, since the controller will not be able to
@@ -127,28 +428,6 @@ class AppController extends Controller {
return parent::redirect($url, $status, $exit);
}
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";
$db = & $this->Account->getDataSource();
$script .= ' "' . $db->config['database'] . '"';
$script .= ' "' . $db->config['login'] . '"';
$script .= ' "' . $db->config['password'] . '"';
$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);
}
/**************************************************************************
**************************************************************************
@@ -156,8 +435,14 @@ class AppController extends Controller {
* helper: gridView
* - called by derived controllers to create an index listing
*/
function index() {
$names = Inflector::humanize(Inflector::pluralize($this->params['controller']));
$this->gridView('All ' . $names, 'all');
}
function gridView($title, $action = null, $element = null) {
$this->sideMenuEnable('SITE', $this->op_area);
$this->sideMenuAreaActivate('CONTROLLER');
$this->set('title', $title);
// The resulting page will contain a grid, which will
// use ajax to obtain the actual data for this action
@@ -294,6 +579,7 @@ class AppController extends Controller {
$xml = preg_replace("/</", "&lt;", $xml);
$xml = preg_replace("/>/", "&gt;", $xml);
echo ("\n<PRE>\n$xml\n</PRE>\n");
$this->render_empty();
}
}
@@ -314,7 +600,7 @@ class AppController extends Controller {
// Grouping (which would not be typical)
$query['group'] = $this->gridDataCountGroup($params, $model);
// DEBUG PURPOSES ONLY!
if ($params['debug'])
$params['count_query'] = $query;
// Get the number of records prior to pagination
@@ -571,7 +857,7 @@ class AppController extends Controller {
isset($params['sidx']) ? $params['sidx'] : null,
isset($params['sord']) ? $params['sord'] : null);
// DEBUG PURPOSES ONLY!
if ($params['debug'])
$params['query'] = $query;
return $this->gridDataRecordsExecute($params, $model, $query);
@@ -695,6 +981,7 @@ class AppController extends Controller {
$this->gridDataPostProcessLinks($params, $model, $records, array());
// DEBUG PURPOSES ONLY!
//if ($params['debug'])
//$params['records'] = $records;
}
@@ -772,6 +1059,7 @@ class AppController extends Controller {
continue;
// DEBUG PURPOSES ONLY!
//if ($params['debug'])
//$params['linkrecord'][] = compact('table', 'field', 'id', 'controller', 'record');
$record[$table][$field] =
'<A HREF="' .
@@ -802,10 +1090,9 @@ class AppController extends Controller {
}
function gridDataOutputHeader(&$params, &$model) {
if (!$params['debug']) {
if (!$params['debug'])
header("Content-type: text/xml;charset=utf-8");
}
}
function gridDataOutputXMLHeader(&$params, &$model) {
echo "<?xml version='1.0' encoding='utf-8'?>\n";
@@ -867,14 +1154,26 @@ class AppController extends Controller {
echo " <cell><![CDATA[$data]]></cell>\n";
}
function authorize($name) {
if ($this->Permission->deny($name))
$this->UNAUTHORIZED("Unauthorized: $name");
}
function UNAUTHORIZED($msg) {
//$this->redirect('controller' => '???', 'action' => 'login');
//$this->render('/unauthorized');
$this->set('message', '<H2>' . $msg . '</H2>');
$this->render_empty();
}
function INTERNAL_ERROR($msg, $depth = 0) {
INTERNAL_ERROR($msg, false, $depth+1);
$this->render_empty();
$this->_stop();
}
function render_empty() {
$this->render('/empty');
echo $this->render('/empty');
$this->_stop();
}
}

View File

@@ -39,7 +39,7 @@ App::import('Core', 'Helper');
class AppHelper extends Helper {
function url($url = null, $full = false) {
foreach(array('admin_route', 'dev_route') AS $mod) {
foreach(array('sand_route', 'dev_route') AS $mod) {
if (isset($this->params[$mod]) && is_array($url) && !isset($url[$mod]))
$url[$mod] = $this->params[$mod];
}

View File

@@ -42,6 +42,10 @@ class AppModel extends Model {
var $useNullForEmpty = true;
var $formatDateFields = true;
// Loaded related models with no association
var $knows = array();
var $app_knows = array('Option');
// Default Log Level, if not specified at the function level
var $default_log_level = 5;
@@ -58,16 +62,35 @@ class AppModel extends Model {
var $max_log_level;
// REVISIT <AP>: 20090730
// Why is this constructor crashing?
// Clearly it's in some sort of infinite
// loop, but it seems the correct way
// to have a constructor call the parent...
/**************************************************************************
**************************************************************************
**************************************************************************
* function: __construct
*/
function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->knows = array_merge($this->app_knows, $this->knows);
//$this->pr(1, array('knows' => $this->knows));
foreach ($this->knows as $alias => $modelName) {
if (is_numeric($alias)) {
$alias = $modelName;
}
// Don't overwrite any existing alias
if (!empty($this->{$alias}) || get_class($this) == $alias)
continue;
$model = array('class' => $modelName, 'alias' => $alias);
if (PHP5) {
$this->{$alias} = ClassRegistry::init($model);
} else {
$this->{$alias} =& ClassRegistry::init($model);
}
}
}
/* function __construct() { */
/* parent::__construct(); */
/* $this->prClassLevel(5, 'Model'); */
/* } */
/**************************************************************************
**************************************************************************
@@ -81,7 +104,8 @@ class AppModel extends Model {
$caller = array_shift($trace);
$caller = array_shift($trace);
if (empty($class))
$class = $caller['class'];
$class = get_class($this);
$this->pr(50, compact('class', 'level'));
$this->class_log_level[$class] = $level;
}
@@ -90,9 +114,10 @@ class AppModel extends Model {
$caller = array_shift($trace);
$caller = array_shift($trace);
if (empty($class))
$class = $caller['class'];
$class = get_class($this);
if (empty($function))
$function = $caller['function'];
$this->pr(50, compact('class', 'function', 'level'));
$this->function_log_level["{$class}-{$function}"] = $level;
}
@@ -280,7 +305,9 @@ class AppModel extends Model {
if (preg_match("/^_/", $name) && !$all)
unset($vars[$name]);
}
pr($vars);
//$vars['class'] = get_class_vars(get_class($this));
$this->pr(1, $vars);
}
@@ -480,9 +507,9 @@ class AppModel extends Model {
return date('Y-m-d', strtotime($dateString));
}
function INTERNAL_ERROR($msg, $depth = 0) {
INTERNAL_ERROR($msg, false, $depth+1);
echo $this->requestAction(array('controller' => 'accounts',
function INTERNAL_ERROR($msg, $depth = 0, $force_stop = false) {
INTERNAL_ERROR($msg, $force_stop, $depth+1);
echo $this->requestAction(array('controller' => 'util',
'action' => 'render_empty'),
array('return', 'bare' => false)
);

5
build_devbox.cmd Normal file
View File

@@ -0,0 +1,5 @@
@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!

5
build_sandbox.cmd Normal file
View File

@@ -0,0 +1,5 @@
@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

@@ -32,7 +32,29 @@
*
*/
function sandbox() {
$r = Router::requestRoute();
return !empty($r[3]['sand_route']);
}
function devbox() {
$r = Router::requestRoute();
return !empty($r[3]['dev_route']);
}
function server_request_var($var) {
if (preg_match("/^HTTP_ACCEPT|REMOTE_PORT/", $var))
return false;
return (preg_match("/^HTTP|REQUEST|REMOTE/", $var));
}
function INTERNAL_ERROR($message, $exit = true, $drop = 0) {
$O = new Object();
for ($i=0; $i<3; ++$i) {
$O->log(str_repeat("\\", 80));
$O->log(str_repeat("/", 80));
}
$O->log("INTERNAL ERROR: $message");
echo '<DIV class="internal-error" style="color:#000; background:#c22; padding:0.5em 1.5em 0.5em 1.5em;">' . "\n";
echo '<H1 style="color:#000; margin-bottom:0.2em; font-size:2em;">INTERNAL ERROR:</H1>' . "\n";
echo '<H2 style="color:#000; margin-top:0; margin-left:1.5em; font-size:1.5em">' . $message . '</H2>' . "\n";
@@ -40,8 +62,10 @@ function INTERNAL_ERROR($message, $exit = true, $drop = 0) {
echo '<BR>It is a problem within the application itself and should be reported to the administrator.</H4>' . "\n";
// Print out the entire stack trace
$O->log(str_repeat("-", 30));
$O->log("Stack:");
echo '<HR style="margin-top:1.0em; margin-bottom:0.5em;">' . "\nStack Trace:\n";
echo '<OL style="margin-left:1.5em";>' . "\n";
echo '<OL style="margin-top:0.5em; margin-left:0.0em";>' . "\n";
$trace = array_slice(debug_backtrace(false), $drop);
for ($i = 0; $i < count($trace); ++$i) {
$bline = $trace[$i]['line'];
@@ -57,14 +81,36 @@ function INTERNAL_ERROR($message, $exit = true, $drop = 0) {
$bclas = null;
}
$O->log(" $bfile:$bline (" . ($bclas ? "$bclas::$bfunc" : "entry point") . ")");
echo("<LI>$bfile:$bline (" . ($bclas ? "$bclas::$bfunc" : "entry point") . ")</LI>\n");
}
echo "</OL>\n";
$O->log(str_repeat("-", 30));
$O->log("HTTP Request:");
echo '<HR style="margin-top:1.0em; margin-bottom:0.5em;">' . "\nHTTP Request:\n";
echo '<P><PRE style="color:#000; background:#c22;">' . "\n";
print_r($_REQUEST);
echo "\n</PRE>\n";
echo '<UL style="margin-top:0.5em; margin-left:0.0em";>' . "\n";
foreach($_REQUEST AS $k => $v) {
$O->log(sprintf(" %-20s => %s", $k, $v));
echo("<LI>$k =&gt; $v</LI>\n");
}
echo "</UL>\n";
$O->log(str_repeat("-", 30));
$O->log("Server:");
$SRV = array_intersect_key($_SERVER, array_flip(array_filter(array_keys($_SERVER), 'server_request_var')));
echo '<HR style="margin-top:1.0em; margin-bottom:0.5em;">' . "\nServer:\n";
echo '<UL style="margin-top:0.5em; margin-left:0.0em";>' . "\n";
foreach($SRV AS $k => $v) {
if ($k == 'REQUEST_TIME')
$v = date('c', $v);
$O->log(sprintf(" %-20s => %s", $k, $v));
echo("<LI>$k =&gt; $v</LI>\n");
}
echo "</UL>\n";
echo '<HR style="margin-top:1.0em; margin-bottom:0.5em;">' . "\n";
echo date('c') . "<BR>\n";
echo '</DIV>';
if ($exit)

View File

@@ -117,7 +117,7 @@
/**
* The name of CakePHP's session cookie.
*/
Configure::write('Session.cookie', 'CAKEPHP');
Configure::write('Session.cookie', 'PMGR');
/**
* Session time out time (in seconds).
* Actual value depends on 'Security.level' setting.

View File

@@ -10,5 +10,12 @@ class DATABASE_CONFIG {
'database' => 'property_manager',
'prefix' => 'pmgr_',
);
function __construct() {
if (devbox())
$this->default['database'] = 'pmgr_dev';
if (sandbox())
$this->default['database'] = 'pmgr_sand';
}
}
?>

View File

@@ -37,15 +37,15 @@ $default_path = array('controller' => 'maps', 'action' => 'view', '1');
Router::connect('/', $default_path);
/*
* Route for admin functionality
* Route for sandbox functionality
*/
Router::connect('/admin',
array('admin_route' => true) + $default_path);
Router::connect('/admin/:controller/:action/*',
array('admin_route' => true, 'action' => null));
Router::connect('/sand',
array('sand_route' => true) + $default_path);
Router::connect('/sand/:controller/:action/*',
array('sand_route' => true, 'action' => null));
/*
* Route for development functionality
* Route for developement functionality
*/
Router::connect('/dev',
array('dev_route' => true) + $default_path);

View File

@@ -2,27 +2,35 @@
class AccountsController extends AppController {
var $uses = array('Account', 'LedgerEntry');
var $sidemenu_links =
array(array('name' => 'Accounts', 'header' => true),
array('name' => 'All', 'url' => array('controller' => 'accounts', 'action' => 'all')),
array('name' => 'Asset', 'url' => array('controller' => 'accounts', 'action' => 'asset')),
array('name' => 'Liability', 'url' => array('controller' => 'accounts', 'action' => 'liability')),
array('name' => 'Equity', 'url' => array('controller' => 'accounts', 'action' => 'equity')),
array('name' => 'Income', 'url' => array('controller' => 'accounts', 'action' => 'income')),
array('name' => 'Expense', 'url' => array('controller' => 'accounts', 'action' => 'expense')),
);
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Asset',
array('controller' => 'accounts', 'action' => 'asset'), null,
'CONTROLLER', $this->admin_area);
$this->addSideMenuLink('Liability',
array('controller' => 'accounts', 'action' => 'liability'), null,
'CONTROLLER', $this->admin_area);
$this->addSideMenuLink('Equity',
array('controller' => 'accounts', 'action' => 'equity'), null,
'CONTROLLER', $this->admin_area);
$this->addSideMenuLink('Income',
array('controller' => 'accounts', 'action' => 'income'), null,
'CONTROLLER', $this->admin_area);
$this->addSideMenuLink('Expense',
array('controller' => 'accounts', 'action' => 'expense'), null,
'CONTROLLER', $this->admin_area);
$this->addSideMenuLink('All',
array('controller' => 'accounts', 'action' => 'all'), null,
'CONTROLLER', $this->admin_area);
}
@@ -90,9 +98,8 @@ class AccountsController extends AppController {
$conditions[] = array('Account.type' => strtoupper($params['action']));
}
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
$conditions[] = array('Account.level >=' => 10);
$conditions[] = array('Account.level >=' =>
$this->Permission->level('controller.accounts'));
return $conditions;
}
@@ -173,9 +180,8 @@ class AccountsController extends AppController {
('order' => array('CloseTransaction.stamp' => 'DESC'))),
),
'conditions' => array(array('Account.id' => $id),
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('Account.level >=' => 10),
array('Account.level >=' =>
$this->Permission->level('controller.accounts')),
),
)
);
@@ -189,12 +195,12 @@ class AccountsController extends AppController {
$stats = $this->Account->stats($id, true);
$stats = $stats['Ledger'];
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
$this->sidemenu_links[] =
array('name' => 'New Ledger', 'url' => array('action' => 'newledger', $id));
$this->sidemenu_links[] =
array('name' => 'Collected', 'url' => array('action' => 'collected', $id));
$this->addSideMenuLink('New Ledger',
array('action' => 'newledger', $id), null,
'ACTION', $this->admin_area);
$this->addSideMenuLink('Collected',
array('action' => 'collected', $id), null,
'ACTION', $this->admin_area);
// Prepare to render
$title = 'Account: ' . $account['Account']['name'];

View File

@@ -2,18 +2,6 @@
class ContactsController extends AppController {
var $sidemenu_links = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
}
/**************************************************************************
**************************************************************************
@@ -35,19 +23,34 @@ class ContactsController extends AppController {
* to jqGrid.
*/
function gridDataFilterTablesConfig(&$params, &$model, $table) {
$config = parent::gridDataFilterTablesConfig($params, $model, $table);
// Special case for Customer; We need the Contact/Customer relationship
if ($table == 'Customer')
$config = array('fields' => array('ContactsCustomer.type',
'ContactsCustomer.active'),
'conditions' => array('ContactsCustomer.active' => true),
);
return $config;
}
function gridDataOrder(&$params, &$model, $index, $direction) {
$order = parent::gridDataOrder($params, $model, $index, $direction);
if ($index === 'Contact.last_name') {
$order[] = 'Contact.first_name ' . $direction;
}
if ($index === 'Contact.first_name') {
// After sorting by whatever the user wants, add these
// defaults into the sort mechanism. If we're already
// sorting by one of them, it will only be redundant,
// and should cause no harm (possible a longer query?)
$order[] = 'Contact.last_name ' . $direction;
}
$order[] = 'Contact.first_name ' . $direction;
return $order;
}
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['Contact'] = array('id');
$links['Contact'] = array('display_name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}
@@ -78,13 +81,9 @@ class ContactsController extends AppController {
));
// Set up dynamic menu items
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
$this->sidemenu_links[] =
array('name' => 'Edit',
'url' => array('action' => 'edit',
$id));
$this->addSideMenuLink('Edit',
array('action' => 'edit', $id), null,
'ACTION');
// Prepare to render.
$title = 'Contact: ' . $contact['Contact']['display_name'];

View File

@@ -1,25 +1,31 @@
<?php
class CustomersController extends AppController {
var $sidemenu_links =
array(array('name' => 'Customers', 'header' => true),
array('name' => 'Current', 'url' => array('controller' => 'customers', 'action' => 'current')),
array('name' => 'Past', 'url' => array('controller' => 'customers', 'action' => 'past')),
array('name' => 'All', 'url' => array('controller' => 'customers', 'action' => 'all')),
array('name' => 'Add Customer', 'url' => array('controller' => 'customers', 'action' => 'add')),
);
//var $components = array('RequestHandler');
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Current',
array('controller' => 'customers', 'action' => 'current'), null,
'CONTROLLER');
$this->addSideMenuLink('Past',
array('controller' => 'customers', 'action' => 'past'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'customers', 'action' => 'all'), null,
'CONTROLLER');
/* $this->addSideMenuLink('New Customer', */
/* array('controller' => 'customers', 'action' => 'add'), null, */
/* 'CONTROLLER', $this->new_area); */
}
@@ -81,19 +87,29 @@ class CustomersController extends AppController {
return $conditions;
}
function gridDataOrder(&$params, &$model, $index, $direction) {
$order = array();
$order[] = parent::gridDataOrder($params, $model, $index, $direction);
function gridDataFilterTablesConfig(&$params, &$model, $table) {
$config = parent::gridDataFilterTablesConfig($params, $model, $table);
if ($index !== 'PrimaryContact.last_name')
$order[] = parent::gridDataOrder($params, $model,
'PrimaryContact.last_name', $direction);
if ($index !== 'PrimaryContact.first_name')
$order[] = parent::gridDataOrder($params, $model,
'PrimaryContact.first_name', $direction);
if ($index !== 'Customer.id')
$order[] = parent::gridDataOrder($params, $model,
'Customer.id', $direction);
// Special case for Contact; We need the Contact/Customer relationship
if ($table == 'Contact')
$config = array('fields' => array('ContactsCustomer.type',
'ContactsCustomer.active'),
'conditions' => array('ContactsCustomer.active' => true),
);
return $config;
}
function gridDataOrder(&$params, &$model, $index, $direction) {
$order = parent::gridDataOrder($params, $model, $index, $direction);
// After sorting by whatever the user wants, add these
// defaults into the sort mechanism. If we're already
// sorting by one of them, it will only be redundant,
// and should cause no harm (possible a longer query?)
$order[] = 'PrimaryContact.last_name ' . $direction;
$order[] = 'PrimaryContact.first_name ' . $direction;
$order[] = 'Customer.id ' . $direction;
return $order;
}
@@ -111,14 +127,18 @@ class CustomersController extends AppController {
* - Sets up the move-in page for the given customer.
*/
function move_in($id = null) {
function move_in($id = null, $unit_id = null) {
$customer = array();
$unit = array();
if (isset($id)) {
if (!empty($id)) {
$this->Customer->recursive = -1;
$customer = current($this->Customer->read(null, $id));
}
if (!empty($unit_id)) {
$this->Customer->Lease->Unit->recursive = -1;
$unit = current($this->Customer->Lease->Unit->read(null, $unit_id));
}
$this->set(compact('customer', 'unit'));
$title = 'Customer Move-In';
@@ -219,52 +239,71 @@ class CustomersController extends AppController {
$outstanding_deposit = $this->Customer->securityDepositBalance($id);
// Figure out if this customer has any non-closed leases
$show_moveout = false;
$show_payment = false;
$show_moveout = false; $moveout_lease_id = null;
$show_payment = false; $payment_lease_id = null;
foreach ($customer['Lease'] AS $lease) {
if (!isset($lease['close_date']))
if (!isset($lease['close_date'])) {
if ($show_payment)
$payment_lease_id = null;
else
$payment_lease_id = $lease['id'];
$show_payment = true;
if (!isset($lease['moveout_date']))
}
if (!isset($lease['moveout_date'])) {
if ($show_moveout)
$moveout_lease_id = null;
else
$moveout_lease_id = $lease['id'];
$show_moveout = true;
}
}
// Set up dynamic menu items
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
$this->sidemenu_links[] =
array('name' => 'Edit',
'url' => array('action' => 'edit',
$id));
$this->sidemenu_links[] =
array('name' => 'Move-In',
'url' => array('action' => 'move_in',
$id));
/* if ($show_moveout) { */
/* $this->sidemenu_links[] = */
/* array('name' => 'Move-Out', */
/* 'url' => array('action' => 'move_out', */
/* $id)); */
/* } */
if ($show_payment || $outstanding_balance > 0)
$this->sidemenu_links[] =
array('name' => 'New Receipt',
'url' => array('action' => 'receipt',
$id));
$this->addSideMenuLink('New Receipt',
array('action' => 'receipt', $id), null,
'ACTION');
if ($show_payment) {
/* $ids = $this->Customer->leaseIds($id, true); */
/* if (count($ids) == 1) */
/* $lease_id = $ids[0]; */
/* else */
/* $lease_id = null; */
$this->addSideMenuLink('New Invoice',
array('controller' => 'leases',
'action' => 'invoice',
$payment_lease_id), null,
'ACTION');
}
$this->addSideMenuLink('Move-In',
array('action' => 'move_in', $id), null,
'ACTION');
if ($show_moveout) {
$this->addSideMenuLink('Move-Out',
array('controller' => 'leases',
'action' => 'move_out',
$moveout_lease_id), null,
'ACTION');
}
if (!$show_moveout && $outstanding_balance > 0)
$this->sidemenu_links[] =
array('name' => 'Write-Off',
'url' => array('action' => 'bad_debt',
$id));
$this->addSideMenuLink('Write-Off',
array('action' => 'bad_debt', $id), null,
'ACTION');
if ($outstanding_balance < 0)
$this->sidemenu_links[] =
array('name' => 'Issue Refund',
'url' => array('action' => 'refund', $id));
$this->addSideMenuLink('Issue Refund',
array('action' => 'refund', $id), null,
'ACTION');
$this->addSideMenuLink('Edit',
array('action' => 'edit', $id), null,
'ACTION');
// Prepare to render.
$title = 'Customer: ' . $customer['Customer']['name'];
@@ -322,7 +361,17 @@ class CustomersController extends AppController {
$this->redirect(array('action'=>'view', $this->Customer->id));
// Since this is a new customer, go to the move in screen.
$this->redirect(array('action'=>'move_in', $this->Customer->id));
// First set the move-in unit id, if there is one, ...
if (empty($this->data['movein']['Unit']['id']))
$unit_id = null;
else
$unit_id = $this->data['movein']['Unit']['id'];
// ... then redirect
$this->redirect(array('action'=>'move_in',
$this->Customer->id,
$unit_id,
));
}
if ($id) {
@@ -385,7 +434,8 @@ class CustomersController extends AppController {
* - Add a new customer
*/
function add() {
function add($unit_id = null) {
$this->set('movein', array('Unit' => array('id' => $unit_id)));
$this->edit();
}

View File

@@ -2,19 +2,6 @@
class DoubleEntriesController extends AppController {
var $sidemenu_links = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
}
/**************************************************************************
**************************************************************************
@@ -47,6 +34,9 @@ class DoubleEntriesController extends AppController {
array('contain' => array('Ledger' => array('Account')),
'conditions' => array('DebitEntry.id' => $entry['DebitEntry']['id']),
));
$entry['Ledger']['link'] =
$entry['Ledger']['Account']['level'] >=
$this->Permission->level('controller.accounts');
$entry['DebitLedger'] = $entry['Ledger'];
unset($entry['Ledger']);
@@ -55,6 +45,9 @@ class DoubleEntriesController extends AppController {
array('contain' => array('Ledger' => array('Account')),
'conditions' => array('CreditEntry.id' => $entry['CreditEntry']['id']),
));
$entry['Ledger']['link'] =
$entry['Ledger']['Account']['level'] >=
$this->Permission->level('controller.accounts');
$entry['CreditLedger'] = $entry['Ledger'];
unset($entry['Ledger']);

View File

@@ -2,23 +2,29 @@
class LeasesController extends AppController {
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' => 'Delinquent', 'url' => array('controller' => 'leases', 'action' => 'delinquent')),
array('name' => 'All', 'url' => array('controller' => 'leases', 'action' => 'all')),
);
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Active',
array('controller' => 'leases', 'action' => 'active'), null,
'CONTROLLER');
$this->addSideMenuLink('Closed',
array('controller' => 'leases', 'action' => 'closed'), null,
'CONTROLLER');
$this->addSideMenuLink('Delinquent',
array('controller' => 'leases', 'action' => 'delinquent'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'leases', 'action' => 'all'), null,
'CONTROLLER');
}
@@ -29,11 +35,11 @@ class LeasesController extends AppController {
* - Generate a listing of leases
*/
function index() { $this->all(); }
function active() { $this->gridView('Active Leases'); }
function index() { $this->active(); }
function active() { $this->gridView('Active Leases', 'active'); }
function delinquent() { $this->gridView('Delinquent Leases'); }
function closed() { $this->gridView('Closed Leases'); }
function all() { $this->gridView('All Leases', 'all'); }
function all() { $this->gridView('All Leases'); }
/**************************************************************************
@@ -177,12 +183,12 @@ class LeasesController extends AppController {
$this->data['Lease']['moveout_date']
);
$this->redirect($this->data['redirect']);
$this->redirect(array('controller' => 'leases',
'action' => 'view',
$this->data['Lease']['id']));
}
if (!isset($id))
die("Oh Nooooo!!");
if (isset($id)) {
$lease = $this->Lease->find
('first', array
('contain' => array
@@ -205,14 +211,15 @@ class LeasesController extends AppController {
$this->set('unit', $lease['Unit']);
$this->set('lease', $lease['Lease']);
$redirect = array('controller' => 'leases',
'action' => 'view',
$id);
$title = ('Lease #' . $lease['Lease']['number'] . ': ' .
$lease['Unit']['name'] . ': ' .
$lease['Customer']['name'] . ': Prepare Move-Out');
$this->set(compact('title', 'redirect'));
$lease['Customer']['name'] . ': Move-Out');
}
else {
$title = 'Move-Out';
}
$this->set(compact('title'));
$this->render('/leases/move');
}
@@ -387,6 +394,10 @@ class LeasesController extends AppController {
$this->set(compact('default_late'));
if ($type === 'move-in') {
// Make sure we have a valid lease that we're moving in
if (empty($lease))
$this->redirect(array('action' => 'index'));
$movein = array();
$movein['time'] = strtotime($lease['Lease']['movein_date']);
$movein['effective_time'] = strtotime($lease['Lease']['movein_date']);
@@ -467,28 +478,21 @@ class LeasesController extends AppController {
// yet still have an outstanding balance. This can happen if someone
// were to reverse charges, or if a payment should come back NSF.
if (!isset($lease['Lease']['close_date']) || $outstanding_balance > 0) {
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
if (!isset($lease['Lease']['moveout_date']))
$this->sidemenu_links[] =
array('name' => 'Move-Out', 'url' => array('action' => 'move_out',
$id));
$this->addSideMenuLink('Move-Out',
array('action' => 'move_out', $id), null,
'ACTION');
if (!isset($lease['Lease']['close_date']))
$this->sidemenu_links[] =
array('name' => 'New Invoice', 'url' => array('action' => 'invoice',
$id));
$this->addSideMenuLink('New Invoice',
array('action' => 'invoice', $id), null,
'ACTION');
$this->sidemenu_links[] =
array('name' => 'New Receipt', 'url' => array('controller' => 'customers',
$this->addSideMenuLink('New Receipt',
array('controller' => 'customers',
'action' => 'receipt',
$lease['Customer']['id']));
/* if ($outstanding_balance < 0) */
/* $this->sidemenu_links[] = */
/* array('name' => 'Transfer Credit to Customer', */
/* 'url' => array('action' => 'promote_surplus', $id)); */
$lease['Customer']['id']), null,
'ACTION');
// REVISIT <AP>:
// Not allowing refund to be issued from the lease, as
@@ -500,19 +504,19 @@ class LeasesController extends AppController {
$this->INTERNAL_ERROR("Should not have a customer lease credit.");
/* if ($outstanding_balance < 0) */
/* $this->sidemenu_links[] = */
/* array('name' => 'Issue Refund', */
/* 'url' => array('action' => 'refund', $id)); */
/* $this->addSideMenuLink('Issue Refund', */
/* array('action' => 'refund', $id), null, */
/* 'ACTION'); */
if (isset($lease['Lease']['moveout_date']) && $outstanding_balance > 0)
$this->sidemenu_links[] =
array('name' => 'Write-Off', 'url' => array('action' => 'bad_debt',
$id));
$this->addSideMenuLink('Write-Off',
array('action' => 'bad_debt', $id), null,
'ACTION');
if ($this->Lease->closeable($id))
$this->sidemenu_links[] =
array('name' => 'Close', 'url' => array('action' => 'close',
$id));
$this->addSideMenuLink('Close',
array('action' => 'close', $id), null,
'ACTION');
}
// Prepare to render

View File

@@ -2,19 +2,6 @@
class LedgerEntriesController extends AppController {
var $sidemenu_links = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
}
/**************************************************************************
**************************************************************************
@@ -130,8 +117,12 @@ class LedgerEntriesController extends AppController {
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['LedgerEntry'] = array('id');
$links['Transaction'] = array('id');
// REVISIT <AP>: 20090827
// Need to take 'level' into account
if ($this->Permission->allow('controller.accounts')) {
$links['Ledger'] = array('id');
$links['Account'] = array('controller' => 'accounts', 'name');
$links['Account'] = array('name');
}
$links['Tender'] = array('name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}
@@ -157,10 +148,6 @@ class LedgerEntriesController extends AppController {
array('fields' => array('id', 'sequence', 'name'),
'Account' =>
array('fields' => array('id', 'name', 'type'),
'conditions' =>
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('Account.level >=' => 5),
),
),

View File

@@ -2,22 +2,26 @@
class LedgersController extends AppController {
var $sidemenu_links =
array(array('name' => 'Ledgers', 'header' => true),
array('name' => 'Current', 'url' => array('controller' => 'ledgers', 'action' => 'current')),
array('name' => 'Closed', 'url' => array('controller' => 'ledgers', 'action' => 'closed')),
array('name' => 'All', 'url' => array('controller' => 'ledgers', 'action' => 'all')),
);
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Current',
array('controller' => 'ledgers', 'action' => 'current'), null,
'CONTROLLER');
$this->addSideMenuLink('Closed',
array('controller' => 'ledgers', 'action' => 'closed'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'ledgers', 'action' => 'all'), null,
'CONTROLLER');
}
@@ -82,32 +86,32 @@ class LedgersController extends AppController {
$conditions[] = array('Ledger.close_transaction_id !=' => null);
}
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
$conditions[] = array('Account.level >=' => 10);
$conditions[] = array('Account.level >=' =>
$this->Permission->level('controller.accounts'));
return $conditions;
}
function gridDataOrder(&$params, &$model, $index, $direction) {
$id_sequence = false;
if ($index === 'id_sequence') {
$id_sequence = true;
$index = 'Ledger.account_id';
}
$order = parent::gridDataOrder($params, $model, $index, $direction);
if ($id_sequence) {
// After sorting by whatever the user wants, add these
// defaults into the sort mechanism. If we're already
// sorting by one of them, it will only be redundant,
// and should cause no harm (possible a longer query?)
$order[] = 'Account.name ' . $direction;
$order[] = 'Ledger.sequence ' . $direction;
}
return $order;
}
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['Ledger'] = array('id_sequence');
// REVISIT <AP>: 20090827
// Need to take 'level' into account
if ($this->Permission->allow('controller.accounts')) {
$links['Ledger'] = array('sequence');
$links['Account'] = array('name');
}
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}
@@ -127,9 +131,8 @@ class LedgersController extends AppController {
'Account',
),
'conditions' => array(array('Ledger.id' => $id),
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('Account.level >=' => 10),
array('Account.level >=' =>
$this->Permission->level('controller.accounts')),
),
)
);

View File

@@ -52,6 +52,7 @@ class MapsController extends AppController {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('action'=>'index'));
}
$this->sideMenuEnable('SITE', $this->op_area);
$this->set('info', $this->mapInfo($id, $requested_width));
$this->set('title', "Site Map");
}

View File

@@ -2,19 +2,6 @@
class StatementEntriesController extends AppController {
var $sidemenu_links = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
}
/**************************************************************************
**************************************************************************
@@ -121,11 +108,10 @@ class StatementEntriesController extends AppController {
if (isset($customer_id))
$conditions[] = array('StatementEntry.customer_id' => $customer_id);
if (isset($statement_entry_id)) {
if (isset($statement_entry_id))
$conditions[] = array('OR' =>
array(array('ChargeEntry.id' => $statement_entry_id),
array('DisbursementEntry.id' => $statement_entry_id)));
}
if ($params['action'] === 'unreconciled') {
$query = array('conditions' => $conditions);
@@ -145,6 +131,9 @@ class StatementEntriesController extends AppController {
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['StatementEntry'] = array('id');
$links['Transaction'] = array('id');
// REVISIT <AP>: 20090827
// Need to take 'level' into account
if ($this->Permission->allow('controller.accounts'))
$links['Account'] = array('name');
$links['Customer'] = array('name');
$links['Lease'] = array('number');
@@ -266,15 +255,12 @@ class StatementEntriesController extends AppController {
('first',
array('contain' => array
('Transaction' => array('fields' => array('id', 'type', 'stamp')),
'Account' => array('id', 'name', 'type'),
'Account' => array('id', 'name', 'type', 'level'),
'Customer' => array('fields' => array('id', 'name')),
'Lease' => array('fields' => array('id')),
'Lease' => array('fields' => array('id', 'number')),
),
'conditions' => array(array('StatementEntry.id' => $id),
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('Account.level >=' => 5)
),
));
@@ -283,6 +269,10 @@ class StatementEntriesController extends AppController {
$this->redirect(array('controller' => 'accounts', 'action'=>'index'));
}
$entry['Account']['link'] =
$entry['Account']['level'] >=
$this->Permission->level('controller.accounts');
$stats = $this->StatementEntry->stats($id);
if (in_array(strtoupper($entry['StatementEntry']['type']), $this->StatementEntry->debitTypes()))
@@ -293,24 +283,16 @@ class StatementEntriesController extends AppController {
if (strtoupper($entry['StatementEntry']['type']) === 'CHARGE') {
$reversable = $this->StatementEntry->reversable($id);
// Set up dynamic menu items
if ($reversable || $stats['balance'] > 0)
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
if ($reversable)
$this->sidemenu_links[] =
array('name' => 'Reverse',
'url' => array('action' => 'reverse',
$id));
if ($this->StatementEntry->reversable($id))
$this->addSideMenuLink('Reverse',
array('action' => 'reverse', $id), null,
'ACTION');
if ($stats['balance'] > 0)
$this->sidemenu_links[] =
array('name' => 'Waive Balance',
'url' => array('action' => 'waive',
$id));
$this->addSideMenuLink('Waive Balance',
array('action' => 'waive', $id), null,
'ACTION');
}
// Prepare to render.

View File

@@ -2,19 +2,6 @@
class TendersController extends AppController {
var $sidemenu_links = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
}
/**************************************************************************
**************************************************************************
@@ -75,7 +62,7 @@ class TendersController extends AppController {
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['Tender'] = array('name', 'id');
$links['Customer'] = array('name');
$links['TenderType'] = array('name');
//$links['TenderType'] = array('name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}
@@ -163,17 +150,6 @@ class TendersController extends AppController {
));
// Set up dynamic menu items
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
// Watch out for the special "Closing" entries
if (!empty($tender['TenderType']['id']))
$this->sidemenu_links[] =
array('name' => 'Edit',
'url' => array('action' => 'edit',
$id));
if (!empty($tender['Tender']['deposit_transaction_id'])
&& empty($tender['Tender']['nsf_transaction_id'])
// Hard to tell what types of items can come back as NSF.
@@ -181,12 +157,18 @@ class TendersController extends AppController {
// (or if we're in development mode)
&& (!empty($tender['TenderType']['data1_name']) || !empty($this->params['dev']))
) {
$this->sidemenu_links[] =
array('name' => 'NSF',
'url' => array('action' => 'nsf',
$id));
$this->addSideMenuLink('NSF',
array('action' => 'nsf', $id), null,
'ACTION');
}
// Watch out for the special "Closing" entries, which have
// tender_type_id set to NULL. Otherwise, allow editing.
if (!empty($tender['TenderType']['id']))
$this->addSideMenuLink('Edit',
array('action' => 'edit', $id), null,
'ACTION');
// Prepare to render.
$title = "Tender #{$tender['Tender']['id']} : {$tender['Tender']['name']}";
$this->set(compact('tender', 'title'));

View File

@@ -4,23 +4,35 @@ class TransactionsController extends AppController {
var $components = array('RequestHandler');
var $sidemenu_links =
array(array('name' => 'Transactions', 'header' => true),
array('name' => 'All', 'url' => array('controller' => 'transactions', 'action' => 'all')),
array('name' => 'Invoices', 'url' => array('controller' => 'transactions', 'action' => 'invoice')),
array('name' => 'Receipts', 'url' => array('controller' => 'transactions', 'action' => 'receipt')),
array('name' => 'Deposits', 'url' => array('controller' => 'transactions', 'action' => 'deposit')),
);
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Invoices',
array('controller' => 'transactions', 'action' => 'invoice'), null,
'CONTROLLER');
$this->addSideMenuLink('Receipts',
array('controller' => 'transactions', 'action' => 'receipt'), null,
'CONTROLLER');
$this->addSideMenuLink('Deposits',
array('controller' => 'transactions', 'action' => 'deposit'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'transactions', 'action' => 'all'), null,
'CONTROLLER');
// REVISIT <AP>: 20090824
// Right now, we wish to keep things simple. Don't make these
// links available to non-admin users.
if (empty($this->params['admin']))
$this->sideMenuEnable('CONTROLLER', $this->std_area, false);
}
@@ -36,10 +48,9 @@ class TransactionsController extends AppController {
function invoice() { $this->gridView('Invoices'); }
function receipt() { $this->gridView('Receipts'); }
function deposit() {
$this->sidemenu_links = array
(array('name' => 'Operations', 'header' => true),
array('name' => 'New Deposit', 'url' => array('controller' => 'tenders',
'action' => 'deposit')));
/* $this->addSideMenuLink('New Deposit', */
/* array('controller' => 'tenders', 'action' => 'deposit'), null, */
/* 'CONTROLLER', $this->new_area); */
$this->gridView('Deposits');
}
@@ -84,10 +95,6 @@ class TransactionsController extends AppController {
if (in_array($params['action'], array('invoice', 'receipt', 'deposit')))
$conditions[] = array('Transaction.type' => strtoupper($params['action']));
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
$conditions[] = array('Account.level >=' => 5);
return $conditions;
}
@@ -105,7 +112,7 @@ class TransactionsController extends AppController {
* - handles the creation of a charge invoice
*/
function postInvoice() {
function postInvoice($redirect = true) {
if (!$this->RequestHandler->isPost()) {
echo('<H2>THIS IS NOT A POST FOR SOME REASON</H2>');
return;
@@ -120,6 +127,17 @@ class TransactionsController extends AppController {
die("<H1>INVOICE FAILED</H1>");
}
if ($redirect) {
if (!empty($this->data['Customer']['id']))
$this->redirect(array('controller' => 'customers',
'action' => 'receipt',
$this->data['Customer']['id']));
else
$this->redirect(array('controller' => 'leases',
'action' => 'view',
$this->data['Lease']['id']));
}
$this->layout = null;
$this->autoLayout = false;
$this->autoRender = false;
@@ -133,7 +151,7 @@ class TransactionsController extends AppController {
* - handles the creation of a receipt
*/
function postReceipt() {
function postReceipt($redirect = true) {
if (!$this->RequestHandler->isPost()) {
echo('<H2>THIS IS NOT A POST FOR SOME REASON</H2>');
return;
@@ -157,6 +175,11 @@ class TransactionsController extends AppController {
die("<H1>RECEIPT FAILED</H1>");
}
if ($redirect)
$this->redirect(array('controller' => 'customers',
'action' => 'view',
$this->data['Customer']['id']));
$this->layout = null;
$this->autoLayout = false;
$this->autoRender = false;
@@ -370,9 +393,11 @@ class TransactionsController extends AppController {
* irreversibly destroys the data. It is not for normal use.
*/
function destroy($id = null) {
function destroy($id) {
$this->Transaction->id = $id;
$customer_id = $this->Transaction->field('customer_id');
$this->Transaction->destroy($id);
//$this->redirect(array('action' => 'index'));
$this->redirect(array('controller' => 'customers', 'action' => 'view', $customer_id));
}
@@ -388,42 +413,35 @@ class TransactionsController extends AppController {
('first',
array('contain' =>
array(// Models
'Account(id,name)',
'Ledger(id,name)',
'Account(id,name,level)',
'Ledger(id,sequence)',
'NsfTender(id,name)',
),
'conditions' => array(array('Transaction.id' => $id),
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('OR' =>
array(array('Account.level >=' => 5),
array('Account.id' => null))),
),
));
// REVISIT <AP>: 20090815
// for debug purposes only (pr output)
$this->Transaction->stats($id);
if (empty($transaction)) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('action'=>'index'));
}
if ($transaction['Transaction']['type'] === 'DEPOSIT' || $this->params['dev']) {
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
$transaction['Account']['link'] =
$transaction['Account']['level'] >=
$this->Permission->level('controller.accounts');
if ($transaction['Transaction']['type'] === 'DEPOSIT')
$this->sidemenu_links[] =
array('name' => 'View Slip', 'url' => array('action' => 'deposit_slip', $id));
if ($this->params['dev'])
$this->sidemenu_links[] =
array('name' => 'Destroy', 'url' => array('action' => 'destroy', $id),
'confirmMessage' => ("This may leave the database in an unstable state." .
$this->addSideMenuLink('View Slip',
array('action' => 'deposit_slip', $id), null,
'ACTION');
$this->addSideMenuLink('Destroy',
array('action' => 'destroy', $id),
array('confirmMessage' =>
"This may leave the database in an unstable state." .
" Do NOT do this unless you know what you're doing." .
" Proceed anyway?"));
}
" Proceed anyway?"),
'ACTION', $this->admin_area);
// OK, prepare to render.
$title = 'Transaction #' . $transaction['Transaction']['id'];
@@ -440,15 +458,12 @@ class TransactionsController extends AppController {
*/
function deposit_slip($id) {
// Build a container for the deposit slip data
$deposit = array('types' => array());
$this->id = $id;
$deposit +=
$this->Transaction->find('first', array('contain' => false));
// Find the deposit transaction
$this->Transaction->id = $id;
$deposit = $this->Transaction->find('first', array('contain' => false));
// Get a summary of all forms of tender in the deposit
$result = $this->Transaction->find
$tenders = $this->Transaction->find
('all',
array('link' => array('DepositTender' =>
array('fields' => array(),
@@ -463,16 +478,17 @@ class TransactionsController extends AppController {
'group' => 'TenderType.id',
));
if (empty($result)) {
die();
// Verify the deposit exists, and that something was actually deposited
if (empty($deposit) || empty($tenders)) {
$this->Session->setFlash(__('Invalid Deposit.', true));
$this->redirect(array('action'=>'deposit'));
}
// Add the summary to our deposit slip data container
foreach ($result AS $type) {
$deposit['types'][$type['TenderType']['id']] =
$type['TenderType'] + $type[0];
$deposit['types'] = array();
foreach ($tenders AS $tender) {
$deposit['types'][$tender['TenderType']['id']] =
$tender['TenderType'] + $tender[0];
}
$deposit_total = 0;
@@ -482,10 +498,9 @@ class TransactionsController extends AppController {
if ($deposit['Transaction']['amount'] != $deposit_total)
$this->INTERNAL_ERROR("Deposit items do not add up to deposit slip total");
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
$this->sidemenu_links[] =
array('name' => 'View Transaction', 'url' => array('action' => 'view', $id));
$this->addSideMenuLink('View',
array('action' => 'view', $id), null,
'ACTION');
$title = 'Deposit Slip';
$this->set(compact('title', 'deposit'));

View File

@@ -0,0 +1,238 @@
<?php
class UnitSizesController extends AppController {
/**************************************************************************
**************************************************************************
**************************************************************************
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('1 Bedroom',
array('controller' => 'unit_sizes', 'action' => 'bd1'), null,
'CONTROLLER');
$this->addSideMenuLink('2 Bedroom',
array('controller' => 'unit_sizes', 'action' => 'bd2'), null,
'CONTROLLER');
$this->addSideMenuLink('3 Bedroom',
array('controller' => 'unit_sizes', 'action' => 'bd3'), null,
'CONTROLLER');
$this->addSideMenuLink('4+ Bedroom',
array('controller' => 'unit_sizes', 'action' => 'bd4'), null,
'CONTROLLER');
$this->addSideMenuLink('Auto',
array('controller' => 'unit_sizes', 'action' => 'auto'), null,
'CONTROLLER');
$this->addSideMenuLink('Boat',
array('controller' => 'unit_sizes', 'action' => 'boat'), null,
'CONTROLLER');
$this->addSideMenuLink('RV',
array('controller' => 'unit_sizes', 'action' => 'rv'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'unit_sizes', 'action' => 'all'), null,
'CONTROLLER');
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: index / unavailable / vacant / occupied / all
* - Generate a listing of units
*/
function index() { $this->all(); }
function bd1() { $this->gridView('Sizes for 1 Bedroom'); }
function bd2() { $this->gridView('Sizes for 2 Bedrooms'); }
function bd3() { $this->gridView('Sizes for 3 Bedroom'); }
function bd4() { $this->gridView('Sizes for 4+ Bedroom'); }
function auto() { $this->gridView('Sizes for an Automobile'); }
function boat() { $this->gridView('Sizes for a Boat'); }
function rv() { $this->gridView('Sizes for an RV'); }
function all() { $this->gridView('All Unit Sizes', 'all'); }
/**************************************************************************
**************************************************************************
**************************************************************************
* virtuals: gridData
* - With the application controller handling the gridData action,
* these virtual functions ensure that the correct data is passed
* to jqGrid.
*/
function gridDataCountTables(&$params, &$model) {
return array('link' => array('UnitType'));
}
function gridDataTables(&$params, &$model) {
$tables = $this->gridDataCountTables($params, $model);
$tables['link']['Unit'] = array();
return $tables;
}
function gridDataFields(&$params, &$model) {
$fields = parent::gridDataFields($params, $model);
$fields[] = 'ROUND(UnitSize.width/12, 1) AS width';
$fields[] = 'ROUND(UnitSize.depth/12, 1) AS depth';
$fields[] = 'ROUND(UnitSize.height/12, 1) AS height';
$fields[] = 'ROUND(UnitSize.width/12 * UnitSize.depth/12, 0) AS sqft';
$fields[] = 'ROUND(UnitSize.width/12 * UnitSize.depth/12 * UnitSize.height/12, 0) AS cuft';
$fields[] = 'ROUND(UnitSize.rent / (UnitSize.width/12 * UnitSize.depth/12), 2) AS sqcost';
$fields[] = 'ROUND(UnitSize.rent / (UnitSize.width/12 * UnitSize.depth/12 * UnitSize.height/12), 2) AS cucost';
$fields[] = 'COUNT(Unit.id) AS units';
$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->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() . ', 1, 0)) / COUNT(unit.id) AS occupancy';
return $fields;
}
function gridDataConditions(&$params, &$model) {
$conditions = parent::gridDataConditions($params, $model);
// REVISIT <AP>: 20090825
// Sizes should come from the database.
// For now, I took an assumed average need, then bracketed
// with +/- 50 sqft. This gives a 100sqft range for each.
if ($params['action'] === 'bd1') { // 75 sqft
$conditions[] = array('UnitType.id' => array_keys($this->UnitSize->UnitType->enclosedTypes()));
$conditions[] = '(UnitSize.width/12 * UnitSize.depth/12) <= 125';
}
elseif ($params['action'] === 'bd2') { // 125 sqft
$conditions[] = array('UnitType.id' => array_keys($this->UnitSize->UnitType->enclosedTypes()));
$conditions[] = '(UnitSize.width/12 * UnitSize.depth/12) >= 75';
$conditions[] = '(UnitSize.width/12 * UnitSize.depth/12) <= 175';
}
elseif ($params['action'] === 'bd3') { // 175 sqft
$conditions[] = array('UnitType.id' => array_keys($this->UnitSize->UnitType->enclosedTypes()));
$conditions[] = '(UnitSize.width/12 * UnitSize.depth/12) >= 125';
$conditions[] = '(UnitSize.width/12 * UnitSize.depth/12) <= 225';
}
elseif ($params['action'] === 'bd4') { // 225 sqft
$conditions[] = array('UnitType.id' => array_keys($this->UnitSize->UnitType->enclosedTypes()));
$conditions[] = '(UnitSize.width/12 * UnitSize.depth/12) >= 175';
}
elseif (in_array($params['action'], array('auto', 'boat', 'rv'))) {
$conditions[] = array('UnitType.id' =>
array_merge(array_keys($this->UnitSize->UnitType->enclosedTypes()),
array_keys($this->UnitSize->UnitType->outdoorTypes())));
list($width, $depth, $height) = array(8, 15, null);
if ($params['action'] === 'auto')
$depth = 15;
elseif ($params['action'] === 'boat')
$depth = 15;
elseif ($params['action'] === 'rv')
list($width, $depth, $height) = array(10, 25, 12);
$conditions[] = "(UnitSize.width/12) >= $width";
$conditions[] = "(UnitSize.depth/12) >= $depth";
if (isset($height))
$conditions[] = array('OR' =>
array("(UnitSize.height/12) >= $height",
//"UnitSize.height IS NULL",
array('UnitType.id' =>
array_keys($this->UnitSize->UnitType->outdoorTypes())),
));
}
return $conditions;
}
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['UnitSize'] = array('name');
return parent::gridDataPostProcessLinks($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 UnitSize and related fields
$this->UnitSize->id = $id;
$size = $this->UnitSize->find
('first', array
('contain' => array('UnitType'),
'fields' => array('UnitSize.*', 'UnitType.*',
'ROUND(UnitSize.width/12, 1) AS width',
'ROUND(UnitSize.depth/12, 1) AS depth',
'ROUND(UnitSize.height/12, 1) AS height',
'ROUND(UnitSize.width/12 * UnitSize.depth/12, 0) AS sqft',
'ROUND(UnitSize.width/12 * UnitSize.depth/12 * UnitSize.height/12, 0) AS cuft'),
));
$size['UnitSize'] = $size[0] + $size['UnitSize'];
unset($size[0]);
$this->set(compact('size'));
$this->set('stats', $this->UnitSize->stats($id));
// Prepare to render.
$title = "Unit Size : {$size['UnitSize']['name']}";
$this->set(compact('title'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: edit
* - Edit unit_size information
*/
function edit($id = null) {
$this->INTERNAL_ERROR('NOT READY');
if (isset($this->data)) {
// Check to see if the operation was cancelled.
if (isset($this->params['form']['cancel'])) {
if (empty($this->data['UnitSize']['id']))
$this->redirect(array('action'=>'index'));
$this->redirect(array('action'=>'view', $this->data['UnitSize']['id']));
}
// Make sure we have unit_size data
if (empty($this->data['UnitSize']) || empty($this->data['UnitSize']['id']))
$this->redirect(array('action'=>'index'));
// Save the unit_size and all associated data
$this->UnitSize->create();
$this->UnitSize->id = $this->data['UnitSize']['id'];
if (!$this->UnitSize->save($this->data, false)) {
$this->Session->setFlash("UNIT_SIZE SAVE FAILED", true);
pr("UNIT_SIZE SAVE FAILED");
}
$this->redirect(array('action'=>'view', $this->UnitSize->id));
}
if ($id) {
$this->data = $this->UnitSize->findById($id);
} else {
$this->redirect(array('action'=>'index'));
}
// Prepare to render.
$title = ('UnitSize ' . $this->data['UnitSize']['name'] .
" : Edit");
$this->set(compact('title'));
}
}

View File

@@ -2,23 +2,35 @@
class UnitsController extends AppController {
var $sidemenu_links =
array(array('name' => 'Units', 'header' => true),
array('name' => 'Occupied', 'url' => array('controller' => 'units', 'action' => 'occupied')),
array('name' => 'Vacant', 'url' => array('controller' => 'units', 'action' => 'vacant')),
array('name' => 'Unavailable', 'url' => array('controller' => 'units', 'action' => 'unavailable')),
array('name' => 'All', 'url' => array('controller' => 'units', 'action' => 'all')),
);
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Unavailable',
array('controller' => 'units', 'action' => 'unavailable'), null,
'CONTROLLER');
$this->addSideMenuLink('Vacant',
array('controller' => 'units', 'action' => 'vacant'), null,
'CONTROLLER');
$this->addSideMenuLink('Occupied',
array('controller' => 'units', 'action' => 'occupied'), null,
'CONTROLLER');
$this->addSideMenuLink('Overlocked',
array('controller' => 'units', 'action' => 'locked'), null,
'CONTROLLER');
$this->addSideMenuLink('Liened',
array('controller' => 'units', 'action' => 'liened'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'units', 'action' => 'all'), null,
'CONTROLLER');
}
@@ -33,6 +45,8 @@ class UnitsController extends AppController {
function unavailable() { $this->gridView('Unavailable Units'); }
function vacant() { $this->gridView('Vacant Units'); }
function occupied() { $this->gridView('Occupied Units'); }
function locked() { $this->gridView('Overlocked Units'); }
function liened() { $this->gridView('Liened Units'); }
function all() { $this->gridView('All Units', 'all'); }
@@ -81,6 +95,7 @@ class UnitsController extends AppController {
function gridDataFields(&$params, &$model) {
$fields = parent::gridDataFields($params, $model);
$fields[] = 'ROUND(UnitSize.width/12 * UnitSize.depth/12, 0) AS sqft';
return array_merge($fields,
$this->Unit->Lease->StatementEntry->chargeDisbursementFields(true));
}
@@ -100,6 +115,12 @@ class UnitsController extends AppController {
elseif ($params['action'] === 'unoccupied') {
$conditions[] = array('NOT' => array($this->Unit->conditionOccupied()));
}
elseif ($params['action'] === 'locked') {
$conditions[] = $this->Unit->conditionLocked();
}
elseif ($params['action'] === 'liened') {
$conditions[] = $this->Unit->conditionLiened();
}
return $conditions;
}
@@ -139,7 +160,7 @@ class UnitsController extends AppController {
$customer = array();
$unit = array();
if (isset($id)) {
if (!empty($id)) {
$this->Unit->recursive = -1;
$unit = current($this->Unit->read(null, $id));
}
@@ -189,6 +210,21 @@ class UnitsController extends AppController {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: lock/unlock
* - Transitions the unit into / out of the LOCKED state
*/
function status($id, $status) {
$this->Unit->updateStatus($id, $status, true);
$this->redirect(array('action' => 'view', $id));
}
function lock($id) { $this->status($id, 'LOCKED'); }
function unlock($id) { $this->status($id, 'OCCUPIED'); }
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -232,39 +268,66 @@ class UnitsController extends AppController {
$outstanding_deposit = $this->Unit->Lease->securityDepositBalance($unit['CurrentLease']['id']);
}
// Set up dynamic menu items
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
// If the unit is occupied, but not locked, provide a
// mechanism to do so. This doesn't have to be restricted
// to past due customers. There are times we need to
// overlock customers in good standing, such as if their
// lock breaks, is cut, or missing for any reason.
if ($this->Unit->occupied($unit['Unit']['status']) &&
!$this->Unit->locked($unit['Unit']['status']))
$this->addSideMenuLink('Lock',
array('action' => 'Lock', $id), null,
'ACTION');
$this->sidemenu_links[] =
array('name' => 'Edit', 'url' => array('action' => 'edit',
$id));
// If the unit is locked, provide an option to unlock it,
// unless it's locked due to lien, which is not so simple.
if ($this->Unit->locked($unit['Unit']['status']) &&
!$this->Unit->liened($unit['Unit']['status']))
$this->addSideMenuLink('Unlock',
array('action' => 'unlock', $id), null,
'ACTION');
if (isset($unit['CurrentLease']['id']) &&
!isset($unit['CurrentLease']['moveout_date'])) {
$this->sidemenu_links[] =
array('name' => 'Move-Out', 'url' => array('action' => 'move_out',
$id));
// If there is a current lease on this unit, then provide
// a link to move the tenant out. Current lease for a unit
// has a bit different definition than a current lease for
// a customer, since a lease stays with a customer until it
// is finally closed. A lease, however, only stays with a
// unit while occupied (since a unit is not responsible for
// any lingering financial obligations, like a customer is).
// Of course, if there is no current lease, provide a link
// to move a new tenant in (if the unit is available).
if (isset($unit['CurrentLease']['id'])) {
$this->addSideMenuLink('Move-Out',
array('action' => 'move_out', $id), null,
'ACTION');
} elseif ($this->Unit->available($unit['Unit']['status'])) {
$this->sidemenu_links[] =
array('name' => 'Move-In', 'url' => array('action' => 'move_in',
$id));
$this->addSideMenuLink('Move-In',
array('action' => 'move_in', $id), null,
'ACTION');
} else {
// Unit is unavailable (dirty, damaged, reserved, business-use, etc)
}
if (isset($unit['CurrentLease']['id']) &&
!isset($unit['CurrentLease']['close_date'])) {
$this->sidemenu_links[] =
array('name' => 'New Invoice', 'url' => array('controller' => 'leases',
// If there is a current lease, allow new charges to
// be added, and payments to be made.
if (isset($unit['CurrentLease']['id'])) {
$this->addSideMenuLink('New Invoice',
array('controller' => 'leases',
'action' => 'invoice',
$unit['CurrentLease']['id']));
$this->sidemenu_links[] =
array('name' => 'New Receipt', 'url' => array('controller' => 'customers',
$unit['CurrentLease']['id']), null,
'ACTION');
$this->addSideMenuLink('New Receipt',
array('controller' => 'customers',
'action' => 'receipt',
$unit['CurrentLease']['customer_id']));
$unit['CurrentLease']['customer_id']), null,
'ACTION');
}
// Always allow the unit to be edited.
$this->addSideMenuLink('Edit',
array('action' => 'edit', $id), null,
'ACTION');
// Prepare to render.
$title = 'Unit ' . $unit['Unit']['name'];
$this->set(compact('unit', 'title',
@@ -328,7 +391,6 @@ class UnitsController extends AppController {
$this->set(compact('unit_sizes'));
// Prepare to render.
pr($this->data);
$this->set(compact('title'));
}

View File

@@ -0,0 +1,76 @@
<?php
class UtilController extends AppController {
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);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: rebuild_box
*/
function rebuild_box($type) {
$this->layout = null;
$this->autoLayout = false;
$this->autoRender = false;
Configure::write('debug', '0');
$script = preg_replace('%/webroot/index.php$%',
'/build_'.$type.'box.cmd',
$_SERVER['SCRIPT_FILENAME']);
// REVISIT <AP>: 20090828
// Just use system call
$handle = popen($script . ' 2>&1', 'r');
while (($read = fread($handle, 2096))) {
// Do nothing
}
pclose($handle);
$url = $_SERVER['HTTP_REFERER'];
if (empty($url))
$url = "/";
$this->redirect($url);
}
function rebuild_sandbox() { $this->rebuild_box('sand'); }
function rebuild_devbox() { $this->rebuild_box('dev'); }
/**************************************************************************
**************************************************************************
**************************************************************************
* function: logmsg
* - action to allow posting log message data
*/
function logmsg() {
}
}

View File

@@ -188,8 +188,7 @@ class Account extends AppModel {
function relatedAccounts($attribute, $extra = null) {
$this->cacheQueries = true;
$accounts = $this->find('all', array
('contain' => array('CurrentLedger'),
'fields' => array('Account.id', 'Account.type', 'Account.name', 'CurrentLedger.id'),
('fields' => array('Account.id', 'Account.name'),
'conditions' => array('Account.'.$attribute => true),
'order' => array('Account.name'),
) + (isset($extra) ? $extra : array())
@@ -213,21 +212,10 @@ class Account extends AppModel {
* - Returns an array of accounts suitable for activity xxx
*/
function invoiceAccounts() {
return $this->relatedAccounts('invoices', array('order' => 'name'));
}
function receiptAccounts() {
return $this->relatedAccounts('receipts', array('order' => 'name'));
}
function depositAccounts() {
return $this->relatedAccounts('deposits', array('order' => 'name'));
}
function refundAccounts() {
return $this->relatedAccounts('refunds', array('order' => 'name'));
}
function invoiceAccounts() { return $this->relatedAccounts('invoices'); }
function receiptAccounts() { return $this->relatedAccounts('receipts'); }
function depositAccounts() { return $this->relatedAccounts('deposits'); }
function refundAccounts() { return $this->relatedAccounts('refunds'); }
/**************************************************************************

View File

@@ -41,14 +41,15 @@ class Contact extends AppModel {
function saveContact($id, $data) {
// Establish a display name if not already given
if (!$data['Contact']['display_name'])
if (!$data['Contact']['display_name'] &&
$data['Contact']['first_name'] && $data['Contact']['last_name'])
$data['Contact']['display_name'] =
(($data['Contact']['first_name'] &&
$data['Contact']['last_name'])
? $data['Contact']['last_name'] . ', ' . $data['Contact']['first_name']
: ($data['Contact']['first_name']
? $data['Contact']['first_name']
: $data['Contact']['last_name']));
$data['Contact']['last_name'] . ', ' . $data['Contact']['first_name'];
foreach (array('last_name', 'first_name', 'company_name') AS $fld) {
if (!$data['Contact']['display_name'] && $data['Contact'][$fld])
$data['Contact']['display_name'] = $data['Contact'][$fld];
}
// Save the contact data
$this->create();

View File

@@ -54,17 +54,19 @@ class Customer extends AppModel {
* function: leaseIds
* - Returns the lease IDs for the given customer
*/
function leaseIds($id) {
function leaseIds($id, $current = false) {
$Lease = $current ? 'CurrentLease' : 'Lease';
$this->cacheQueries = true;
$customer = $this->find('first',
array('contain' =>
array('Lease' => array('fields' => array('id'))),
array($Lease => array('fields' => array('id'))),
'fields' => array(),
'conditions' => array(array('Customer.id' => $id))));
$this->cacheQueries = false;
$ids = array();
foreach ($customer['Lease'] AS $lease)
foreach ($customer[$Lease] AS $lease)
$ids[] = $lease['id'];
return $ids;

21
models/default_option.php Normal file
View File

@@ -0,0 +1,21 @@
<?php
class DefaultOption extends AppModel {
var $belongsTo =
array('OptionValue',
);
function values($name = null) {
$this->prEnter(compact('name'));
$query = array();
$this->queryInit($query);
$query['link']['DefaultOption'] = array();
$query['link']['DefaultOption']['type'] = 'INNER';
$query['link']['DefaultOption']['fields'] = array();
return $this->prReturn($this->OptionValue->values($name, $query));
}
}

View File

@@ -0,0 +1,21 @@
<?php
class DefaultPermission extends AppModel {
var $belongsTo =
array('PermissionValue',
);
function values($name = null) {
$this->prEnter(compact('name'));
$query = array();
$this->queryInit($query);
$query['link']['DefaultPermission'] = array();
$query['link']['DefaultPermission']['type'] = 'INNER';
$query['link']['DefaultPermission']['fields'] = array();
return $this->prReturn($this->PermissionValue->values($name, $query));
}
}

38
models/group.php Normal file
View File

@@ -0,0 +1,38 @@
<?php
class Group extends AppModel {
var $hasMany =
array('GroupOption',
'Membership',
);
var $knows =
array('User',
'Site',
);
static $current_group_ids;
function currentGroupIds() {
if (empty(self::$current_group_ids))
self::$current_group_ids = $this->groupIds();
if (empty(self::$current_group_ids))
// We must force a stop here, since this is typically
// called very early on, and so will cause a recursive
// crash as we try to render the internal error and
// again stumble on this problem.
$this->INTERNAL_ERROR('INVALID MEMBERSHIP', 0, true);
return self::$current_group_ids;
}
function groupIds($user_id = null, $site_id = null) {
if (empty($user_id))
$user_id = $this->User->currentUserId();
if (empty($site_id))
$site_id = $this->Site->currentSiteId();
return $this->Membership->memberGroups($user_id, $site_id);
}
}

25
models/group_option.php Normal file
View File

@@ -0,0 +1,25 @@
<?php
class GroupOption extends AppModel {
var $belongsTo =
array('Group',
'OptionValue',
);
function values($ids, $name = null) {
$this->prEnter(compact('id', 'name'));
$query = array();
$this->queryInit($query);
$query['link']['GroupOption'] = array();
$query['link']['GroupOption']['fields'] = array();
$query['link']['GroupOption']['Group'] = array();
$query['link']['GroupOption']['Group']['fields'] = array();
$query['conditions'][] = array('Group.id' => $ids);
$query['order'][] = 'Group.rank';
return $this->prReturn($this->OptionValue->values($name, $query));
}
}

View File

@@ -0,0 +1,25 @@
<?php
class GroupPermission extends AppModel {
var $belongsTo =
array('Group',
'PermissionValue',
);
function values($ids, $name = null) {
$this->prEnter(compact('id', 'name'));
$query = array();
$this->queryInit($query);
$query['link']['GroupPermission'] = array();
$query['link']['GroupPermission']['fields'] = array();
$query['link']['GroupPermission']['Group'] = array();
$query['link']['GroupPermission']['Group']['fields'] = array();
$query['conditions'][] = array('Group.id' => $ids);
$query['order'][] = 'Group.rank';
return $this->prReturn($this->PermissionValue->values($name, $query));
}
}

37
models/membership.php Normal file
View File

@@ -0,0 +1,37 @@
<?php
class Membership extends AppModel {
var $belongsTo =
array('User',
'Site',
'Group'
);
function memberGroups($user_id, $site_id) {
$this->prEnter(compact('user_id', 'site_id'));
$this->cacheQueries = true;
$groups = $this->find('all', array
('recursive' => -1,
'fields' => array('group_id'),
'conditions' => array(array('user_id' => $user_id),
array('site_id' => $site_id)),
));
$this->cacheQueries = false;
if (empty($groups))
return $this->prReturn(null);
$group_ids = array();
foreach ($groups AS $group)
$group_ids[] = $group['Membership']['group_id'];
return $this->prReturn($group_ids);
}
function memberOf($user_id, $site_id) {
$groups = $this->memberGroups($user_id, $site_id);
return (!empty($groups));
}
}

76
models/option.php Normal file
View File

@@ -0,0 +1,76 @@
<?php
class Option extends AppModel {
var $hasMany =
array('OptionValue',
);
var $knows =
array('User', 'Site', 'Group');
static $option_set = array();
function getAll($name, $force = false) {
/* $this->prClassLevel(30); */
/* //$this->OptionValue->prClassLevel(30); */
/* $this->Group->Membership->prClassLevel(30); */
/* $this->OptionValue->SiteOption->prClassLevel(30); */
/* $this->OptionValue->UserOption->prClassLevel(30); */
/* $this->OptionValue->GroupOption->prClassLevel(30); */
/* $this->OptionValue->DefaultOption->prClassLevel(30); */
$this->prEnter(compact('name'));
if (!empty(self::$option_set[$name]) && !$force)
return $this->prReturn(self::$option_set[$name]);
self::$option_set[$name] = array();
$site_id = $this->Site->currentSiteId();
$user_id = $this->User->currentUserId();
$group_ids = $this->Group->currentGroupIds();
/* $site_id = 2; */
/* $user_id = 4; */
/* $group_ids = $this->Group->groupIds($user_id, $site_id); */
if (!empty($site_id))
self::$option_set[$name] =
array_merge(self::$option_set[$name],
$this->OptionValue->SiteOption->values($site_id, $name));
if (!empty($user_id))
self::$option_set[$name] =
array_merge(self::$option_set[$name],
$this->OptionValue->UserOption->values($user_id, $name));
if (!empty($group_ids))
self::$option_set[$name] =
array_merge(self::$option_set[$name],
$this->OptionValue->GroupOption->values($group_ids, $name));
self::$option_set[$name] =
array_merge(self::$option_set[$name],
$this->OptionValue->DefaultOption->values($name));
return $this->prReturn(self::$option_set[$name]);
}
function get($name) {
$this->prEnter(compact('name'));
$values = $this->getAll($name);
if (empty($values))
return null;
return $this->prReturn($values[0]);
}
function enabled($name) {
$val = $this->get($name);
return (!empty($val));
}
function disabled($name) {
return (!$this->enabled($name));
}
}

35
models/option_value.php Normal file
View File

@@ -0,0 +1,35 @@
<?php
class OptionValue extends AppModel {
var $belongsTo =
array('Option',
);
var $hasMany =
array('UserOption',
'SiteOption',
'GroupOption',
'DefaultOption',
);
function values($name = null, $query = null) {
$this->prEnter(compact('name', 'query'));
$this->queryInit($query);
$query['link']['Option'] = array();
if (!empty($name)) {
$query['conditions'][] = array('Option.name' => $name);
$query['link']['Option']['fields'] = array();
}
$this->cacheQueries = true;
$values = array();
foreach ($this->find('all', $query) AS $result)
$values[] = $result['OptionValue']['value'];
$this->cacheQueries = false;
return $this->prReturn($values);
}
}

105
models/permission.php Normal file
View File

@@ -0,0 +1,105 @@
<?php
class Permission extends AppModel {
var $hasMany =
array('PermissionValue',
);
var $knows =
array('User', 'Site', 'Group');
static $permission_set = array();
function getAll($name, $force = false) {
/* $this->prClassLevel(30); */
/* $this->PermissionValue->prClassLevel(30); */
/* $this->Group->Membership->prClassLevel(30); */
/* $this->PermissionValue->SitePermission->prClassLevel(30); */
/* $this->PermissionValue->UserPermission->prClassLevel(30); */
/* $this->PermissionValue->GroupPermission->prClassLevel(30); */
/* $this->PermissionValue->DefaultPermission->prClassLevel(30); */
$this->prEnter(compact('name'));
if (!empty(self::$permission_set[$name]) && !$force)
return $this->prReturn(self::$permission_set[$name]);
self::$permission_set[$name] = array();
$site_id = $this->Site->currentSiteId();
$user_id = $this->User->currentUserId();
$group_ids = $this->Group->currentGroupIds();
/* $site_id = 1; */
/* $user_id = 2; */
/* $group_ids = $this->Group->groupIds($user_id, $site_id); */
if (empty($group_ids)) {
self::$permission_set[$name][$name][] = array('access' => 'DENY', 'level' => null);
$site_id = null;
$user_id = null;
}
if (!empty($site_id))
self::$permission_set[$name] =
array_merge(self::$permission_set[$name],
$this->PermissionValue->SitePermission->values($site_id, $name));
if (!empty($user_id))
self::$permission_set[$name] =
array_merge(self::$permission_set[$name],
$this->PermissionValue->UserPermission->values($user_id, $name));
if (!empty($group_ids)) {
self::$permission_set[$name] =
array_merge(self::$permission_set[$name],
$this->PermissionValue->GroupPermission->values($group_ids, $name));
self::$permission_set[$name] =
array_merge(self::$permission_set[$name],
$this->PermissionValue->DefaultPermission->values($name));
self::$permission_set[$name][] = array('access' => 'ALLOW', 'level' => null);
}
return $this->prReturn(self::$permission_set[$name]);
}
function get($name) {
$this->prEnter(compact('name'));
// REVISIT <AP>: 20090827
// This is a pretty crappy algorithm. How do we decide whether DENY really
// means DENY, or whether an ALLOW has priority.
// Oh well, it works for now...
$values = $this->getAll($name);
$result = array_shift($values);
foreach ($values AS $value)
if (empty($result['level']) || (!empty($value['level']) && $value['level'] < $result['level']))
$result['level'] = $value['level'];
if ($result['access'] !== 'ALLOW')
$result['level'] = 9999999;
return $this->prReturn($result);
}
function allow($name) {
$this->prEnter(compact('name'));
$result = $this->get($name);
return $this->prReturn($result['access'] === 'ALLOW');
}
function deny($name) {
$this->prEnter(compact('name'));
return $this->prReturn(!$this->allow($name));
}
function level($name) {
$this->prEnter(compact('name'));
$result = $this->get($name);
return $this->prReturn($result['level']);
}
}

View File

@@ -0,0 +1,36 @@
<?php
class PermissionValue extends AppModel {
var $belongsTo =
array('Permission',
);
var $hasMany =
array('UserPermission',
'SitePermission',
'GroupPermission',
'DefaultPermission',
);
function values($name = null, $query = null) {
$this->prEnter(compact('name', 'query'));
$this->queryInit($query);
$query['link']['Permission'] = array();
if (!empty($name)) {
$query['conditions'][] = array('Permission.name' => $name);
$query['link']['Permission']['fields'] = array();
}
$this->cacheQueries = true;
$values = array();
foreach ($this->find('all', $query) AS $result)
$values[] = array('access' => $result['PermissionValue']['access'],
'level' => $result['PermissionValue']['level']);
$this->cacheQueries = false;
return $this->prReturn($values);
}
}

View File

@@ -1,16 +1,37 @@
<?php
class Site extends AppModel {
var $name = 'Site';
var $validate = array(
'id' => array('numeric'),
'name' => array('notempty')
);
var $hasMany = array(
'SiteArea',
var $hasMany =
array('SiteArea',
'SiteOption',
'Membership',
);
static $current_site_id;
function currentSiteId() {
if (!empty(self::$current_site_id))
return self::$current_site_id;
// REVISIT <AP>: 20090827
// Must get the actual site
$code = 'VSS';
$site = $this->find
('first',
array('recursive' => -1,
'conditions' => compact('code')));
if (!empty($site['Site']['id']))
self::$current_site_id = $site['Site']['id'];
else
// We must force a stop here, since this is typically
// called very early on, and so will cause a recursive
// crash as we try to render the internal error and
// again stumble on this problem.
$this->INTERNAL_ERROR('UNKNOWN SITE', 0, true);
return self::$current_site_id;
}
}
?>

24
models/site_option.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
class SiteOption extends AppModel {
var $belongsTo =
array('Site',
'OptionValue',
);
function values($id, $name = null) {
$this->prEnter(compact('id', 'name'));
$query = array();
$this->queryInit($query);
$query['link']['SiteOption'] = array();
$query['link']['SiteOption']['fields'] = array();
$query['link']['SiteOption']['Site'] = array();
$query['link']['SiteOption']['Site']['fields'] = array();
$query['conditions'][] = array('Site.id' => $id);
return $this->prReturn($this->OptionValue->values($name, $query));
}
}

View File

@@ -0,0 +1,24 @@
<?php
class SitePermission extends AppModel {
var $belongsTo =
array('Site',
'PermissionValue',
);
function values($id, $name = null) {
$this->prEnter(compact('id', 'name'));
$query = array();
$this->queryInit($query);
$query['link']['SitePermission'] = array();
$query['link']['SitePermission']['fields'] = array();
$query['link']['SitePermission']['Site'] = array();
$query['link']['SitePermission']['Site']['fields'] = array();
$query['conditions'][] = array('Site.id' => $id);
return $this->prReturn($this->PermissionValue->values($name, $query));
}
}

View File

@@ -350,10 +350,14 @@ class Transaction extends AppModel {
if (isset($ids['transaction_id']))
$ids['deposit_id'] = $ids['transaction_id'];
if (!empty($ids['deposit_id']) && !empty($control['update_tender'])) {
$this->pr(21, array_intersect_key($ids, array('deposit_id'=>1))
+ array_intersect_key($data['control'], array('update_tender'=>1)));
if (!empty($ids['deposit_id']) && !empty($data['control']['update_tender'])) {
$this->pr(21, compact('tender_groups'));
foreach ($tender_groups AS $group => $tender_ids) {
$entry_id = $ids['entries'][$group]['DoubleEntry']['Entry2']['ledger_entry_id'];
$this->pr(10, compact('group', 'tender_ids', 'entry_id'));
$this->pr(19, compact('group', 'tender_ids', 'entry_id'));
$this->LedgerEntry->Tender->updateAll
(array('Tender.deposit_transaction_id' => $ids['deposit_id'],
'Tender.deposit_ledger_entry_id' => $entry_id),
@@ -530,6 +534,8 @@ class Transaction extends AppModel {
(in_array($transaction['type'], array('INVOICE', 'RECEIPT'))
&& empty($transaction['customer_id']))
) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Transaction verification failed');
return $this->prReturn(false);
}
@@ -545,6 +551,8 @@ class Transaction extends AppModel {
}
if (!empty($se) &&
!$this->StatementEntry->verifyStatementEntry($se)) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Transaction entry verification failed');
return $this->prReturn(false);
}
}
@@ -584,8 +592,11 @@ class Transaction extends AppModel {
// Save transaction to the database
$this->create();
if (!$this->save($transaction))
if (!$this->save($transaction)) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Failed to save Transaction');
return $this->prReturn(array('error' => true) + $ret);
}
$ret['transaction_id'] = $transaction['id'] = $this->id;
// Add the entries
@@ -661,6 +672,11 @@ class Transaction extends AppModel {
if (!empty($transaction['customer_id'])) {
$this->Customer->update($transaction['customer_id']);
}
if (!empty($ret['error']))
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Failed to save Transaction');
return $this->prReturn($ret);
}
@@ -681,8 +697,11 @@ class Transaction extends AppModel {
$this->prEnter(compact('control', 'transaction', 'entries', 'split'));
// Verify that we have a transaction
if (empty($transaction['id']))
if (empty($transaction['id'])) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Invalid Transaction ID for adding entries');
return $this->prReturn(array('error' => true));
}
// If the entries are not already split, do so now.
if ($split) {
@@ -742,6 +761,10 @@ class Transaction extends AppModel {
}
}
if (!empty($ret['error']))
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Failed to save Transaction Entries');
return $this->prReturn($ret);
}
@@ -762,8 +785,11 @@ class Transaction extends AppModel {
// Verify that we have a transaction and entries
if (empty($transaction) ||
(empty($entries) && empty($control['allow_no_entries'])))
(empty($entries) && empty($control['allow_no_entries']))) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Split Entries failed to validate');
return $this->prReturn(array('error' => true));
}
// set ledger ID as the current ledger of the specified account
if (empty($transaction['ledger_id']))
@@ -972,8 +998,11 @@ class Transaction extends AppModel {
));
$this->pr(20, compact('nsf_ledger_entry'));
if (!$nsf_ledger_entry)
if (!$nsf_ledger_entry) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Failed to locate NSF ledger entry');
return $this->prReturn(array('error' => true) + $ret);
}
// Build a transaction to adjust all of the statement entries
$rollback =

View File

@@ -87,6 +87,23 @@ class Unit extends AppModel {
return $this->prReturn(true);
}
function locked($enum) {
return $this->statusCheck($enum, 'LOCKED', false, null, false);
}
function conditionLocked() {
//return array('Unit.status' => 'LOCKED');
return ('Unit.status >= ' . $this->statusValue('LOCKED'));
}
function liened($enum) {
return $this->statusCheck($enum, 'LIENED', false, null, false);
}
function conditionLiened() {
return ('Unit.status >= ' . $this->statusValue('LIENED'));
}
function occupied($enum) {
return $this->statusCheck($enum, 'OCCUPIED', false, null, false);
}
@@ -115,6 +132,7 @@ class Unit extends AppModel {
}
function available($enum) { return $this->vacant($enum); }
function conditionAvailable() { return $this->conditionVacant($enum); }
/**************************************************************************

View File

@@ -1,25 +1,64 @@
<?php
class UnitSize extends AppModel {
var $name = 'UnitSize';
var $validate = array(
'id' => array('numeric'),
'unit_type_id' => array('numeric'),
'code' => array('notempty'),
'name' => array('notempty'),
'width' => array('numeric'),
'depth' => array('numeric'),
'deposit' => array('money'),
'amount' => array('money')
);
var $belongsTo = array(
var $belongsTo =
array(
'UnitType',
);
var $hasMany = array(
var $hasMany =
array(
'Unit',
);
/**************************************************************************
**************************************************************************
**************************************************************************
* function: stats
* - Returns summary data from the requested unit size.
*/
function stats($id = null) {
$this->prEnter(compact('id'));
// Right now, we only work with id not null
if (!$id)
return null;
$stats = array();
// Get the total number of units this size
$stats['all'] =
$this->find('count',
array('link' => array('Unit'),
'conditions' => array(array('UnitSize.id' => $id)),
));
// Get numbers for units in the various states
foreach (array('unavailable', 'vacant', 'occupied', 'locked', 'liened') AS $status) {
$statusfunc = 'condition' . ucfirst($status);
$stats[$status] =
$this->find('count',
array('link' => array('Unit'),
'conditions' => array(array('UnitSize.id' => $id),
$this->Unit->{$statusfunc}()),
));
}
// Count up each unit by physical status
foreach
($this->find('all',
array('link' => array('Unit' => array('fields' => array())),
'fields' => array('Unit.status', 'COUNT(Unit.id) AS total'),
'conditions' => array(array('UnitSize.id' => $id)),
'group' => 'Unit.status',
)) AS $status) {
$stats['status'][$status['Unit']['status']] = $status[0]['total'];
}
// Return the collection
return $this->prReturn($stats);
}
}
?>

View File

@@ -1,16 +1,50 @@
<?php
class UnitType extends AppModel {
var $name = 'UnitType';
var $validate = array(
'id' => array('numeric'),
'code' => array('notempty'),
'name' => array('notempty')
);
var $hasMany = array(
var $hasMany =
array(
'UnitSize',
);
/**************************************************************************
**************************************************************************
**************************************************************************
* function: relatedTypes
* - Returns an array of types related by similar attributes
*/
function relatedTypes($attribute, $extra = null) {
$this->cacheQueries = true;
$types = $this->find('all', array
('fields' => array('UnitType.id', 'UnitType.name'),
'conditions' => array('UnitType.'.$attribute => true),
'order' => array('UnitType.name'),
) + (isset($extra) ? $extra : array())
);
$this->cacheQueries = false;
// Rearrange to be of the form (id => name)
$rel_types = array();
foreach ($types AS $type) {
$rel_types[$type['UnitType']['id']] = $type['UnitType']['name'];
}
return $rel_types;
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: xxxTypes
* - Returns an array of types suitable for activity xxx
*/
function residentialTypes() { return $this->relatedTypes('residential'); }
function enclosedTypes() { return $this->relatedTypes('enclosed'); }
function climateTypes() { return $this->relatedTypes('climate'); }
function outdoorTypes() { return $this->relatedTypes('outdoor'); }
function coveredTypes() { return $this->relatedTypes('covered'); }
}
?>

39
models/user.php Normal file
View File

@@ -0,0 +1,39 @@
<?php
class User extends AppModel {
var $hasMany =
array('UserOption',
'Membership',
);
static $current_user_id;
function currentUser() {
if (!empty($_SERVER['REMOTE_USER']))
return $_SERVER['REMOTE_USER'];
return null;
}
function currentUserId() {
if (!empty(self::$current_user_id))
return self::$current_user_id;
$user = $this->find
('first',
array('recursive' => -1,
'conditions' => array('login' => $this->currentUser())));
if (!empty($user['User']['id']))
self::$current_user_id = $user['User']['id'];
else
// We must force a stop here, since this is typically
// called very early on, and so will cause a recursive
// crash as we try to render the internal error and
// again stumble on this problem.
$this->INTERNAL_ERROR('UNKNOWN USER', 0, true);
return self::$current_user_id;
}
}

24
models/user_option.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
class UserOption extends AppModel {
var $belongsTo =
array('User',
'OptionValue',
);
function values($id, $name = null) {
$this->prEnter(compact('id', 'name'));
$query = array();
$this->queryInit($query);
$query['link']['UserOption'] = array();
$query['link']['UserOption']['fields'] = array();
$query['link']['UserOption']['User'] = array();
$query['link']['UserOption']['User']['fields'] = array();
$query['conditions'][] = array('User.id' => $id);
return $this->prReturn($this->OptionValue->values($name, $query));
}
}

View File

@@ -0,0 +1,24 @@
<?php
class UserPermission extends AppModel {
var $belongsTo =
array('User',
'PermissionValue',
);
function values($id, $name = null) {
$this->prEnter(compact('id', 'name'));
$query = array();
$this->queryInit($query);
$query['link']['UserPermission'] = array();
$query['link']['UserPermission']['fields'] = array();
$query['link']['UserPermission']['User'] = array();
$query['link']['UserPermission']['User']['fields'] = array();
$query['conditions'][] = array('User.id' => $id);
return $this->prReturn($this->PermissionValue->values($name, $query));
}
}

View File

@@ -178,20 +178,8 @@ echo $this->element('statement_entries', array
<script type="text/javascript"><!--
$(document).ready(function(){
$("#TxFromDate")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
$("#TxThroughDate")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker('TxFromDate');
datepicker('TxThroughDate');
resetForm();
});
--></script>

View File

@@ -16,7 +16,6 @@ if (isset($account['Account']))
$account = $account['Account'];
$rows = array();
$rows[] = array('ID', $account['id']);
$rows[] = array('Name', $account['name']);
$rows[] = array('Type', $account['type']);
$rows[] = array('External Name', $account['external_name']);
@@ -78,12 +77,12 @@ echo $this->element('ledger_entries', array
(// Grid configuration
'config' => array
('grid_div_id' => 'ledger-ledger-entry-list',
'caption' => ("Current Ledger: " .
"(". $current_ledger['name'] .")"),
'caption' => "Current Ledger: #{$current_ledger['sequence']}",
'filter' => array('Ledger.id' => $current_ledger['id']),
'exclude' => array('Account', 'Amount', 'Cr/Dr', 'Balance',
empty($account['receipts']) ? 'Tender' : null),
'include' => array('Debit', 'Credit', 'Sub-Total'),
'limit' => 50,
)));
@@ -102,6 +101,7 @@ echo $this->element('ledger_entries', array
'exclude' => array('Account', 'Amount', 'Cr/Dr', 'Balance',
empty($account['receipts']) ? 'Tender' : null),
'include' => array('Debit', 'Credit', 'Sub-Total'),
'limit' => 50,
)));

View File

@@ -45,6 +45,7 @@ function contactMethodDiv($obj, $type, $legend, $values = null) {
' CLASS="'.$type.'-method-%{id}-source" ' . "\n" .
' ID="'.$type.'-method-%{id}-source-'.$stype.'"' . "\n" .
' VALUE="'.$stype.'"' . "\n" .
($stype == 'new' ? ' CHECKED' . "\n" : '') .
' />' . "\n" .
' <LABEL FOR="'.$type.'-method-%{id}-source-'.$stype.'">'.$sname.'</LABEL>' . "\n" .
' ';
@@ -76,21 +77,30 @@ function contactMethodDiv($obj, $type, $legend, $values = null) {
'fields' => array
(
'preference' => array
('opts' => array
('label_attributes' => array('class' => 'required'),
'opts' => array
('options' => $obj->varstore['methodPreferences'],
'selected' => (isset($values) ? $values['ContactsMethod']['preference'] : null),
)),
),
'after' => "Intended purpose for this method of communication.",
),
'type' => array
('opts' => array
('label_attributes' => array('class' => 'required'),
'opts' => array
('options' => $obj->varstore['methodTypes'],
'selected' => (isset($values) ? $values['ContactsMethod']['type'] : null),
)),
),
'after' => "How / Where this communication reaches the contact.",
),
'comment' => array
('opts' => array
('label_attributes' => array('class' => 'optional empty'),
'opts' => array
('value' => (isset($values) ? $values['ContactsMethod']['comment'] : null),
)),
),
'after' => "Optional: Comments on how this form of communication relates to the contact.",
),
))) . "\n" .
@@ -113,16 +123,23 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
if ($type === 'phone') {
if ($stype === 'existing') {
$fields = array
('id' => array('name' => 'Phone/Ext',
('id' => array('label_attributes' => array('class' => 'required empty'),
'name' => 'Phone/Ext',
'opts' => array('options' => $obj->varstore['contactPhones'])),
);
}
elseif ($stype === 'new') {
$fields = array
('type' => array('opts' => array('options' => $obj->varstore['phoneTypes'])),
'phone' => true,
'ext' => array('name' => "Extension"),
'comment' => true,
('type' => array('label_attributes' => array('class' => 'required'),
'opts' => array('options' => $obj->varstore['phoneTypes']),
'after' => "Physical type of the phone."),
'phone' => array('label_attributes' => array('class' => 'required empty'),
'after' => "Required: Phone number."),
'ext' => array('name' => "Extension",
'label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Extension number."),
'comment' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Comments about this phone number."),
);
}
elseif ($stype === 'show') {
@@ -149,12 +166,19 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
}
elseif ($stype === 'new') {
$fields = array
('address' => true,
'city' => true,
'state' => true,
'postcode' => array('name' => 'Zip Code'),
'country' => true,
'comment' => true,
('address' => array('label_attributes' => array('class' => 'required empty'),
'after' => "Required: First line of mailing address."),
'city' => array('label_attributes' => array('class' => 'required empty'),
'after' => "Required."),
'state' => array('label_attributes' => array('class' => 'required empty'),
'after' => "Required."),
'postcode' => array('name' => 'Zip Code',
'label_attributes' => array('class' => 'required empty'),
'after' => "Required."),
'country' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: USA is presumed."),
'comment' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Comments about this mailing address."),
);
}
elseif ($stype === 'show') {
@@ -177,13 +201,16 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
if ($stype === 'existing') {
$fields = array
('id' => array('name' => 'Email',
'label_attributes' => array('class' => 'required'),
'opts' => array('options' => $obj->varstore['contactEmails'])),
);
}
elseif ($stype === 'new') {
$fields = array
('email' => true,
'comment' => true,
('email' => array('label_attributes' => array('class' => 'required empty'),
'after' => "Required: E-mail address."),
'comment' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Comments about this email address."),
);
}
elseif ($stype === 'show') {
@@ -204,7 +231,7 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
'<div ' . "\n" .
' class="'.$type.'-%{id}-div"' . "\n" .
' id="'.$type.'-%{id}-'.$stype.'-div"' . "\n" .
(isset($values) ? '' : ' STYLE="display:none;"' . "\n") .
((isset($values) || $stype == 'new') ? '' : ' STYLE="display:none;"' . "\n") .
'>' . "\n" .
$obj->element
@@ -319,8 +346,27 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
.slideDown();
}
function setEmpty(input_elem) {
selector = "label[for=" + $(input_elem).attr("id") + "]";
if ($(input_elem).val() == '')
$(selector).addClass('empty');
else
$(selector).removeClass('empty');
}
$(document).ready(function(){
resetForm();
// In case refresh is hit with populated fields
$(":input").each(function(i,elem){ setEmpty(elem); });
// keyup doesn't catch cut from menu
$(":input").live('keyup', function(){
setEmpty(this);
});
$(":input").live('mouseup', function(){
setEmpty(this);
});
});
--></script>
@@ -345,17 +391,30 @@ echo($this->element
array('class' => 'item contact detail',
'caption' => isset($this->data['Contact']) ? 'Edit Contact' : 'New Contact',
'fields' => array
('first_name' => true,
'last_name' => true,
'middle_name' => true,
'display_name' => true,
'company_name' => array('name' => 'Company'),
'id_federal' => array('name' => 'SSN'),
'id_local' => array('name' => 'ID #'),
'id_local_state' => array('name' => 'ID State'),
('last_name' => array('label_attributes' => array('class' => 'recommended empty'),
'after' => "Recommended."),
'first_name' => array('label_attributes' => array('class' => 'recommended empty'),
'after' => "Recommended."),
'middle_name' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional."),
'company_name' => array('name' => 'Company',
'label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Company name, if corporate contact."),
'display_name' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional with first/last name; Required otherwise."),
'id_federal' => array('name' => 'SSN',
'label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Social Security Number."),
'id_local' => array('name' => 'ID #',
'label_attributes' => array('class' => 'recommended empty'),
'after' => "Recommended: Driver's license, for example."),
'id_local_state' => array('name' => 'ID State',
'label_attributes' => array('class' => 'recommended empty'),
'after' => "Recommended: State which issued the ID."),
/* 'id_local_exp' => array('name' => 'ID Expiration', */
/* 'opts' => array('empty' => true)), */
'comment' => true,
'comment' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Comments about this contact."),
))) . "\n");
echo $form->submit('Update') . "\n";

View File

@@ -17,6 +17,7 @@ if (isset($contact['Contact']))
$contact = $contact['Contact'];
$rows = array();
$rows[] = array('Display Name', $contact['display_name']);
$rows[] = array('First Name', $contact['first_name']);
$rows[] = array('Middle Name', $contact['middle_name']);
$rows[] = array('Last Name', $contact['last_name']);
@@ -135,6 +136,7 @@ echo $this->element('customers', array
'config' => array
('caption' => 'Related Customers',
'filter' => array('Contact.id' => $contact['id']),
'include' => array('Relationship'),
)));

View File

@@ -42,11 +42,12 @@ function customerContactDiv($obj, $values = null, $primary = false) {
' CLASS="contact-%{id}-source" ' . "\n" .
' ID="contact-%{id}-source-'.$stype.'"' . "\n" .
' VALUE="'.$stype.'"' . "\n" .
//' CHECKED' . "\n" .
($stype == 'new' ? ' CHECKED' . "\n" : '') .
' />' . "\n" .
' <LABEL FOR="contact-%{id}-source-'.$stype.'">'.$sname.'</LABEL>' . "\n" .
' ';
}
$div .= "<P>(Phone numbers / Addresses can be added later)";
}
$div .= "\n";
@@ -75,23 +76,35 @@ function customerContactDiv($obj, $values = null, $primary = false) {
(
'Customer.primary_contact_entry' => array
('name' => 'Primary Contact',
'label_attributes' => array('class' => null),
'no_prefix' => true,
'opts' => array
('type' => 'radio',
'options' => array('%{id}' => false),
'value' => ($primary ? '%{id}' : 'bogus-value-to-suppress-hidden-input'),
)),
),
'after' => ("Check this button if this contact will be the primary" .
" contact for this customer (there can be only one primary" .
" contact"),
),
'type' => array
('opts' => array
('label_attributes' => array('class' => 'required'),
'opts' => array
('options' => $obj->varstore['contactTypes'],
'selected' => (isset($values) ? $values['ContactsCustomer']['type'] : null),
)),
),
'after' => "An actual tenant, or just an alternate contact?"
),
'comment' => array
('opts' => array
('label_attributes' => array('class' => 'optional empty'),
'opts' => array
('value' => (isset($values) ? $values['ContactsCustomer']['comment'] : null),
)),
),
'after' => "Optional: Comments on the relationship between this customer and this contact."
),
))) . "\n" .
@@ -115,22 +128,37 @@ function customerContactTypeDiv($obj, $stype, $values = null) {
if ($stype === 'existing') {
$fields = array
('id' => array('name' => 'Contact',
'opts' => array('options' => $obj->varstore['contacts'])),
'label_attributes' => array('class' => 'required empty'),
'opts' => array('options' => $obj->varstore['contacts']),
'after' => "Select the existing contact."),
);
}
elseif ($stype === 'new') {
$fields = array
('first_name' => true,
'last_name' => true,
'middle_name' => true,
'display_name' => true,
'company_name' => array('name' => 'Company'),
'id_federal' => array('name' => 'SSN'),
'id_local' => array('name' => 'ID #'),
'id_local_state' => array('name' => 'ID State'),
('last_name' => array('label_attributes' => array('class' => 'recommended empty'),
'after' => "Recommended."),
'first_name' => array('label_attributes' => array('class' => 'recommended empty'),
'after' => "Recommended."),
'middle_name' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional."),
'company_name' => array('name' => 'Company',
'label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Company name, if corporate contact."),
'display_name' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional with first/last name; Required otherwise."),
'id_federal' => array('name' => 'SSN',
'label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Social Security Number."),
'id_local' => array('name' => 'ID #',
'label_attributes' => array('class' => 'recommended empty'),
'after' => "Recommended: Driver's license, for example."),
'id_local_state' => array('name' => 'ID State',
'label_attributes' => array('class' => 'recommended empty'),
'after' => "Recommended: State which issued the ID."),
/* 'id_local_exp' => array('name' => 'ID Expiration', */
/* 'opts' => array('empty' => true)), */
'comment' => true,
'comment' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Comments about this contact."),
);
}
elseif ($stype === 'show') {
@@ -151,14 +179,14 @@ function customerContactTypeDiv($obj, $stype, $values = null) {
'<div ' . "\n" .
' class="contact-%{id}-div"' . "\n" .
' id="contact-%{id}-'.$stype.'-div"' . "\n" .
(isset($values) ? '' : ' STYLE="display:none;"' . "\n") .
((isset($values) || $stype == 'new') ? '' : ' STYLE="display:none;"' . "\n") .
'>' . "\n" .
$obj->element
($element,
array('class' => "item contact {$class}",
'field_prefix' => 'Contact.%{id}')
+ compact('rows', 'fields', 'column_class')) .
+ compact('rows', 'fields', 'row_class', 'column_class')) .
($stype === 'show'
? '<input type="hidden" name="data[Contact][%{id}][id]" value="'.$values['id'].'"/>' . "\n"
@@ -221,8 +249,28 @@ function customerContactTypeDiv($obj, $stype, $values = null) {
.slideDown();
}
function setEmpty(input_elem) {
selector = "label[for=" + $(input_elem).attr("id") + "]";
//$("#debug").append($(input_elem).attr("id") + ": " + $(input_elem).val() + "<BR>");
if ($(input_elem).val() == '')
$(selector).addClass('empty');
else
$(selector).removeClass('empty');
}
$(document).ready(function(){
resetForm();
// In case refresh is hit with populated fields
$(":input").each(function(i,elem){ setEmpty(elem); });
// keyup doesn't catch cut from menu
$(":input").live('keyup', function(){
setEmpty(this);
});
$(":input").live('mouseup', function(){
setEmpty(this);
});
});
--></script>
@@ -247,8 +295,12 @@ echo($this->element
array('class' => 'item customer detail',
'caption' => isset($this->data['Customer']) ? 'Edit Customer' : 'New Customer',
'fields' => array
('name' => true,
'comment' => true,
('name' => array('label_attributes' => array('class' => 'optional empty'),
'after' => ("Optional: If this field is left blank, the" .
" customer name will be set to the name of" .
" the primary contact, below.")),
'comment' => array('label_attributes' => array('class' => 'optional empty'),
'after' => 'Optional: Comments about this customer.'),
))) . "\n");
echo $form->submit(isset($this->data['Customer']) ? 'Update' : 'Add New Customer') . "\n";
@@ -268,6 +320,11 @@ echo $form->submit(isset($this->data['Customer']) ? 'Update' : 'Add New Customer
<?php
; // Alignment
if (!empty($movein['Unit']['id']))
echo $form->input("movein.Unit.id",
array('type' => 'hidden',
'value' => $movein['Unit']['id'])) . "\n";
echo $form->submit(isset($this->data['Customer']) ? 'Update' : 'Add New Customer') . "\n";
echo $form->submit('Cancel', array('name' => 'cancel')) . "\n";
echo $form->end() . "\n";

View File

@@ -28,17 +28,53 @@ Configure::write('debug', '0');
// other available options:
//clearForm: true, // clear all form fields after successful submit
//resetForm: true, // reset the form after successful submit
url: "<?php echo $html->url(array('controller' => 'transactions',
'action' => 'postReceipt', 0)); ?>"
};
// bind form using 'ajaxForm'
if ($('#receipt-form').ajaxForm != null)
$('#receipt-form').ajaxForm(options);
else
$('#repeat, label[for=repeat]').remove();
});
// pre-submit callback
function verifyRequest(formData, jqForm, options) {
//$("#debug").html('');
for (var i = 0; i < formData.length; ++i) {
//$("#debug").append(i + ') ' + dump(formData[i]) + '<BR>');
if (formData[i]['name'] == "data[Customer][id]" &&
!(formData[i]['value'] > 0)) {
//$("#debug").append('<P>Missing Customer ID');
alert("Must select a customer first");
return false;
}
if (formData[i]['name'] == "data[Transaction][stamp]" &&
formData[i]['value'] == '') {
//$("#debug").append('<P>Bad Stamp');
alert("Must enter a valid date stamp");
return false;
}
// Terrible way to accomplish this...
for (var j = 0; j < 20; ++j) {
if (formData[i]['name'] == "data[Entry]["+j+"][amount]" &&
!(formData[i]['value'] > 0)) {
//$("#debug").append('<P>Bad Amount');
alert("Must enter a valid amount");
return false;
}
}
}
//$("#debug").append('OK');
//return false;
$('#results').html('Working <BLINK>...</BLINK>');
// here we could return false to prevent the form from being submitted;
// returning anything other than false will allow the form submit to continue
return true;
}
@@ -112,20 +148,7 @@ function onRowSelect(grid_id, customer_id) {
// Set the customer id that will be returned with the form
$("#customer-id").val(customer_id);
// Get the item names from the grid
//$("#receipt-customer-id").html($(grid_id).getCell(customer_id, 'Customer-id'));
// REVISIT <AP>: 20090708
// This is not intended as a long term solution,
// but I need a way to enter data and then view
// the results. This link will help.
$("#receipt-customer-id").html('<A HREF="' +
"<?php echo $html->url(array('controller' => 'customers',
'action' => 'view')); ?>"
+ "/" +
$(grid_id).getCell(customer_id, 'Customer-id').replace(/^#/,'') +
'">' +
$(grid_id).getCell(customer_id, 'Customer-id') +
'</A>');
// Set the customer name, so the user knows who the receipt is for
$("#receipt-customer-name").html($(grid_id).getCell(customer_id, 'Customer-name'));
// Hide the "no customer" message and show the current customer
@@ -273,8 +296,7 @@ echo $this->element('customers', array
echo ('<DIV CLASS="receipt grid-selection-text">' .
'<DIV CLASS="customer-selection-valid" style="display:none">' .
'Customer <SPAN id="receipt-customer-id"></SPAN>' .
': <SPAN id="receipt-customer-name"></SPAN>' .
'Customer: <SPAN id="receipt-customer-name"></SPAN>' .
/* '<DIV CLASS="supporting">' . */
/* '<TABLE>' . */
@@ -377,29 +399,15 @@ Configure::write('debug', '0');
<script type="text/javascript"><!--
$(document).ready(function(){
$("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker('TransactionStamp');
$("#receipt-customer-id").html("INTERNAL ERROR");
$("#customer-id").val(0);
$("#receipt-customer-name").html("INTERNAL ERROR");
$("#receipt-balance").html("INTERNAL ERROR");
$("#receipt-charges-caption").html("Outstanding Charges");
<?php if (isset($customer['id'])): ?>
$("#customer-id").val(<?php echo $customer['id']; ?>);
//$("#receipt-customer-id").html("<?php echo '#'.$customer['id']; ?>");
$("#receipt-customer-id").html('<A HREF="' +
"<?php echo $html->url(array('controller' => 'customers',
'action' => 'view')); ?>"
+ "/" +
"<?php echo $customer['id']; ?>" +
'">#' +
"<?php echo $customer['id']; ?>" +
'</A>');
$("#receipt-customer-name").html("<?php echo $customer['name']; ?>");
$("#receipt-balance").html(fmtCurrency("<?php echo $stats['balance']; ?>"));
onGridState(null, 'hidden');

View File

@@ -61,7 +61,7 @@ echo $this->element('contacts', array
'config' => array
('caption' => 'Customer Contacts',
'filter' => array('Customer.id' => $customer['Customer']['id']),
'include' => array('Type', 'Active'),
'include' => array('Relationship'),
)));
@@ -75,6 +75,8 @@ echo $this->element('leases', array
('caption' => 'Lease History',
'filter' => array('Customer.id' => $customer['Customer']['id']),
'exclude' => array('Customer'),
'sort_column' => 'Move-In',
'sort_order' => 'DESC',
)));
@@ -89,8 +91,6 @@ echo $this->element('statement_entries', array
'filter' => array('Customer.id' => $customer['Customer']['id'],
'type !=' => 'VOID'),
'exclude' => array('Customer'),
'sort_column' => 'Effective',
'sort_order' => 'DESC',
)));
@@ -107,9 +107,8 @@ echo $this->element('ledger_entries', array
'Tender.id !=' => null,
//'Account.id !=' => '-AR-'
),
'exclude' => array('Account', 'Cr/Dr'),
'sort_column' => 'Date',
'sort_order' => 'DESC',
'include' => array('Transaction'),
'exclude' => array('Entry', 'Account', 'Cr/Dr'),
)));

View File

@@ -1,50 +1,17 @@
<?php /* -*- mode:PHP -*- */
echo '<div class="ledger-entry view">' . "\n";
echo '<div class="double-entry view">' . "\n";
// The two entry ids, debit and credit, are actually individual
// The two entries, debit and credit, are actually individual
// entries in separate accounts (each make up one of the two
// entries required for "double entry"). This, when we provide
// reconcile information, we're really providing reconcile info
// for two independent accounts. The reconciling entries,
// therefore, are those on the opposite side of the ledger in
// each account. For example, assume this "double" entry is
//
// debit: A/R credit: Cash amount: 55
//
// Then, our accounts might look like:
//
// RENT TAX A/R CASH BANK
// ------- ------- ------- ------- -------
// |20 | 20| | | <-- Unrelated
// | | |20 20| | <-- Unrelated
// | | | | |
// |50 | 50| | | <-- Rent paid by this entry
// | |5 5| | | <-- Tax paid by this entry
// | | |55 55| | <-- THIS ENTRY
// | | | | |
// | | | |75 75| <-- Deposit includes this entry
// | | | | |
//
// In this case, we're looking to provide reconcile information
// of A/R for (the credit side of) this entry, and also of Cash
// (for the debit side). Taking the accounts as individual
// entries, instead of the "double entry" representation in the
// database, we're actually providing information on the two
// A/R entries, 50 & 5, which are both debits, i.e. opposite
// entries to the credit of A/R. The cash account entry
// reconciles against the credit of 75. Again, this is the
// opposite entry to the debit of Cash.
//
// Thus, for our debit_ledger_id, we're reconciling against
// credits, and for our credit_ledger_id, against debits.
// entries required for "double entry").
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* LedgerEntry Detail Main Section
* DoubleEntry Detail Main Section
*/
$transaction = $entry['Transaction'];
@@ -55,7 +22,6 @@ $entries = array('debit' => $entry['DebitEntry'],
$entry = $entry['DoubleEntry'];
$rows = array();
$rows[] = array('ID', $entry['id']);
$rows[] = array('Transaction', $html->link('#'.$transaction['id'],
array('controller' => 'transactions',
'action' => 'view',
@@ -64,41 +30,17 @@ $rows[] = array('Timestamp', FormatHelper::datetime($transaction['stamp']
$rows[] = array('Comment', $entry['comment']);
echo $this->element('table',
array('class' => 'item ledger-entry detail',
'caption' => 'Double Ledger Entry Detail',
array('class' => 'item double-entry detail',
'caption' => 'Double Ledger Entry',
'rows' => $rows,
'column_class' => array('field', 'value')));
/**********************************************************************
* LedgerEntry Info Box
* Debit/Credit Entries
*/
/* echo '<div class="infobox">' . "\n"; */
/* foreach ($ledgers AS $type => $ledger) { */
/* //pr($ledger); */
/* if (!$ledger['Account']['trackable']) */
/* continue; */
/* $applied_caption = "Transfers applied"; */
/* $remaining_caption = "Unapplied amount"; */
/* $rows = array(); */
/* $rows[] = array($applied_caption, */
/* FormatHelper::currency($stats[$type]['amount_reconciled'])); */
/* $rows[] = array($remaining_caption, */
/* FormatHelper::currency($stats[$type]['amount_remaining'])); */
/* echo $this->element('table', */
/* array('class' => 'item summary', */
/* 'caption' => "{$ledger['Account']['name']} Ledger Entry", */
/* 'rows' => $rows, */
/* 'column_class' => array('field', 'value'), */
/* //'suppress_alternate_rows' => true, */
/* )); */
/* } */
/* echo '</div>' . "\n"; */
echo ('<DIV CLASS="ledger-double-entry">' . "\n");
foreach ($ledgers AS $type => $ledger) {
$rows = array();
@@ -114,21 +56,24 @@ foreach ($ledgers AS $type => $ledger) {
/* array('controller' => 'entries', */
/* 'action' => 'view', */
/* $entries[$type]['id']))); */
$rows[] = array('Account', $html->link($ledger['Account']['name'],
$rows[] = array('Account', ($ledger['link']
? $html->link($ledger['Account']['name'],
array('controller' => 'accounts',
'action' => 'view',
$ledger['Account']['id'])));
$rows[] = array('Ledger', $html->link('#' . $ledger['Account']['id']
. '-' . $ledger['sequence'],
$ledger['Account']['id']))
: $ledger['Account']['name']));
$rows[] = array('Ledger', ($ledger['link']
? $html->link('#' . $ledger['sequence'],
array('controller' => 'ledgers',
'action' => 'view',
$ledger['id'])));
$ledger['id']))
: '#' . $ledger['sequence']));
$rows[] = array('Amount', FormatHelper::currency($entries[$type]['amount']));
//$rows[] = array('Effect', $ledger['Account']['ftype'] == $type ? 'INCREASE' : 'DECREASE');
echo $this->element('table',
array('class' => array('item', $type, 'detail'),
'caption' => ucfirst($type) . ' Ledger Entry',
'caption' => ucfirst($type) . ' Entry',
'rows' => $rows,
'column_class' => array('field', 'value')));
}

View File

@@ -2,7 +2,6 @@
// Define the table columns
$cols = array();
$cols['ID'] = array('index' => 'Account.id', 'formatter' => 'id');
$cols['Name'] = array('index' => 'Account.name', 'formatter' => 'longname');
$cols['Type'] = array('index' => 'Account.type', 'formatter' => 'enum');
$cols['Entries'] = array('index' => 'entries', 'formatter' => 'number');
@@ -15,7 +14,7 @@ $cols['Comment'] = array('index' => 'Account.comment', 'formatter' => 'comment
$grid
->columns($cols)
->sortField('Name')
->defaultFields(array('ID', 'Name'))
->defaultFields(array('Name'))
->searchFields(array('Name'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Comment')));

View File

@@ -2,19 +2,18 @@
// Define the table columns
$cols = array();
$cols['ID'] = array('index' => 'Contact.id', 'formatter' => 'id');
$cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum');
$cols['Name'] = array('index' => 'Contact.display_name', 'formatter' => 'longname');
$cols['Last Name'] = array('index' => 'Contact.last_name', 'formatter' => 'name');
$cols['First Name'] = array('index' => 'Contact.first_name', 'formatter' => 'name');
$cols['Company'] = array('index' => 'Contact.company_name', 'formatter' => 'longname');
$cols['Type'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum');
$cols['Active'] = array('index' => 'ContactsCustomer.active', 'formatter' => 'enum');
$cols['Comment'] = array('index' => 'Contact.comment', 'formatter' => 'comment');
// Render the grid
$grid
->columns($cols)
->sortField('Last Name')
->defaultFields(array('ID', 'Last Name', 'First Name'))
->defaultFields(array('Last Name', 'First Name'))
->searchFields(array('Last Name', 'First Name', 'Company'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Type', 'Active', 'Comment')));
array_diff(array_keys($cols), array('Relationship', 'Comment')));

View File

@@ -2,7 +2,6 @@
// Define the table columns
$cols = array();
$cols['ID'] = array('index' => 'Customer.id', 'formatter' => 'id');
$cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum');
$cols['Name'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Last Name'] = array('index' => 'PrimaryContact.last_name', 'formatter' => 'name');
@@ -11,16 +10,11 @@ $cols['Leases'] = array('index' => 'current_lease_count', 'formatt
$cols['Balance'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Comment'] = array('index' => 'Customer.comment', 'formatter' => 'comment');
// Certain fields are only valid with a particular context
if (!isset($config['filter']['Contact.id']))
$grid->invalidFields('Relationship');
// Render the grid
$grid
->columns($cols)
->sortField('Name')
->defaultFields(array('ID', 'Name'))
->defaultFields(array('Name'))
->searchFields(array('Name', 'Last Name', 'First Name'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Comment')));
array_diff(array_keys($cols), array('Relationship', 'Comment')));

View File

@@ -1,116 +0,0 @@
<?php /* -*- mode:PHP -*- */
// Define the table columns
$cols = array();
$cols['Transaction'] = array('index' => 'Transaction.id', 'formatter' => 'id');
$cols['Entry'] = array('index' => 'LedgerEntry.id', 'formatter' => 'id');
$cols['Date'] = array('index' => 'Transaction.stamp', 'formatter' => 'date');
$cols['Effective'] = array('index' => 'LedgerEntry.effective_date', 'formatter' => 'date');
$cols['Through'] = array('index' => 'LedgerEntry.through_date', 'formatter' => 'date');
$cols['Account'] = array('index' => 'Account.name', 'formatter' => 'name');
$cols['Debit Account'] = array('index' => 'DebitAccount.name', 'formatter' => 'name');
$cols['Credit Account'] = array('index' => 'CreditAccount.name', 'formatter' => 'name');
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Lease'] = array('index' => 'Lease.number', 'formatter' => 'id');
$cols['Unit'] = array('index' => 'Unit.name', 'formatter' => 'name');
$cols['Source'] = array('index' => 'MonetarySource.name', 'formatter' => 'name');
$cols['Comment'] = array('index' => 'LedgerEntry.comment', 'formatter' => 'comment', 'width'=>150);
$cols['Amount'] = array('index' => 'LedgerEntry.amount', 'formatter' => 'currency');
$cols['Debit'] = array('index' => 'debit', 'formatter' => 'currency');
$cols['Credit'] = array('index' => 'credit', 'formatter' => 'currency');
$cols['Last Payment'] = array('index' => 'last_paid', 'formatter' => 'date');
$cols['Applied'] = array('index' => "applied", 'formatter' => 'currency');
$cols['Sub-Total'] = array('index' => 'subtotal-LedgerEntry.amount', 'formatter' => 'currency', 'sortable' => false);
if (isset($transaction_id) || isset($reconcile_id))
$grid->invalidFields('Transaction');
if (!isset($collected_account_id))
$grid->invalidFields('Last Payment');
if (isset($account_ftype) || isset($ledger_id) || isset($account_id) || isset($ar_account) || isset($customer_id))
$grid->invalidFields(array('Debit Account', 'Credit Account'));
else
$grid->invalidFields('Account');
if (isset($no_account) || $group_by_tx || isset($collected_account_id))
$grid->invalidFields(array('Account', 'Debit Account', 'Credit Account'));
if (isset($ledger_id) || isset($account_id) || isset($ar_account) || isset($customer_id)) {
$grid->invalidFields('Amount');
$cols['Sub-Total']['index'] = 'subtotal-balance';
} else {
$grid->invalidFields(array('Debit', 'Credit'));
$cols['Sub-Total']['index'] = 'subtotal-LedgerEntry.amount';
}
// group_by_tx SHOULD wipe out Customer, but the reality
// is that it works good at the present, so we'll leave it.
if (isset($lease_id) || isset($customer_id))
$grid->invalidFields(array('Customer'));
if (isset($lease_id) || $group_by_tx)
$grid->invalidFields(array('Lease', 'Unit'));
if (!isset($reconcile_id) && !isset($collected_account_id))
$grid->invalidFields('Applied');
else
$cols['Sub-Total']['index'] = 'subtotal-applied';
if (isset($account_ftype) || isset($collected_account_id))
$grid->invalidFields('Sub-Total');
// Now that columns are defined, establish basic grid parameters
$grid
->columns($cols)
->sortField('Date')
->defaultFields(array('Entry', 'Date', 'Amount', 'Credit', 'Debit'));
if (!isset($config['rows']) && !isset($collected_account_id)) {
$config['action'] = 'ledger';
$grid->limit(50);
}
if (isset($reconcile_id)) {
$config['action'] = 'reconcile';
$grid->customData(compact('reconcile_id'))->limit(20);
}
if (isset($collected_account_id)) {
$config['action'] = 'collected';
$account_id = $collected_account_id;
$grid->limit(50);
$grid->sortField('Last Payment');
}
if (isset($entry_ids))
$grid->id_list($entry_ids);
// Set up search fields if requested by caller
if (isset($searchfields))
$grid->searchFields(array('Customer', 'Unit'));
// Include custom data
$grid->customData(compact('ledger_id', 'account_id', 'ar_account',
'account_type', 'account_ftype', 'monetary_source_id',
'customer_id', 'lease_id', 'transaction_id', 'group_by_tx'));
// Render the grid
$grid
->render($this, isset($config) ? $config : null,
array('Transaction', 'Entry', 'Date', 'Effective', 'Last Payment',
'Account', 'Debit Account', 'Credit Account',
'Customer', 'Unit',
'Comment',
'Amount', 'Debit', 'Credit',
'Applied', 'Sub-Total')
);

View File

@@ -32,7 +32,7 @@ foreach ($fields AS $field => $config) {
$include_after = true;
}
if (empty($column_class))
$column_class = array();
if ($include_before)
$column_class[] = 'before';
@@ -79,7 +79,13 @@ foreach ($fields AS $field => $config) {
$cells[] = null;
}
if (empty($config['opts']['label']))
$name = $form->label($field, $config['name'],
empty($config['label_attributes'])
? null : $config['label_attributes']);
else
$name = $config['name'];
if (isset($config['with_name_before']))
$name = $config['with_name_before'] . $name;
elseif (isset($with_name_before))

View File

@@ -121,6 +121,11 @@ foreach ($jqGridColumns AS $header => &$col) {
// No special formatting for number
unset($col['formatter']);
}
elseif ($col['formatter'] === 'percentage') {
$col['formatter'] = array('--special' => 'percentageFormatter');
$default['width'] = 60;
$default['align'] = 'right';
}
elseif ($col['formatter'] === 'currency') {
// Use our custom formatting for currency
$col['formatter'] = array('--special' => 'currencyFormatter');
@@ -143,8 +148,14 @@ foreach ($jqGridColumns AS $header => &$col) {
// No special formatting for name
unset($col['formatter']);
}
elseif ($col['formatter'] === 'enum') {
elseif (preg_match("/^(long|short)?enum$/",
$col['formatter'], $matches)) {
$default['width'] = 60;
if (!empty($matches[1]) && $matches[1] === 'long')
$default['width'] *= 1.5;
if (!empty($matches[1]) && $matches[1] === 'short')
$default['width'] *= 0.7;
//$default['align'] = 'right';
// No special formatting for enum
@@ -161,7 +172,8 @@ foreach ($jqGridColumns AS $header => &$col) {
// Just a rough approximation to ensure columns
// are wide enough to fully display their header.
$min_width = strlen($header) * 10;
$min_width = strlen($header) * 7;
$min_width = 0; // REVISIT <AP>: 20090829; if/while jqGrid is fixed width
if ((!isset($default['width']) || $default['width'] < $min_width) && !$default['force'])
$default['width'] = $min_width;
}
@@ -234,6 +246,7 @@ $jqGrid_setup = array_merge
'colNames' => array_keys($jqGridColumns),
'colModel' => array('--special' => $jqGridColumns),
'height' => $height,
'width' => 700,
'rowNum' => $limit,
'rowList' => $limitOptions,
'sortname' => $sortname,
@@ -253,37 +266,46 @@ $jqGrid_setup = array_merge
// to kick this thing off.
?>
<DIV ID="<?php echo $grid_div_id; ?>" CLASS="<?php echo $grid_div_class; ?>">
<table id="<?php echo $grid_id; ?>" class="scroll"></table>
<div id="<?php echo $grid_id; ?>-pager" class="scroll" style="text-align:right"></div>
<?php if ($first_grid): ?>
<script type="text/javascript"><!--
jQuery(document).ready(function(){
currencyFormatter = function(cellval, opts, rowObject) {
var currencyFormatter = function(cellval, opts, rowObject) {
if (!cellval)
return "";
return fmtCurrency(cellval);
}
idFormatter = function(cellval, opts, rowObject) {
var percentageFormatter = function(cellval, opts, rowObject) {
var precision;
if (typeof(opts.colModel) != 'undefined' &&
typeof(opts.colModel.formatoptions) != 'undefined' &&
typeof(opts.colModel.formatoptions.precision) != 'undefined')
precision = opts.colModel.formatoptions.precision;
else
precision = 0;
amount = cellval.toString().replace(/\%/g,'');
amount = (amount*100).toFixed(precision);
return amount+'%';
}
var idFormatter = function(cellval, opts, rowObject) {
if (!cellval)
return cellval;
return '#'+cellval;
}
jQuery('#<?php echo $grid_id; ?>').jqGrid(
<?php echo FormatHelper::phpVarToJavascript($jqGrid_setup); ?>
).navGrid('#<?php echo $grid_id; ?>-pager',
{ view:false,
edit:false,
add:false,
del:false,
search:true,
refresh:true});
});
--></script>
<?php endif; ?>
<DIV ID="<?php echo $grid_div_id; ?>" CLASS="<?php echo $grid_div_class; ?>">
<table id="<?php echo $grid_id; ?>" class="scroll"></table>
<div id="<?php echo $grid_id; ?>-pager" class="scroll" style="text-align:right"></div>
<script type="text/javascript"><!--
jQuery(document).ready(function(){
jQuery('#<?php echo $grid_id; ?>').jqGrid(
<?php echo FormatHelper::phpVarToJavascript($jqGrid_setup) . "\n"; ?>
).navGrid('#<?php echo $grid_id; ?>-pager', { view:false,edit:false,add:false,del:false,search:true,refresh:true});
});
--></script>
<?php
if (count($search_fields) > 0) {
echo('<div>Search By:<BR>' . "\n");

View File

@@ -2,18 +2,17 @@
// Define the table columns
$cols = array();
$cols['LeaseID'] = array('index' => 'Lease.id', 'hidden' => true);
$cols['Lease'] = array('index' => 'Lease.number', 'formatter' => 'id');
$cols['Unit'] = array('index' => 'Unit.name', 'width' => '50', 'align' => 'center');
$cols['Unit'] = array('index' => 'Unit.name', 'formatter' => 'shortname', 'align' => 'center');
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Rent'] = array('index' => 'Lease.rent', 'formatter' => 'currency', 'hiddenz' => true);
$cols['Deposit'] = array('index' => 'Lease.deposit', 'formatter' => 'currency', 'hiddenz' => true);
$cols['Rent'] = array('index' => 'Lease.rent', 'formatter' => 'currency');
$cols['Deposit'] = array('index' => 'Lease.deposit', 'formatter' => 'currency');
$cols['Signed'] = array('index' => 'Lease.lease_date', 'formatter' => 'date');
$cols['Move-In'] = array('index' => 'Lease.movein_date', 'formatter' => 'date');
$cols['Move-Out'] = array('index' => 'Lease.moveout_date', 'formatter' => 'date');
$cols['Closed'] = array('index' => 'Lease.close_date', 'formatter' => 'date');
$cols['Paid-Thru'] = array('index' => 'Lease.paid_through_date', 'formatter' => 'date');
$cols['Status'] = array('index' => 'status', 'formatter' => 'enum', 'width' => 100);
$cols['Status'] = array('index' => 'status', 'formatter' => 'longenum');
$cols['Balance'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Comment'] = array('index' => 'Lease.comment', 'formatter' => 'comment');
@@ -29,8 +28,8 @@ if (!empty($this->params['action'])) {
// Render the grid
$grid
->columns($cols)
->sortField('LeaseID')
->defaultFields(array('LeaseID', 'Lease'))
->sortField('Lease')
->defaultFields(array('Lease'))
->searchFields(array('Customer', 'Unit'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Signed', 'Status', 'Comment')));

View File

@@ -20,11 +20,11 @@ $cols['Sub-Total'] = array('index' => 'subtotal-balance', 'formatter' =>
// Render the grid
$grid
->limit(50)
->columns($cols)
->sortField('Date')
->sortField('Date', 'DESC')
->defaultFields(array('Entry', 'Date', 'Amount'))
->searchFields(array('Customer', 'Unit'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Debit', 'Credit', 'Balance', 'Sub-Total', 'Comment')));
array_diff(array_keys($cols), array('Transaction', 'Debit', 'Credit',
'Balance', 'Sub-Total', 'Comment')));

View File

@@ -2,9 +2,8 @@
// Define the table columns
$cols = array();
$cols['ID'] = array('index' => 'id_sequence', 'formatter' => 'id');
$cols['Name'] = array('index' => 'Ledger.name', 'formatter' => 'name');
$cols['Account'] = array('index' => 'Account.name', 'formatter' => 'longname');
$cols['Sequence'] = array('index' => 'Ledger.sequence', 'formatter' => 'id');
$cols['Open Date'] = array('index' => 'PriorCloseTransaction.stamp', 'formatter' => 'date');
$cols['Close Date'] = array('index' => 'CloseTransaction.stamp', 'formatter' => 'date');
$cols['Comment'] = array('index' => 'Ledger.comment', 'formatter' => 'comment');
@@ -16,8 +15,8 @@ $cols['Balance'] = array('index' => 'balance', 'formatter' => 'c
// Render the grid
$grid
->columns($cols)
->sortField('ID', 'ASC')
->defaultFields(array('ID', 'Name', 'Account'))
->searchFields(array('Account', 'Comment'))
->sortField('Sequence')
->defaultFields(array('Sequence'))
->searchFields(array('Comment'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Open Date', 'Comment')));
array_diff(array_keys($cols), array('Account', 'Open Date', 'Comment')));

View File

@@ -2,7 +2,6 @@
// Define the table columns
$cols = array();
$cols['ID'] = array('index' => 'Map.id', 'formatter' => 'id');
$cols['Name'] = array('index' => 'Map.name', 'formatter' => 'longname');
$cols['Site Area'] = array('index' => 'SiteArea.name', 'formatter' => 'longname');
$cols['Width'] = array('index' => 'Map.width', 'formatter' => 'number');
@@ -13,7 +12,7 @@ $cols['Comment'] = array('index' => 'Map.comment', 'formatter' => 'comment
$grid
->columns($cols)
->sortField('Name')
->defaultFields(array('ID', 'Name'))
->defaultFields(array('Name'))
->searchFields(array('Name'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array()));

View File

@@ -8,17 +8,78 @@
* @package pmgr
*/
foreach ($menu AS $item) {
if (isset($item['header']))
echo('<DIV CLASS="header">' . $item['name'] . '</DIV>' . "\n");
elseif (isset($item['hr']))
echo('<HR>' . "\n");
elseif (isset($item['url']))
echo('<DIV CLASS="item">'
// REVISIT <AP>: 20090823
// Add way to slide the entire menu off the page
// The sidemenu-container is necessary to define the
// bounds as the parent of the sidemenu div, which will
// be heavily manipulated by the accordion module. If
// we don't have good control over the parent, the
// accordion will get confused and behave poorly.
echo('<DIV ID="sidemenu-container">' . "\n");
echo('<DIV ID="sidemenu">' . "\n");
$section = 0;
$active_section = null;
foreach ($menu['areas'] AS $area_name => $area) {
if (empty($area['subareas']))
continue;
foreach ($area['subareas'] AS $subarea_name => $subarea) {
if (empty($subarea['priorities']))
continue;
if (!isset($active_section) &&
!empty($menu['active']['area']) && $area_name == $menu['active']['area'] &&
(empty($menu['active']['subarea']) || $subarea_name == $menu['active']['subarea']))
$active_section = $section;
++$section;
echo('<H3' .
//' id="sidemenu-section-'.$area_name.'-'.$subarea_name.'"' .
' class="sidemenu-header">' .
$subarea['name'] .
"</H3>\n");
echo('<DIV class="sidemenu-content">' . "\n");
foreach ($subarea['priorities'] AS $priority) {
foreach ($priority AS $item) {
if (isset($item['url'])) {
echo('<DIV CLASS="sidemenu-item">'
. $html->link($item['name'], $item['url'],
isset($item['htmlAttributes']) ? $item['htmlAttributes'] : null,
isset($item['confirmMessage']) ? $item['confirmMessage'] : null,
isset($item['escapeTitle']) ? $item['escapeTitle'] : null)
. '</DIV>' . "\n");
}
}
}
echo('</DIV>' . "\n");
}
}
echo('</DIV>' . "\n"); // End #sidemenu
echo('</DIV>' . "\n"); // End #sidemenu-container
// Uses both hoverintent, which is a more user friendly mechanism
// than mouseover, as well as click. This provides 1) a workable
// solution for those browsers that don't use pointers, such as
// a touchscreen, and 2) a means to open the menu if the animation
// was running while the user moved the pointer to a new menu area.
$javascript->codeBlock(
<<<JSCB
jQuery(document).ready(function(){
if (jQuery("#sidemenu").accordion != null) {
jQuery("#sidemenu").accordion
({ fillSpace : true,
event : "click hoverintent",
animated : "bounceslide"
JSCB
. (isset($active_section) ? ",\n\t active : $active_section\n" : '') .
<<<JSCB
});
}
});
JSCB
, array('inline' => false));

View File

@@ -15,7 +15,7 @@ $cols['Unit'] = array('index' => 'Unit.name', 'formatter' =>
$cols['Comment'] = array('index' => 'StatementEntry.comment', 'formatter' => 'comment', 'width'=>150);
$cols['Type'] = array('index' => 'StatementEntry.type', 'formatter' => 'enum', 'width'=>120);
$cols['Type'] = array('index' => 'StatementEntry.type', 'formatter' => 'longenum');
$cols['Account'] = array('index' => 'Account.name', 'formatter' => 'name');
$cols['Debit'] = array('index' => 'charge', 'formatter' => 'currency');
$cols['Credit'] = array('index' => 'disbursement', 'formatter' => 'currency');
@@ -38,11 +38,11 @@ $grid->customData(compact('statement_entry_id'));
// Render the grid
$grid
->columns($cols)
->sortField('Date')
->sortField('Date', 'DESC')
->defaultFields(array('Entry', 'Date', 'Charge', 'Payment'))
->searchFields(array('Customer', 'Unit'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Through', 'Lease',
array_diff(array_keys($cols), array('Transaction', 'Through', 'Lease',
'Amount', 'Applied', 'Balance', 'Sub-Total',
'Comment')));

View File

@@ -52,8 +52,8 @@ if (isset($rows) && is_array($rows) && count($rows)) {
foreach ($rows AS $r => &$row) {
foreach ($row AS $c => $col) {
$cell_class = implode(" ", array_merge(isset( $row_class[$r]) ? $row_class[$r] : array(),
isset($column_class[$c]) ? $column_class[$c] : array()));
$cell_class = implode(" ", array_merge(empty( $row_class[$r]) ? array() : $row_class[$r],
empty($column_class[$c]) ? array() : $column_class[$c]));
if ($cell_class)
$row[$c] = array($col, array('class' => $cell_class));
}
@@ -65,11 +65,11 @@ if (isset($rows) && is_array($rows) && count($rows)) {
// OK, output the table HTML
echo('<TABLE' .
(isset($id) ? ' ID="'.$id.'"' : '') .
(isset($class) ? ' CLASS="'.$class.'"' : '') .
(empty($id) ? '' : ' ID="'.$id.'"') .
(empty($class) ? '' : ' CLASS="'.$class.'"') .
'>' . "\n");
if (isset($caption))
if (!empty($caption))
echo(' <CAPTION>' . $caption . '</CAPTION>' . "\n");
if (isset($headers) && is_array($headers)) {

View File

@@ -2,7 +2,6 @@
// Define the table columns
$cols = array();
//$cols['ID'] = array('index' => 'Tender.id', 'formatter' => 'id');
$cols['Date'] = array('index' => 'Transaction.stamp', 'formatter' => 'date');
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Item'] = array('index' => 'Tender.name', 'formatter' => 'longname');
@@ -18,4 +17,4 @@ $grid
->defaultFields(array('Date', 'Name', 'Amount'))
->searchFields(array('Name', 'Type'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Sub-Total')));
array_diff(array_keys($cols), array('Comment', 'Sub-Total')));

View File

@@ -13,7 +13,7 @@ $cols['Comment'] = array('index' => 'Transaction.comment', 'formatter' =
// Render the grid
$grid
->columns($cols)
->sortField('Timestamp')
->sortField('Timestamp', 'DESC')
->defaultFields(array('ID', 'Timestamp'))
->searchFields(array('Type', 'Comment'))
->render($this, isset($config) ? $config : null,

View File

@@ -0,0 +1,33 @@
<?php /* -*- mode:PHP -*- */
// Define the table columns
$cols = array();
$cols['Size'] = array('index' => 'UnitSize.name', 'formatter' => 'shortname');
$cols['Width'] = array('index' => 'UnitSize.width', 'formatter' => 'number');
$cols['Depth'] = array('index' => 'UnitSize.depth', 'formatter' => 'number');
$cols['Height'] = array('index' => 'UnitSize.height', 'formatter' => 'number');
$cols['Area'] = array('index' => 'sqft', 'formatter' => 'number');
$cols['Volume'] = array('index' => 'cuft', 'formatter' => 'number');
$cols['Deposit'] = array('index' => 'UnitSize.deposit', 'formatter' => 'currency');
$cols['Rent'] = array('index' => 'UnitSize.rent', 'formatter' => 'currency');
$cols['A. Cost'] = array('index' => 'sqcost', 'formatter' => 'currency');
$cols['V. Cost'] = array('index' => 'cucost', 'formatter' => 'currency');
$cols['Unavailable'] = array('index' => 'unavailable', 'formatter' => 'number');
$cols['Occupied'] = array('index' => 'occupied', 'formatter' => 'number');
$cols['Available'] = array('index' => 'available', 'formatter' => 'number');
$cols['Total'] = array('index' => 'units', 'formatter' => 'number');
$cols['Occupancy'] = array('index' => 'occupancy', 'formatter' => 'percentage', 'formatoptions' => array('precision' => 0));
$cols['Vacancy'] = array('index' => 'vacancy', 'formatter' => 'percentage', 'formatoptions' => array('precision' => 0));
$cols['Comment'] = array('index' => 'Unit.comment', 'formatter' => 'comment');
// Render the grid
$grid
->columns($cols)
->sortField('Area')
->defaultFields(array('Size', 'Area'))
->searchFields(array('Size', 'Width', 'Depth', 'Area', 'Deposit', 'Rent'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Height', 'Volume',
'A. Cost', 'V. Cost',
'Occupied', 'Total', 'Occupancy', 'Vacancy',
'Comment')));

View File

@@ -4,20 +4,23 @@
$cols = array();
$cols['Sort'] = array('index' => 'Unit.sort_order', 'hidden' => true);
$cols['Walk'] = array('index' => 'Unit.walk_order', 'formatter' => 'number');
$cols['ID'] = array('index' => 'Unit.id', 'formatter' => 'id');
$cols['Unit'] = array('index' => 'Unit.name', 'formatter' => 'shortname');
$cols['Size'] = array('index' => 'UnitSize.name', 'formatter' => 'shortname');
$cols['Area'] = array('index' => 'sqft', 'formatter' => 'number');
$cols['Rent'] = array('index' => 'Unit.rent', 'formatter' => 'currency');
$cols['Deposit'] = array('index' => 'Unit.deposit', 'formatter' => 'currency');
$cols['Status'] = array('index' => 'Unit.status', 'formatter' => 'name'); // We have enough real estate
$cols['Status'] = array('index' => 'Unit.status', 'formatter' => 'enum');
$cols['Balance'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Comment'] = array('index' => 'Unit.comment', 'formatter' => 'comment');
if (in_array($this->params['action'], array('vacant', 'unavailable')))
$grid->invalidFields('Balance');
// Render the grid
$grid
->columns($cols)
->sortField('Sort')
->defaultFields(array('Sort', 'ID', 'Unit'))
->defaultFields(array('Sort', 'Unit'))
->searchFields(array('Unit', 'Size', 'Status'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Walk', 'Deposit', 'Comment')));

View File

@@ -1,5 +1,3 @@
<?php /* -*- mode:PHP -*- */
if (!empty($message))
echo $message;

View File

@@ -268,14 +268,21 @@ class FormatHelper extends AppHelper {
// Helper function to convert PHP vars to javascript
function phpVarToJavascript($var, $name = '', $depth='', $special = false) {
function phpVarToJavascript($var, $name = '', $depth='', $special = false, $pretty = false) {
// Establish a prefix to use before printing $var
if ($pretty) {
$prefix = $depth;
$pretty_sp = " ";
$pretty_nl = "\n";
}
else {
$prefix = $pretty_sp = $pretty_nl = '';
}
// If given a name, set it up JS style
if ($name)
$prefix .= $name . ": ";
$prefix .= $name . ":" . $pretty_sp;
if (!isset($var))
return $prefix . 'null';
@@ -328,22 +335,22 @@ class FormatHelper extends AppHelper {
// PHP array indices can be a mix of integer and string based.
// Just guess here, unless flagged as a special case.
if (isset($var[0]) || $special)
return ($prefix . "[\n"
. implode(",\n",
return ($prefix . "[" . $pretty_nl
. implode("," . $pretty_nl,
array_map(array('FormatHelper', 'phpVarToJavascript'),
array_values($var),
array(),
array_fill(0, count($var), $depth.' ')
))
. "\n$depth]");
. ($pretty ? "\n$depth" : '') . "]");
return ($prefix . "{\n"
. implode(",\n",
return ($prefix . "{" . $pretty_nl
. implode("," . $pretty_nl,
array_map(array('FormatHelper', 'phpVarToJavascript'),
array_values($var), array_keys($var),
array_fill(0, count($var), $depth.' ')
))
. "\n$depth}");
. ($pretty ? "\n$depth" : '') . "}");
}
}

View File

@@ -6,6 +6,7 @@ class GridHelper extends AppHelper {
var $included, $invalid;
var $columns;
var $controller;
static $first_grid = true;
function __construct() {
$this->reset();
@@ -218,8 +219,12 @@ class GridHelper extends AppHelper {
if (isset($config))
$this->jqGrid_options = array_merge($this->jqGrid_options, $config);
// Set flag whether or not this is the first grid
$this->jqGrid_options['first_grid'] = self::$first_grid;
//pr(compact('config') + array('jqGrid_options' => $this->jqGrid_options));
echo $view->element('jqGrid', $this->jqGrid_options);
self::$first_grid = false;
// Since we only have one instance of this class
// as a helper, we must assume it could be used

View File

@@ -24,27 +24,80 @@
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<?php
/* print("<!--\n"); */
/* print("SERVER = "); print_r($_SERVER); print("\n"); */
/* print("REQUEST = "); print_r($_REQUEST); print("\n"); */
/* print("COOKIE = "); print_r($_COOKIE); print("\n"); */
/* print("-->\n"); */
?>
<head>
<?php echo $html->charset(); ?>
<title>
<?php if (devbox()) echo "*DEVBOX* "; ?>
<?php if (sandbox()) echo "*SANDBOX* "; ?>
Property Manager: <?php echo $title_for_layout; ?>
<?php if (sandbox()) echo " *SANDBOX*"; ?>
<?php if (devbox()) echo " *DEVBOX*"; ?>
</title>
<?php
// Reset the __scripts variable, which has already been dumped to
// $scripts_for_layout. Elements/Helpers used in the layout may
// also have some scripts to add. They cannot be put into the head
// but we can at least put them into a relatively benign place, so
// scripts don't have to be dumped inline in possibly awkward spots.
// Oh, and yes... I know we're not supposed to be using this variable
// directly, and will possibly get burned someday. Oh well, Cake
// hasn't left us a lot of choice, besides writing our own scripts
// mechanism _additional_ to what Cake has provided :-/
$this->__scripts = array();
if (!empty($_SERVER['HTTPS']))
$protocol = 'https://';
else
$protocol = 'http://';
echo $html->meta('icon') . "\n";
echo $html->css('cake.generic') . "\n";
echo $html->css('layout') . "\n";
echo $html->css('print', null, array('media' => 'print')) . "\n";
echo $html->css('sidemenu') . "\n";
echo $javascript->link('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js') . "\n";
echo $javascript->link('http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js') . "\n";
//echo $html->css('themes/base/ui.all') . "\n";
//echo $html->css('themes/smoothness/ui.all') . "\n";
//echo $html->css('themes/dotluv/ui.all') . "\n";
echo $html->css('themes/start/ui.all') . "\n";
$theme = 'smoothness';
$theme = 'base';
$theme = 'dotluv';
$theme = 'dark-hive';
$theme = 'start';
if (devbox())
$theme = 'dotluv';
if (sandbox())
$theme = 'darkness';
echo $html->css('themes/'.$theme.'/ui.all') . "\n";
echo $javascript->link('jquery-1.3.2.min') . "\n";
echo $javascript->link('jquery-ui-1.7.2.custom.min') . "\n";
//echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js') . "\n";
//echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.js') . "\n";
//echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js') . "\n";
//echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js') . "\n";
echo $javascript->link('jquery.form') . "\n";
echo $javascript->link('jquery.hoverIntent') . "\n";
echo $javascript->link('pmgr') . "\n";
echo $scripts_for_layout . "\n";
?>
<?php if ($this->params['action'] !== 'INTERNAL_ERROR'): ?>
<script type="text/javascript"><!--
if (typeof(jQuery) == 'undefined') {
window.location.href =
"<?php echo $html->url(array('controller' => 'util',
'action' => 'INTERNAL_ERROR',
'jQuery NOT LOADED!')); ?>";
}
--></script>
<?php endif; ?>
</head>
<body>
@@ -89,5 +142,7 @@
<?php echo $cakeDebug; ?>
<?php /* pr($this); */ ?>
<?php echo implode("\n", $this->__scripts) . "\n"; ?>
</body>
</html>

View File

@@ -35,17 +35,52 @@ Configure::write('debug', '0');
// other available options:
//clearForm: true, // clear all form fields after successful submit
//resetForm: true, // reset the form after successful submit
url: "<?php echo $html->url(array('controller' => 'transactions',
'action' => 'postInvoice', 0)); ?>"
};
// bind form using 'ajaxForm'
if ($('#invoice-form').ajaxForm != null)
$('#invoice-form').ajaxForm(options);
else
$('#repeat, label[for=repeat]').remove();
});
// pre-submit callback
function verifyRequest(formData, jqForm, options) {
//$("#debug").html('');
for (var i = 0; i < formData.length; ++i) {
//$("#debug").append(i + ') ' + dump(formData[i]) + '<BR>');
if (formData[i]['name'] == "data[Lease][id]" &&
!(formData[i]['value'] > 0)) {
//$("#debug").append('<P>Missing Lease ID');
alert("Must select a lease first");
return false;
}
if (formData[i]['name'] == "data[Transaction][stamp]" &&
formData[i]['value'] == '') {
//$("#debug").append('<P>Bad Stamp');
alert("Must enter a valid date stamp");
return false;
}
// Terrible way to accomplish this...
/* for (var j = 0; j < 20; ++j) { */
/* if (formData[i]['name'] == "data[Entry]["+j+"][amount]" && */
/* !(formData[i]['value'] > 0)) { */
/* //$("#debug").append('<P>Bad Amount'); */
/* alert("Must enter a valid amount"); */
/* return false; */
/* } */
/* } */
}
//$("#debug").append('OK');
//return false;
$('#results').html('Working <BLINK>...</BLINK>');
// here we could return false to prevent the form from being submitted;
// returning anything other than false will allow the form submit to continue
return true;
}
@@ -99,20 +134,7 @@ function onRowSelect(grid_id, lease_id) {
// Set the item id that will be returned with the form
$("#lease-id").val(lease_id);
// Get the item names from the grid
//$("#invoice-lease").html($(grid_id).getCell(lease_id, 'Lease-number'));
// REVISIT <AP>: 20090708
// This is not intended as a long term solution,
// but I need a way to enter data and then view
// the results. This link will help.
$("#invoice-lease").html('<A HREF="' +
"<?php echo $html->url(array('controller' => 'leases',
'action' => 'view')); ?>"
+ "/" +
$(grid_id).getCell(lease_id, 'Lease-id').replace(/^#/,'') +
'">' +
$(grid_id).getCell(lease_id, 'Lease-number') +
'</A>');
$("#invoice-lease").html($(grid_id).getCell(lease_id, 'Lease-number'));
$("#invoice-unit").html($(grid_id).getCell(lease_id, 'Unit-name'));
$("#invoice-customer").html($(grid_id).getCell(lease_id, 'Customer-name'));
$("#invoice-rent").html($(grid_id).getCell(lease_id, 'Lease-rent'));
@@ -183,19 +205,8 @@ function addChargeSource(flash) {
'</FIELDSET>'
);
$("#Entry"+id+"EffectiveDate")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
$("#Entry"+id+"ThroughDate")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker("Entry"+id+"EffectiveDate");
datepicker("Entry"+id+"ThroughDate");
return id;
}
@@ -222,6 +233,7 @@ if (empty($movein))
array('gridstate' =>
'onGridState("#"+$(this).attr("id"), gridstate)'),
),
'exclude' => array('Closed'),
'action' => 'active',
'nolinks' => true,
'limit' => 10,
@@ -259,6 +271,12 @@ echo $form->input("Lease.id",
'type' => 'hidden',
'value' => 0));
if (!empty($movein))
echo $form->input("Customer.id",
array('id' => 'customer-id',
'type' => 'hidden',
'value' => $customer['id']));
/* echo '<fieldset CLASS="invoice">' . "\n"; */
/* echo ' <legend>Invoice</legend>' . "\n"; */
@@ -313,13 +331,9 @@ Configure::write('debug', '0');
};
$(document).ready(function(){
$("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker('TransactionStamp');
$("#lease-id").val(0);
$("#invoice-lease").html("INTERNAL ERROR");
$("#invoice-unit").html("INTERNAL ERROR");
$("#invoice-customer").html("INTERNAL ERROR");
@@ -337,7 +351,7 @@ Configure::write('debug', '0');
var id;
resetForm(true);
$("#TransactionStamp").datepicker('disable');
$("#TransactionStamp").attr('disabled', true);
$("#TransactionStamp").val("<?php echo date('m/d/Y', $movein['time']); ?>");
$('#TransactionStamp').after
('<input type="hidden"' +
@@ -399,15 +413,7 @@ Configure::write('debug', '0');
<?php if (isset($lease['id'])): ?>
$("#lease-id").val(<?php echo $lease['id']; ?>);
//$("#invoice-lease").html("<?php echo '#'.$lease['number']; ?>");
$("#invoice-lease").html('<A HREF="' +
"<?php echo $html->url(array('controller' => 'leases',
'action' => 'view')); ?>"
+ "/" +
"<?php echo $lease['id']; ?>" +
'">#' +
"<?php echo $lease['number']; ?>" +
'</A>');
$("#invoice-lease").html("<?php echo '#'.$lease['number']; ?>");
$("#invoice-unit").html("<?php echo $unit['name']; ?>");
$("#invoice-customer").html("<?php echo $customer['name']; ?>");
$("#invoice-rent").html("<?php echo FormatHelper::currency($lease['rent']); ?>");

View File

@@ -26,14 +26,53 @@ $move_type = preg_replace("/.*_/", "", $this->action);
// Reset the form
function resetForm() {
$("#customer-id").val(0);
$("#move-customer").html("INTERNAL ERROR");
$("#unit-id").val(0);
$("#lease-id").val(0);
$("#move-customer").html("INTERNAL ERROR");
$("#move-unit").html("INTERNAL ERROR");
$("#move-lease").html("INTERNAL ERROR");
datepickerNow('LeaseMoveDate', false);
}
// pre-submit callback
function verifyRequest() {
//$("#debug").html('');
<?php if ($move_type === 'out'): ?>
if (!($("#lease-id").val() > 0)) {
//$("#debug").append('<P>Missing Lease ID');
alert("Please select the lease");
return false;
}
<?php else: ?>
if (!($("#customer-id").val() > 0)) {
//$("#debug").append('<P>Missing Customer ID');
alert("Please select the customer");
return false;
}
if (!($("#unit-id").val() > 0)) {
//$("#debug").append('<P>Missing Unit ID');
alert("Please select the unit");
return false;
}
<?php endif; ?>
//$("#debug").append('OK');
//return false;
return true;
}
function onRowSelect(grid_id, item_type, item_id) {
cell_name = item_type.charAt(0).toUpperCase() + item_type.substr(1) + "-name";
cell_name = item_type.charAt(0).toUpperCase() + item_type.substr(1);
if (item_type == 'lease')
cell_name += "-number";
else
cell_name += "-name";
// Set the item id that will be returned with the form
$("#"+item_type+"-id").val(item_id);
@@ -47,6 +86,22 @@ function onRowSelect(grid_id, item_type, item_id) {
$("#LeaseDeposit").val($(grid_id).getCell(item_id, 'Unit-deposit'));
}
// If a unit was selected, update the "Create new customer" link
if (item_type == 'unit') {
$("#customer-selection-new-url").attr
('href',
"<?php echo
$html->url(array('controller' => 'customers',
'action' => 'add')); ?>"
+ '/' + $("#unit-id").val());
}
// If a lease was selected, update the customer and unit
if (item_type == 'lease') {
$("#move-unit").html($(grid_id).getCell(item_id, 'Unit-name'));
$("#move-customer").html($(grid_id).getCell(item_id, 'Customer-name'));
}
// Hide the "no customer" message and show the current customer
$("."+item_type+"-selection-invalid").hide();
$("."+item_type+"-selection-valid").show();
@@ -56,12 +111,12 @@ function onRowSelect(grid_id, item_type, item_id) {
function onGridState(grid_id, item_type, state) {
if (state == 'visible') {
$("."+item_type+"-selection-new").show();
$("."+item_type+"-selection-invalid").hide();
$("."+item_type+"-selection-valid").hide();
}
else {
//if ($(grid_id).getGridParam("selrow"))
//alert("id:" + $("#"+item_type+"-id").val());
$("."+item_type+"-selection-new").hide();
if ($("#"+item_type+"-id").val() > 0) {
$("."+item_type+"-selection-invalid").hide();
$("."+item_type+"-selection-valid").show();
@@ -78,7 +133,42 @@ function onGridState(grid_id, item_type, state) {
<?php
; // align
if ($move_type !== 'out') {
if ($move_type === 'out') {
echo $this->element('leases', array
('config' => array
('grid_div_id' => 'leases-list',
'grid_div_class' => 'text-below',
'caption' => ('<A HREF="#" ONCLICK="$(\'#leases-list .HeaderButton\').click();'.
' return false;">Select Lease</A>'),
'grid_setup' => array('hiddengrid' => isset($lease['id'])),
'grid_events' => array('onSelectRow' =>
array('ids' =>
'if (ids != null){onRowSelect("#"+$(this).attr("id"), "lease", ids);}'),
'onHeaderClick' =>
array('gridstate' =>
'onGridState("#"+$(this).attr("id"), "lease", gridstate)'),
),
'exclude' => array('Closed'),
'action' => 'active',
'nolinks' => true,
'limit' => 10,
)));
echo ('<DIV CLASS="move-inout grid-selection-text">' .
'<DIV CLASS="lease-selection-valid" style="display:none">' .
'Lease <SPAN id="move-lease"></SPAN>' . ' / ' .
'Unit: <SPAN id="move-unit"></SPAN>' . ' / ' .
'Customer: <SPAN id="move-customer"></SPAN>' .
'</DIV>' .
'<DIV CLASS="lease-selection-invalid" style="display:none">' .
'Please select lease' .
'</DIV>' .
'</DIV>' . "\n");
}
else {
echo $this->element('customers', array
('config' => array
('grid_div_id' => 'customers-list',
@@ -96,10 +186,17 @@ if ($move_type !== 'out') {
'nolinks' => true,
'limit' => 10,
)));
}
echo ('<DIV CLASS="move-inout grid-selection-text">' .
'<DIV CLASS="customer-selection-new" style="display:none">' .
$html->link('Create a new Customer',
array('controller' => 'customers',
'action' => 'add',
(empty($unit['id']) ? null : $unit['id'])),
array('id' => 'customer-selection-new-url')) .
'</DIV>' .
'<DIV CLASS="customer-selection-valid" style="display:none">' .
'Customer: <SPAN id="move-customer"></SPAN>' .
'</DIV>' .
@@ -110,8 +207,6 @@ echo ('<DIV CLASS="move-inout grid-selection-text">' .
'</DIV>' . "\n");
if ($move_type !== 'out') {
echo $this->element('units', array
('config' => array
('grid_div_id' => 'units-list',
@@ -132,7 +227,6 @@ if ($move_type !== 'out') {
'nolinks' => true,
'limit' => 10,
)));
}
echo ('<DIV CLASS="move-inout grid-selection-text">' .
@@ -145,11 +239,20 @@ echo ('<DIV CLASS="move-inout grid-selection-text">' .
'</DIV>' .
'</DIV>' . "\n");
}
echo $form->create(null, array('id' => 'move-inout-form',
'onsubmit' => 'return verifyRequest();',
'url' => array('controller' => 'leases',
'action' => $move_action)));
if ($move_type === 'out') {
echo $form->input('Lease.id',
array('id' => 'lease-id',
'type' => 'hidden',
'value' => 0));
}
else {
echo $form->input("Lease.customer_id",
array('id' => 'customer-id',
'type' => 'hidden',
@@ -159,12 +262,6 @@ echo $form->input("Lease.unit_id",
array('id' => 'unit-id',
'type' => 'hidden',
'value' => 0));
if ($move_type === 'out') {
echo $form->input('Lease.id',
array('type' => 'hidden',
'value' => $lease['id'],
));
}
echo $this->element('form_table',
@@ -219,15 +316,23 @@ echo $form->end('Perform Move ' . ucfirst($move_type));
<script type="text/javascript"><!--
$(document).ready(function(){
$("#LeaseMoveDate")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker('LeaseMoveDate');
resetForm();
<?php if ($move_type === 'out') { ?>
<?php if (isset($lease['id'])): ?>
$("#lease-id").val(<?php echo $lease['id']; ?>);
$("#move-lease").html("#<?php echo $lease['number']; ?>");
$("#move-customer").html("<?php echo $customer['name']; ?>");
$("#move-unit").html("<?php echo $unit['name']; ?>");
onGridState(null, 'lease', 'hidden');
<?php else: ?>
onGridState(null, 'lease', 'visible');
<?php endif; ?>
<?php } else { /* end (move_type === 'out') */ ?>
<?php if (isset($customer['id'])): ?>
$("#customer-id").val(<?php echo $customer['id']; ?>);
$("#move-customer").html("<?php echo $customer['name']; ?>");
@@ -243,6 +348,10 @@ echo $form->end('Perform Move ' . ucfirst($move_type));
<?php else: ?>
onGridState(null, 'unit', 'visible');
<?php endif; ?>
<?php } /* end (move_type === 'out') */ ?>
});
--></script>

View File

@@ -18,7 +18,6 @@ if (isset($lease['Lease']))
$rows = array();
$rows[] = array('ID', $lease['id']);
$rows[] = array('Number', $lease['number']);
$rows[] = array('Lease Type', $lease_type['name']);
$rows[] = array('Unit', $html->link($unit['name'],
@@ -90,8 +89,6 @@ echo $this->element('statement_entries', array
'filter' => array('Lease.id' => $lease['id']),
'include' => array('Through'),
'exclude' => array('Customer', 'Lease', 'Unit'),
'sort_column' => 'Effective',
'sort_order' => 'DESC',
)));
@@ -108,9 +105,8 @@ echo $this->element('ledger_entries', array
'Tender.id !=' => null,
//'Account.id !=' => '-AR-'
),
'exclude' => array('Account', 'Cr/Dr'),
'sort_column' => 'Date',
'sort_order' => 'DESC',
'include' => array('Transaction'),
'exclude' => array('Entry', 'Account', 'Cr/Dr'),
)));

View File

@@ -33,7 +33,7 @@ $rows[] = array('Account', $html->link($account['name'],
array('controller' => 'accounts',
'action' => 'view',
$account['id'])));
$rows[] = array('Ledger', $html->link($ledger['name'],
$rows[] = array('Ledger', $html->link('#' . $ledger['sequence'],
array('controller' => 'ledgers',
'action' => 'view',
$ledger['id'])));

View File

@@ -16,8 +16,6 @@ if (isset($ledger['Ledger']))
$ledger = $ledger['Ledger'];
$rows = array();
$rows[] = array('ID', $ledger['id']);
$rows[] = array('Name', $ledger['name']);
$rows[] = array('Account', $html->link($account['name'],
array('controller' => 'accounts',
'action' => 'view',
@@ -74,6 +72,7 @@ echo $this->element('ledger_entries', array
'Amount', 'Cr/Dr', 'Balance',
empty($account['receipts']) ? 'Tender' : null),
'include' => array('Debit', 'Credit', 'Sub-Total'),
'limit' => 50,
)));

View File

@@ -6,19 +6,7 @@
{// for indentation purposes
// Go through each unit, adding a clickable region for the unit
foreach ($info['units'] AS $unit){
echo(' <area shape="rect"' .
' coords="' .
$unit['left'] . ',' .
$unit['top'] . ',' .
$unit['right'] . ',' .
$unit['bottom'] .
'" href="' .
$html->url(array('controller' => 'units',
'action' => 'view',
$unit['id'])) .
'" alt="Unit #' .
$unit['name'] .
'" title="Unit #' .
$title = ('Unit #' .
$unit['name'] .
(empty($unit['data']['CurrentLease']['id'])
? ''
@@ -29,7 +17,20 @@
$unit['data']['Customer']['name'] .
'; Paid Through ' .
$unit['data']['CurrentLease']['paid_through_date'])
) .
));
echo(' <area shape="rect"' .
' coords="' .
$unit['left'] . ',' .
$unit['top'] . ',' .
$unit['right'] . ',' .
$unit['bottom'] .
'" href="' .
$html->url(array('controller' => 'units',
'action' => 'view',
$unit['id'])) .
'" alt="' . $title .
'" title="' . $title .
'">' . "\n");
}
}// for indentation purposes

View File

@@ -60,13 +60,7 @@ function resetForm() {
}
$(document).ready(function(){
$("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker('TransactionStamp');
resetForm();
});
--></script>

View File

@@ -29,10 +29,12 @@ if (in_array($entry['type'], array('CHARGE', 'PAYMENT')))
$rows[] = array('Through', FormatHelper::date($entry['through_date']));
$rows[] = array('Type', $entry['type']);
$rows[] = array('Amount', FormatHelper::currency($entry['amount']));
$rows[] = array('Account', $html->link($account['name'],
$rows[] = array('Account', ($account['link']
? $html->link($account['name'],
array('controller' => 'accounts',
'action' => 'view',
$account['id'])));
$account['id']))
: $account['name']));
$rows[] = array('Customer', (isset($customer['name'])
? $html->link($customer['name'],
array('controller' => 'customers',
@@ -40,7 +42,7 @@ $rows[] = array('Customer', (isset($customer['name'])
$customer['id']))
: null));
$rows[] = array('Lease', (isset($lease['id'])
? $html->link('#'.$lease['id'],
? $html->link('#'.$lease['number'],
array('controller' => 'leases',
'action' => 'view',
$lease['id']))
@@ -115,7 +117,6 @@ echo $this->element('statement_entries', array
'config' => array
('caption' => $applied_caption,
//'filter' => array('id' => $entry['id']),
'exclude' => array('Transaction'),
)));

View File

@@ -60,13 +60,7 @@ function resetForm() {
}
$(document).ready(function(){
$("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker('TransactionStamp');
resetForm();
});
--></script>

View File

@@ -16,14 +16,13 @@ $transaction = $entry['Transaction'];
$tender = $tender['Tender'];
$rows = array();
$rows[] = array('ID', $tender['id']);
$rows[] = array('Item', $tender['name']);
$rows[] = array('Received', FormatHelper::date($transaction['stamp']));
$rows[] = array('Customer', $html->link($customer['name'],
array('controller' => 'customers',
'action' => 'view',
$customer['id'])));
$rows[] = array('Amount', FormatHelper::currency($entry['amount']));
$rows[] = array('Item', $tender['name']);
$rows[] = array('Type', $ttype['name']);
/* $rows[] = array('Type', $html->link($ttype['name'], */
/* array('controller' => 'tender_types', */
@@ -37,7 +36,7 @@ for ($i=1; $i<=4; ++$i)
if (!empty($tender['deposit_transaction_id']))
$rows[] = array('Deposit', $html->link('#'.$tender['deposit_transaction_id'],
array('controller' => 'transactions',
'action' => 'view',
'action' => 'deposit_slip',
$tender['deposit_transaction_id'])));
if (!empty($tender['nsf_transaction_id']))

View File

@@ -75,13 +75,7 @@ function resetForm() {
}
$(document).ready(function(){
$("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker('TransactionStamp');
resetForm();
});
--></script>

View File

@@ -92,13 +92,7 @@ function resetForm() {
}
$(document).ready(function(){
$("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker('TransactionStamp');
resetForm();
});
--></script>

View File

@@ -21,19 +21,19 @@ $rows[] = array('ID', $transaction['id']);
$rows[] = array('Type', str_replace('_', ' ', $transaction['type']));
$rows[] = array('Timestamp', FormatHelper::datetime($transaction['stamp']));
$rows[] = array('Amount', FormatHelper::currency($transaction['amount']));
$rows[] = array('Account', $html->link($account['name'],
$rows[] = array('Account', ($account['link']
? $html->link($account['name'],
array('controller' => 'accounts',
'action' => 'view',
$account['id'])));
$rows[] = array('Ledger', $html->link($ledger['name'],
array('controller' => 'ledgers',
'action' => 'view',
$ledger['id'])));
$account['id']))
: $account['name']));
if (!empty($nsf_tender['id']))
$rows[] = array('NSF Tender', $html->link($nsf_tender['name'],
array('controller' => 'tenders',
'action' => 'view',
$nsf_tender['id'])));
$rows[] = array('Comment', $transaction['comment']);
echo $this->element('table',

88
views/unit_sizes/view.ctp Normal file
View File

@@ -0,0 +1,88 @@
<?php /* -*- mode:PHP -*- */
echo '<div class="unit-size view">' . "\n";
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* UnitSize Detail Main Section
*/
$unit_type = $size['UnitType'];
$unit_size = $size['UnitSize'];
$rows = array();
$rows[] = array('Name', $unit_size['name']);
$rows[] = array('Type', $unit_type['name']);
$rows[] = array('Width', $unit_size['width'] . ' Feet');
$rows[] = array('Depth', $unit_size['depth'] . ' Feet');
if (!empty($unit_size['height']))
$rows[] = array('Height', $unit_size['height'] . ' Feet');
if (!empty($unit_size['sqft']))
$rows[] = array('Area', ($unit_size['sqft'] . ' Square Feet'
. ' ('. FormatHelper::currency($unit_size['rent'] / $unit_size['sqft'])
. ' / Square Foot)'));
if (!empty($unit_size['cuft']))
$rows[] = array('Volume', ($unit_size['cuft'] . ' Cubic Feet'
. ' ('. FormatHelper::currency($unit_size['rent'] / $unit_size['cuft'])
. ' / Cubic Foot)'));
$rows[] = array('Deposit', FormatHelper::currency($unit_size['deposit']));
$rows[] = array('Rent', FormatHelper::currency($unit_size['rent']));
$rows[] = array('Comment', $unit_size['comment']);
echo $this->element('table',
array('class' => 'item unit_size detail',
'caption' => 'Unit Size Detail',
'rows' => $rows,
'column_class' => array('field', 'value')));
/**********************************************************************
* UnitSize Info Box
*/
echo '<div class="infobox">' . "\n";
$rows = array();
$rows[] = array($unit_size['name'] . ' Units:', $stats['all']);
$rows[] = array('Unavailable:', $stats['unavailable']);
$rows[] = array('Vacant:', $stats['vacant']);
$rows[] = array('Occupied:', $stats['occupied']);
echo $this->element('table',
array('class' => 'summary',
'rows' => $rows,
'column_class' => array('field', 'value'),
'suppress_alternate_rows' => true,
));
echo '</div>' . "\n";
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Supporting Elements Section
*/
echo '<div CLASS="detail supporting">' . "\n";
/**********************************************************************
* Ledger Entries
*/
echo $this->element('units', array
(// Grid configuration
'config' => array
('caption' => $unit_size['name'] . " Units",
'filter' => array('unit_size_id' => $unit_size['id']),
'include' => array('Deposit', 'Comment'),
'exclude' => array('Size', 'Area', 'Balance'),
)));
/* End "detail supporting" div */
echo '</div>' . "\n";
/* End page div */
echo '</div>' . "\n";

View File

@@ -19,7 +19,10 @@ if (isset($unit['Unit']))
$rows = array();
$rows[] = array('Name', $unit['name']);
$rows[] = array('Status', $unit['status']);
$rows[] = array('Size', $unit_size['name']);
$rows[] = array('Size', $html->link($unit_size['name'],
array('controller' => 'unit_sizes',
'action' => 'view',
$unit_size['id'])));
$rows[] = array('Deposit', FormatHelper::currency($unit['deposit']));
$rows[] = array('Rent', FormatHelper::currency($unit['rent']));
$rows[] = array('Comment', $unit['comment']);
@@ -68,6 +71,8 @@ echo $this->element('leases', array
('caption' => 'Lease History',
'filter' => array('Unit.id' => $unit['id']),
'exclude' => array('Unit'),
'sort_column' => 'Move-In',
'sort_order' => 'DESC',
)));
@@ -87,8 +92,6 @@ if (isset($current_lease['id'])) {
'filter' => array('Lease.id' => $current_lease['id']),
'include' => array('Through'),
'exclude' => array('Customer', 'Lease', 'Unit'),
'sort_column' => 'Effective',
'sort_order' => 'DESC',
)));
}

View File

@@ -22,11 +22,6 @@
*/
* {
margin:0;
padding:0;
}
/* Layout */
#container {
text-align: left;

View File

@@ -11,10 +11,12 @@
* Overall page layout
*/
body { padding: 0; margin: 0 }
table#layout { width: 100% }
td#sidecolumn ,
td#pagecolumn { vertical-align: top; }
td#pagecolumn { padding-left: 4mm; }
td#sidecolumn { width: 1% }
/************************************************************
@@ -46,7 +48,7 @@ span.fmt-age.delinquent { color: #f00; }
table.item th ,
table.item td { padding: 0.1em 0.4em 0.1em 0.4em; }
table.item td { white-space: nowrap; }
table.item td.name { white-space: nowrap; }
/* table.item { border-spacing: 0 0; /\*IE*\/border-collapse: collapse; empty-cells: show } */
table.item { border-spacing: 0 0; empty-cells: show }
table.item { border:1px solid #ccc;
@@ -122,6 +124,11 @@ div.detail.supporting { clear : both;
.edit table.detail { width : 80%;
float : none;
}
table.item td { vertical-align: top; }
.edit .item td.field .required { color: #33f }
.edit .item td.field .recommended { color: #35d }
.edit .item td.field .recommended.empty { color: #f5d }
.edit .item td.field .required.empty { color: #f33 }
/************************************************************
@@ -271,19 +278,15 @@ span.grid-error {
color: #a00;
}
span.ui-jqgrid-title {
color: #ffb;
font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif;
font-size: 180%;
margin-bottom: 0.0em;
.ui-jqgrid span.ui-jqgrid-title {
font-size: 160%;
margin: 0;
}
span.ui-jqgrid-title h2 {
color: #ffb;
font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif;
.ui-jqgrid span.ui-jqgrid-title h2 {
font-weight: bold;
font-size: 140%;
margin-bottom: 0.0em;
margin: 0;
}
@@ -359,45 +362,18 @@ fieldset fieldset div {
/* margin: 0 20px; */
}
/*
* REVISIT <AP>: 20090728
* This "form div" is way too generic, and in fact
* it's screwing up the jqGrid header. I'm commenting
* it out for now, to see if it actually is needed
* anywhere, and hope to delete it in the near future.
*/
/* form div { */
/* clear: both; */
/* /\* margin-bottom: 1em; *\/ */
/* /\* padding: .5em; *\/ */
/* vertical-align: text-top; */
/* } */
form div.input {
color: #444;
}
form div.required {
color: #333;
font-weight: bold;
}
form div.submit {
border: 0;
clear: both;
margin-top: 10px;
/* margin-left: 140px; */
}
/************************************************************
************************************************************
* General Style Info
*/
body {
/* background: #003d4c; */
/* color: #fff; */
font-family:'lucida grande',verdana,helvetica,arial,sans-serif;
font-size:90%;
margin: 0;
}
a {
color: #003d4c;
text-decoration: underline;
@@ -407,35 +383,4 @@ a:hover {
color: #00f;
text-decoration:none;
}
a img {
border:none;
}
h1, h2, h3, h4 {
font-weight: normal;
}
h1 {
color: #003d4c;
font-size: 100%;
margin: 0.1em 0;
}
h2 {
/* color: #e32; */
color: #993;
font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif;
font-size: 190%;
margin-bottom: 0.3em;
}
h3 {
color: #993;
font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif;
/* font-size: 165%; */
}
h4 {
color: #993;
font-weight: normal;
padding-top: 0.5em;
}

View File

@@ -3,32 +3,7 @@
* Side Menu Layout
*/
td#sidecolumn { width: 10em; background: lightblue; text-align: left; }
td#sidecolumn .header ,
td#sidecolumn .item { white-space : nowrap; }
/************************************************************
************************************************************
* Menu Headers
*/
td#sidecolumn .header { margin-top: 0.4em;
background: blue;
color: white;
font-weight: bold;
}
/************************************************************
************************************************************
* Menu Separators
*/
td#sidecolumn hr { margin-top: 0.4em; margin-bottom: 0.3em; }
#sidemenu-container { width: 12em; height: 20em; }
/************************************************************
@@ -36,5 +11,11 @@ td#sidecolumn hr { margin-top: 0.4em; margin-bottom: 0.3em; }
* Menu Items
*/
td#sidecolumn .item { padding-left: 0.6em; }
.sidemenu-header, .sidemenu-item { white-space : nowrap; }
#sidemenu.ui-accordion .ui-accordion-header .ui-icon { left: .2em; }
#sidemenu.ui-accordion .ui-accordion-header { padding: 0 0.5em 0 1.1em; }
#sidemenu.ui-accordion .ui-accordion-content { padding: 0 0.5em 0 1.1em; }
#sidemenu a { font-size: 90%; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 B

Some files were not shown because too many files have changed in this diff Show More