Merge in from pre_0.1 branch

git-svn-id: file:///svn-source/pmgr/trunk@847 97e9348a-65ac-dc4b-aefc-98561f571b83
This commit is contained in:
abijah
2009-09-15 02:38:28 +00:00
134 changed files with 5833 additions and 3280 deletions

View File

@@ -1,3 +1,3 @@
@echo off @echo off
%~dp0\scripts\sitelink2pmgr.pl %~dp0\db\schema.sql %~dp0db\vss.mdb %* mysql --user=pmgr --password=pmgruser < %~dp0\db\property_manager.sql
echo Done! echo Done!

File diff suppressed because it is too large Load Diff

View File

@@ -25,9 +25,9 @@
-- REVISIT <AP>: 20090511 -- REVISIT <AP>: 20090511
-- By not specifying the database, the script can -- By not specifying the database, the script can
-- make the determination of which one to use. -- make the determination of which one to use.
-- DROP DATABASE IF EXISTS `property_manager`; DROP DATABASE IF EXISTS `property_manager`;
-- CREATE DATABASE `property_manager`; CREATE DATABASE `property_manager`;
-- USE `property_manager`; USE `property_manager`;
-- ###################################################################### -- ######################################################################
@@ -241,7 +241,7 @@ CREATE TABLE `pmgr_contacts_methods` (
-- ###################################################################### -- ######################################################################
-- ###################################################################### -- ######################################################################
-- ## -- ##
-- ## GROUPS -- ## GROUPS / USERS
-- ## -- ##
@@ -256,59 +256,15 @@ CREATE TABLE `pmgr_groups` (
-- code may not be userful -- code may not be userful
`code` VARCHAR(12) NOT NULL, -- User style "id" `code` VARCHAR(12) NOT NULL, -- User style "id"
`name` VARCHAR(80) NOT NULL, `name` VARCHAR(80) NOT NULL,
-- Lower ranks are given higher priority
`rank` SMALLINT UNSIGNED NOT NULL DEFAULT 100,
`comment` VARCHAR(255) DEFAULT NULL, `comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_group_options
DROP TABLE IF EXISTS `pmgr_group_options`;
CREATE TABLE `pmgr_group_options` (
`group_id` INT(10) UNSIGNED NOT NULL,
`name` VARCHAR(50) NOT NULL,
`value` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`group_id`, `name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_group_permissions
DROP TABLE IF EXISTS `pmgr_group_permissions`;
CREATE TABLE `pmgr_group_permissions` (
`group_id` INT(10) UNSIGNED NOT NULL,
`name` CHAR(30) NOT NULL,
`access` ENUM('ALLOWED',
'DENIED',
'FORCED')
NOT NULL DEFAULT 'ALLOWED',
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`group_id`, `name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ##
-- ## USERS
-- ##
-- ---------------------------------------------------------------------- -- ----------------------------------------------------------------------
-- ---------------------------------------------------------------------- -- ----------------------------------------------------------------------
@@ -318,14 +274,10 @@ DROP TABLE IF EXISTS `pmgr_users`;
CREATE TABLE `pmgr_users` ( CREATE TABLE `pmgr_users` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`code` VARCHAR(12) NOT NULL, -- User style "id" `code` VARCHAR(12) NOT NULL, -- User style "id"
`login` VARCHAR(30) NOT NULL,
-- Login details. Passwords are not yet used (and so NULL).
`login` VARCHAR(30) NOT NULL,
`salt` CHAR(12) DEFAULT NULL,
`passhash` VARCHAR(255) DEFAULT NULL,
-- Contact information for this user -- Contact information for this user
`contact_id` INT(10) UNSIGNED NOT NULL, `contact_id` INT(10) UNSIGNED DEFAULT NULL,
-- Specific comments -- Specific comments
`comment` VARCHAR(255) DEFAULT NULL, `comment` VARCHAR(255) DEFAULT NULL,
@@ -334,18 +286,208 @@ CREATE TABLE `pmgr_users` (
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ##
-- ## OPTIONS
-- ##
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_options
DROP TABLE IF EXISTS `pmgr_options`;
CREATE TABLE `pmgr_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
UNIQUE KEY `name_key` (`name`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_option_values
DROP TABLE IF EXISTS `pmgr_option_values`;
CREATE TABLE `pmgr_option_values` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`option_id` INT(10) UNSIGNED NOT NULL,
`value` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_default_options
DROP TABLE IF EXISTS `pmgr_default_options`;
CREATE TABLE `pmgr_default_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`option_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_group_options
DROP TABLE IF EXISTS `pmgr_group_options`;
CREATE TABLE `pmgr_group_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`group_id` INT(10) UNSIGNED NOT NULL,
`option_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `group_key` (`group_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ---------------------------------------------------------------------- -- ----------------------------------------------------------------------
-- ---------------------------------------------------------------------- -- ----------------------------------------------------------------------
-- TABLE pmgr_user_options -- TABLE pmgr_user_options
DROP TABLE IF EXISTS `pmgr_user_options`; DROP TABLE IF EXISTS `pmgr_user_options`;
CREATE TABLE `pmgr_user_options` ( CREATE TABLE `pmgr_user_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NOT NULL, `user_id` INT(10) UNSIGNED NOT NULL,
`name` VARCHAR(50) NOT NULL, `option_value_id` INT(10) UNSIGNED NOT NULL,
`value` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL, `comment` VARCHAR(255) DEFAULT NULL,
KEY `user_key` (`user_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
PRIMARY KEY (`user_id`, `name`)
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_site_options
DROP TABLE IF EXISTS `pmgr_site_options`;
CREATE TABLE `pmgr_site_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`site_id` INT(10) UNSIGNED NOT NULL,
`option_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `site_key` (`site_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ##
-- ## PERMISSIONS
-- ##
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_permissions
DROP TABLE IF EXISTS `pmgr_permissions`;
CREATE TABLE `pmgr_permissions` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
UNIQUE KEY `name_key` (`name`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_permission_values
DROP TABLE IF EXISTS `pmgr_permission_values`;
CREATE TABLE `pmgr_permission_values` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`permission_id` INT(10) UNSIGNED NOT NULL,
`access` ENUM('ALLOW',
'DENY')
NOT NULL DEFAULT 'DENY',
`level` SMALLINT UNSIGNED DEFAULT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_default_permissions
DROP TABLE IF EXISTS `pmgr_default_permissions`;
CREATE TABLE `pmgr_default_permissions` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`permission_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_group_permissions
DROP TABLE IF EXISTS `pmgr_group_permissions`;
CREATE TABLE `pmgr_group_permissions` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`group_id` INT(10) UNSIGNED NOT NULL,
`permission_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `group_key` (`group_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_user_permissions
DROP TABLE IF EXISTS `pmgr_user_permissions`;
CREATE TABLE `pmgr_user_permissions` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NOT NULL,
`permission_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `user_key` (`user_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_site_permissions
DROP TABLE IF EXISTS `pmgr_site_permissions`;
CREATE TABLE `pmgr_site_permissions` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`site_id` INT(10) UNSIGNED NOT NULL,
`permission_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `site_key` (`site_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -380,46 +522,6 @@ CREATE TABLE `pmgr_sites` (
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_site_options
DROP TABLE IF EXISTS `pmgr_site_options`;
CREATE TABLE `pmgr_site_options` (
`site_id` INT(10) UNSIGNED NOT NULL,
`name` VARCHAR(50) NOT NULL,
`value` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`site_id`, `name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_site_memberships
--
-- Which users are allowed to access which sites,
-- and under which set of group permissions (possibly multiple)
-- SELECT U.id, P.name, MAX(P.access)
-- FROM pmgr_users U
-- LEFT JOIN pmgr_site_membership M ON M.user_id = U.id
-- LEFT JOIN pmgr_groups G ON G.id = M.group_id
-- LEFT JOIN pmgr_group_permissions P ON P.group_id = G.id
-- GROUP BY U.id, P.name
DROP TABLE IF EXISTS `pmgr_site_memberships`;
CREATE TABLE `pmgr_site_memberships` (
`site_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NOT NULL,
`group_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`site_id`, `user_id`, `group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ---------------------------------------------------------------------- -- ----------------------------------------------------------------------
-- ---------------------------------------------------------------------- -- ----------------------------------------------------------------------
-- TABLE pmgr_site_areas -- TABLE pmgr_site_areas
@@ -437,6 +539,38 @@ CREATE TABLE `pmgr_site_areas` (
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ##
-- ## MEMBERSHIPS
-- ##
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_memberships
--
-- Which users are allowed to access which sites,
-- and under which set of group permissions (possibly multiple)
DROP TABLE IF EXISTS `pmgr_memberships`;
CREATE TABLE `pmgr_memberships` (
`site_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NOT NULL,
`group_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`site_id`, `user_id`, `group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ###################################################################### -- ######################################################################
-- ###################################################################### -- ######################################################################
-- ###################################################################### -- ######################################################################
@@ -475,8 +609,6 @@ CREATE TABLE `pmgr_units` (
'LIENED') 'LIENED')
NOT NULL DEFAULT 'VACANT', NOT NULL DEFAULT 'VACANT',
`current_lease_id` INT(10) UNSIGNED DEFAULT NULL,
`sort_order` MEDIUMINT UNSIGNED NOT NULL, `sort_order` MEDIUMINT UNSIGNED NOT NULL,
`walk_order` MEDIUMINT UNSIGNED NOT NULL, `walk_order` MEDIUMINT UNSIGNED NOT NULL,

View File

@@ -157,3 +157,422 @@ WHERE
-- catch other types not considered in this query -- catch other types not considered in this query
OR T.type NOT IN ('RECEIPT', 'CREDIT_NOTE', 'INVOICE', 'PAYMENT') OR T.type NOT IN ('RECEIPT', 'CREDIT_NOTE', 'INVOICE', 'PAYMENT')
-- #################################################################
-- #################################################################
-- #################################################################
-- #################################################################
-- #################################################################
-- #################################################################
-- #################################################################
-- #################################################################
-- #################################################################
-- ## USER / GROUP
INSERT INTO pmgr_groups (`code`, `name`, `rank`)
VALUES('Owner', 'Owner Group', 25);
SET @o_gid = LAST_INSERT_ID();
INSERT INTO pmgr_groups (`code`, `name`, `rank`)
VALUES('Admin', 'Admin Group', 50);
SET @a_gid = LAST_INSERT_ID();
INSERT INTO pmgr_groups (`code`, `name`, `rank`)
VALUES('Manager', 'Manager Group', 75);
SET @m_gid = LAST_INSERT_ID();
INSERT INTO pmgr_groups (`code`, `name`)
VALUES('Temp', 'Temporary Help');
SET @t_gid = LAST_INSERT_ID();
INSERT INTO pmgr_users (`code`, `login`, `contact_id`)
VALUES('AP', 'abijah', 0);
SET @a_uid = LAST_INSERT_ID();
INSERT INTO pmgr_users (`code`, `login`, `contact_id`)
VALUES('SK', 'shirley', 0);
SET @s_uid = LAST_INSERT_ID();
INSERT INTO pmgr_users (`code`, `login`, `contact_id`)
VALUES('DE', 'dan', 0);
SET @d_uid = LAST_INSERT_ID();
INSERT INTO pmgr_users (`code`, `login`, `contact_id`)
VALUES('KD', 'kevin', 0);
SET @k_uid = LAST_INSERT_ID();
INSERT INTO pmgr_sites (`code`, `name`)
VALUES('VSS', 'Valley Storage');
SET @v_sid = LAST_INSERT_ID();
INSERT INTO pmgr_sites (`code`, `name`)
VALUES('FAKE', 'Fake Site');
SET @f_sid = LAST_INSERT_ID();
-- Site Membership
INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`)
VALUES(@v_sid, @a_uid, @o_gid);
INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`)
VALUES(@v_sid, @a_uid, @a_gid);
INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`)
VALUES(@v_sid, @a_uid, @m_gid);
INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`)
VALUES(@v_sid, @s_uid, @m_gid);
INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`)
VALUES(@v_sid, @d_uid, @t_gid);
INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`)
VALUES(@f_sid, @s_uid, @a_gid);
INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`)
VALUES(@f_sid, @s_uid, @m_gid);
INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`)
VALUES(@f_sid, @k_uid, @o_gid);
INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`)
VALUES(@f_sid, @d_uid, @t_gid);
-- Options
INSERT INTO pmgr_options (`name`) VALUES ('theme');
SET @t_oid = LAST_INSERT_ID();
INSERT INTO pmgr_options (`name`) VALUES ('menu');
SET @m_oid = LAST_INSERT_ID();
-- Default Option Values
INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@t_oid, 'blue');
INSERT INTO pmgr_default_options (`option_value_id`) VALUES(LAST_INSERT_ID());
INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@m_oid, 'basic');
INSERT INTO pmgr_default_options (`option_value_id`) VALUES(LAST_INSERT_ID());
-- Group options
INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@t_oid, 'gold');
INSERT INTO pmgr_group_options (`group_id`, `option_value_id`)
VALUES(@o_gid, LAST_INSERT_ID());
INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@t_oid, 'silver');
INSERT INTO pmgr_group_options (`group_id`, `option_value_id`)
VALUES(@a_gid, LAST_INSERT_ID());
INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@t_oid, 'red');
INSERT INTO pmgr_group_options (`group_id`, `option_value_id`)
VALUES(@m_gid, LAST_INSERT_ID());
INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@m_oid, 'advanced');
INSERT INTO pmgr_group_options (`group_id`, `option_value_id`)
VALUES(@o_gid, LAST_INSERT_ID());
INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@m_oid, 'advanced');
INSERT INTO pmgr_group_options (`group_id`, `option_value_id`)
VALUES(@a_gid, LAST_INSERT_ID());
INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@m_oid, 'restricted');
INSERT INTO pmgr_group_options (`group_id`, `option_value_id`)
VALUES(@t_gid, LAST_INSERT_ID());
-- User Options
INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@m_oid, 'special');
INSERT INTO pmgr_user_options (`user_id`, `option_value_id`)
VALUES(@s_uid, LAST_INSERT_ID());
-- Site Options
INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@t_oid, 'site-theme');
INSERT INTO pmgr_site_options (`site_id`, `option_value_id`)
VALUES(@f_sid, LAST_INSERT_ID());
-- SELECT U.id, P.name, MAX(P.access)
-- FROM pmgr_users U
-- LEFT JOIN pmgr_site_membership M ON M.user_id = U.id
-- LEFT JOIN pmgr_groups G ON G.id = M.group_id
-- LEFT JOIN pmgr_group_permissions P ON P.group_id = G.id
-- GROUP BY U.id, P.name
-- User access to site
SELECT U.id, U.login, COUNT(G.id) AS 'groups', MIN(G.rank) AS highest_rank
FROM pmgr_users U
JOIN pmgr_site_memberships M ON M.user_id = U.id
JOIN pmgr_sites S ON S.id = M.site_id
JOIN pmgr_groups G ON G.id = M.group_id
WHERE S.code = 'VSS'
GROUP BY U.id
-- User Options
SELECT O.id, O.name, O.default,
GROUP_CONCAT(Uopt.value) AS 'value', COUNT(U.id) AS 'count'
FROM pmgr_options O
LEFT JOIN pmgr_user_options Uopt ON Uopt.option_id = O.id
LEFT JOIN pmgr_users U ON U.id = Uopt.user_id
WHERE U.id = 1
GROUP BY O.id
-- Group Options
SELECT O.id, O.name, O.default,
GROUP_CONCAT(Gopt.value) AS 'value', COUNT(G.id) AS 'count'
FROM pmgr_options O
LEFT JOIN pmgr_group_options Gopt ON Gopt.option_id = O.id
LEFT JOIN pmgr_groups G ON G.id = Gopt.group_id
WHERE G.id = 1
GROUP BY O.id
-- Site Options
SELECT O.id, O.name, O.default,
GROUP_CONCAT(Sopt.value) AS 'value', COUNT(S.id) AS 'count'
FROM pmgr_options O
LEFT JOIN pmgr_site_options Sopt ON Sopt.option_id = O.id
LEFT JOIN pmgr_sites S ON S.id = Sopt.site_id
WHERE S.id = 1
GROUP BY O.id
-- Option value for member & site
SELECT O.id, O.name, O.default,
S.id AS site_id, Sopt.value,
G.id AS group_id, Gopt.value,
U.id AS user_id, Uopt.value
FROM pmgr_options O
LEFT JOIN pmgr_site_options Sopt ON Sopt.option_id = O.id
LEFT JOIN pmgr_sites S ON S.id = Sopt.site_id
LEFT JOIN pmgr_group_options Gopt ON Gopt.option_id = O.id
LEFT JOIN pmgr_groups G ON G.id = Gopt.group_id
LEFT JOIN pmgr_user_options Uopt ON Uopt.option_id = O.id
LEFT JOIN pmgr_users U ON U.id = Uopt.user_id
WHERE O.name = 'theme'
--GROUP BY O.id
-- Option value for member & site
-- 1) User
SET @sid = 1;
SET @uid = 1;
SET @oid = 1;
SELECT O.name, U.id, Uopt.value
FROM pmgr_options O
JOIN pmgr_user_options Uopt ON Uopt.option_id = O.id
JOIN pmgr_users U ON U.id = Uopt.user_id
-- JOIN pmgr_site_memberships M ON M.user_id = U.id
-- JOIN pmgr_groups G ON G.id = M.group_id
-- JOIN pmgr_sites S ON S.id = M.site_id
WHERE -- S.id = @sid AND
U.id = @uid AND O.id = @oid
;
-- 2) Group
SELECT O.name, G.rank, G.id, Gopt.value
FROM pmgr_options O
JOIN pmgr_group_options Gopt ON Gopt.option_id = O.id
JOIN pmgr_groups G ON G.id = Gopt.group_id
JOIN pmgr_site_memberships M ON M.group_id = G.id
JOIN pmgr_users U ON U.id = M.user_id
JOIN pmgr_sites S ON S.id = M.site_id
WHERE S.id = @sid AND U.id = @uid AND O.id = @oid
ORDER BY G.rank
;
-- 3) Site
SELECT O.name, S.id, Sopt.value
FROM pmgr_options O
JOIN pmgr_site_options Sopt ON Sopt.option_id = O.id
JOIN pmgr_sites S ON S.id = Sopt.site_id
-- JOIN pmgr_site_memberships M ON M.site_id = S.id
-- JOIN pmgr_groups G ON G.id = M.group_id
-- JOIN pmgr_users U ON U.id = M.user_id
WHERE S.id = @sid
-- AND U.id = @uid
AND O.id = @oid
;
-- 3) Default
SELECT O.name, O.default AS 'value'
FROM pmgr_options O
WHERE O.id = @oid
;
-- User Permissions
-- Group Permissions
-- All option values, in order
SELECT O.name, V.value,
U.id AS uid, G.id AS gid, S.id as sid,
Dopt.id AS did, G.rank
FROM pmgr_option_values V
JOIN pmgr_options O ON O.id = V.option_id
LEFT JOIN pmgr_user_options Uopt ON Uopt.option_value_id = V.id
LEFT JOIN pmgr_group_options Gopt ON Gopt.option_value_id = V.id
LEFT JOIN pmgr_site_options Sopt ON Sopt.option_value_id = V.id
LEFT JOIN pmgr_default_options Dopt ON Dopt.option_value_id = V.id
LEFT JOIN pmgr_groups G ON G.id = Gopt.group_id
LEFT JOIN pmgr_users U ON U.id = Uopt.user_id
LEFT JOIN pmgr_sites S ON S.id = Sopt.site_id
WHERE O.id = @oid
ORDER BY IF(U.id IS NOT NULL, 1,
IF (G.id IS NOT NULL, 2,
IF (S.id IS NOT NULL, 3, 4))) ASC,
IF (G.id IS NOT NULL, G.rank, 0) ASC
-- Option values relevant to the user and site, in order
SELECT O.name, V.value,
U.id AS uid, G.id AS gid, S.id as sid,
Dopt.id AS did, G.rank
FROM pmgr_option_values V
JOIN pmgr_options O ON O.id = V.option_id
LEFT JOIN pmgr_user_options Uopt ON Uopt.option_value_id = V.id
LEFT JOIN pmgr_group_options Gopt ON Gopt.option_value_id = V.id
LEFT JOIN pmgr_site_options Sopt ON Sopt.option_value_id = V.id
LEFT JOIN pmgr_default_options Dopt ON Dopt.option_value_id = V.id
LEFT JOIN pmgr_groups G ON G.id = Gopt.group_id
LEFT JOIN pmgr_users U ON U.id = Uopt.user_id
LEFT JOIN pmgr_sites S ON S.id = Sopt.site_id
JOIN pmgr_site_memberships M ON M.user_id = U.id AND M.site_id = S.id
WHERE S.id = @sid AND U.id = @uid AND O.id = @oid
ORDER BY IF(U.id IS NOT NULL, 1,
IF (G.id IS NOT NULL, 2,
IF (S.id IS NOT NULL, 3, 4))) ASC,
IF (G.id IS NOT NULL, G.rank, 0) ASC
SET @sid = 1;
SET @uid = 1;
SET @oid = 1;
SELECT O.name, V.value,
U.id AS uid,
-- G.id AS gid,
S.id as sid,
Dopt.id AS did
-- G.rank
FROM pmgr_option_values V
JOIN pmgr_options O ON O.id = V.option_id
LEFT JOIN pmgr_user_options Uopt ON Uopt.option_value_id = V.id
LEFT JOIN pmgr_site_options Sopt ON Sopt.option_value_id = V.id
-- LEFT JOIN pmgr_users U ON U.id = Uopt.user_id
-- LEFT JOIN pmgr_group_options Gopt ON Gopt.option_value_id = V.id
LEFT JOIN pmgr_default_options Dopt ON Dopt.option_value_id = V.id
-- LEFT JOIN pmgr_groups G ON G.id = Gopt.group_id
LEFT JOIN pmgr_users U ON U.id = Uopt.user_id
LEFT JOIN pmgr_sites S ON S.id = Sopt.site_id
JOIN pmgr_site_memberships M ON M.user_id = U.id -- AND M.site_id = S.id
WHERE -- S.id = @sid AND U.id = @uid AND
O.id = @oid
ORDER BY IF(U.id IS NOT NULL, 1,
-- IF (G.id IS NOT NULL, 2,
IF (S.id IS NOT NULL, 3, 4)) -- ) ASC,
-- IF (G.id IS NOT NULL, G.rank, 0) ASC
-- ------------------------------------------------------------
-- ------------------------------------------------------------
-- ------------------------------------------------------------
-- Working version (without defaults)
SET @sid = 1;
SET @uid = 1;
SET @oid = 1;
SELECT O.name, O.id AS oid, V.value, V.id AS vid,
U.id AS uid,
G.id AS gid,
S.id AS sid,
-- Dopt.id AS did
G.rank
FROM pmgr_users U
JOIN pmgr_site_memberships M ON M.user_id = U.id
JOIN pmgr_sites S ON S.id = M.site_id
LEFT JOIN pmgr_groups G ON G.id = M.group_id
LEFT JOIN pmgr_user_options Uopt ON Uopt.user_id = U.id
LEFT JOIN pmgr_group_options Gopt ON Gopt.group_id = G.id
LEFT JOIN pmgr_site_options Sopt ON Sopt.site_id = S.id
LEFT JOIN pmgr_option_values V ON (V.id = Uopt.option_value_id OR
V.id = Gopt.option_value_id OR
V.id = Sopt.option_value_id)
JOIN pmgr_options O ON O.id = V.option_id
WHERE S.id = @sid AND U.id = @uid AND O.id = @oid
ORDER BY IF(U.id IS NOT NULL, 1,
IF (G.id IS NOT NULL, 2,
IF (S.id IS NOT NULL, 3, 4))) ASC,
IF (G.id IS NOT NULL, G.rank, 0) ASC
;
SET @sid = 1;
SET @uid = 1;
SET @oid = 1;
SELECT O.name, O.id AS oid, V.value, V.id AS vid,
U.id AS uid,
G.id AS gid,
S.id AS sid,
-- Dopt.id AS did
G.rank
FROM pmgr_options O
LEFT JOIN pmgr_option_values V ON V.option_id = O.id
-- Now have the option and all possible values
LEFT JOIN pmgr_user_options Uopt ON Uopt.option_value_id = V.id
LEFT JOIN pmgr_group_options Gopt ON Gopt.option_value_id = V.id
LEFT JOIN pmgr_site_options Sopt ON Sopt.option_value_id = V.id
-- Now have the user/group/site that each value applies to
LEFT JOIN pmgr_users U U ON Uopt.user_id = U.id OR Uopt.user_id IS NULL
-- Now restricted to our user
JOIN pmgr_site_memberships M ON M.user_id = U.id
JOIN pmgr_sites S ON S.id = M.site_id
ON O.id = V.option_id
LEFT JOIN pmgr_groups G ON G.id = M.group_id
LEFT JOIN pmgr_option_values V ON (V.id = Uopt.option_value_id OR
V.id = Gopt.option_value_id OR
V.id = Sopt.option_value_id)
JOIN
WHERE S.id = @sid AND U.id = @uid AND O.id = @oid
ORDER BY IF(U.id IS NOT NULL, 1,
IF (G.id IS NOT NULL, 2,
IF (S.id IS NOT NULL, 3, 4))) ASC,
IF (G.id IS NOT NULL, G.rank, 0) ASC
;
SET @sid = 1;
SET @uid = 1;
SET @oid = 1;
SELECT O.name, O.id AS oid, V.value, V.id AS vid,
U.id AS uid,
G.id AS gid,
S.id AS sid,
-- Dopt.id AS did
G.rank
FROM pmgr_options O LEFT JOIN pmgr_option_values V ON V.option_id = O.id,
pmgr_users U
JOIN pmgr_site_memberships M ON M.user_id = U.id
JOIN pmgr_sites S ON S.id = M.site_id
LEFT JOIN pmgr_groups G ON G.id = M.group_id
LEFT JOIN pmgr_user_options Uopt ON Uopt.user_id = U.id
LEFT JOIN pmgr_group_options Gopt ON Gopt.group_id = G.id
LEFT JOIN pmgr_site_options Sopt ON Sopt.site_id = S.id,
WHERE S.id = @sid AND U.id = @uid AND O.id = @oid
AND (V.id = Uopt.option_value_id OR
V.id = Gopt.option_value_id OR
V.id = Sopt.option_value_id)
ORDER BY IF(U.id IS NOT NULL, 1,
IF (G.id IS NOT NULL, 2,
IF (S.id IS NOT NULL, 3, 4))) ASC,
IF (G.id IS NOT NULL, G.rank, 0) ASC
;

File diff suppressed because it is too large Load Diff

View File

@@ -3,3 +3,23 @@
RewriteRule ^$ webroot/ [L] RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L] RewriteRule (.*) webroot/$1 [L]
</IfModule> </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 * @subpackage cake.app
*/ */
class AppController extends Controller { class AppController extends Controller {
var $uses = array('Option', 'Permission');
var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid'); var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid');
var $components = array('DebugKit.Toolbar'); var $components = array('DebugKit.Toolbar');
var $sidemenu = array('areas' => array('SITE' => false, '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() { function __construct() {
$this->params['dev'] = false; $this->params['dev'] = false;
$this->params['admin'] = false; $this->params['admin'] = false;
parent::__construct(); 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, // Stupid Cake... our constructor sets admin/dev,
// but cake stomps it somewhere along the way // but cake stomps it somewhere along the way
// after constructing the CakeError controller. // after constructing the CakeError controller.
@@ -53,51 +349,56 @@ class AppController extends Controller {
$this->params['admin'] = false; $this->params['admin'] = false;
} }
$menu = array(); foreach ($this->sidemenu['areas'] AS $aname => &$area) {
$menu[] = array('name' => 'Common', 'header' => true); if (empty($area['enable']))
$menu[] = array('name' => 'Site Map', 'url' => array('controller' => 'maps', 'action' => 'view', 1)); $area = array();
$menu[] = array('name' => 'Units', 'url' => array('controller' => 'units', 'action' => 'index')); if (empty($area['subareas']))
$menu[] = array('name' => 'Leases', 'url' => array('controller' => 'leases', 'action' => 'index')); continue;
$menu[] = array('name' => 'Customers', 'url' => array('controller' => 'customers', 'action' => 'index')); ksort($area['subareas']);
$menu[] = array('name' => 'Deposits', 'url' => array('controller' => 'transactions', 'action' => 'deposit'));
if ($this->params['admin']) { foreach ($area['subareas'] AS $sname => &$subarea) {
$menu[] = array('name' => 'Admin', 'header' => true); if (empty($subarea['enable']))
$menu[] = array('name' => 'Accounts', 'url' => array('controller' => 'accounts', 'action' => 'index')); $subarea = array();
$menu[] = array('name' => 'Contacts', 'url' => array('controller' => 'contacts', 'action' => 'index')); if (empty($subarea['priorities']))
$menu[] = array('name' => 'Ledgers', 'url' => array('controller' => 'ledgers', 'action' => 'index')); continue;
$menu[] = array('name' => 'Tenders', 'url' => array('controller' => 'tenders', 'action' => 'index')); ksort($subarea['priorities']);
$menu[] = array('name' => 'Transactions', 'url' => array('controller' => 'transactions', 'action' => 'index'));
$menu[] = array('name' => 'Ldgr Entries', 'url' => array('controller' => 'ledger_entries', 'action' => 'index')); foreach ($subarea['priorities'] AS $pname => &$priority) {
$menu[] = array('name' => 'Stmt Entries', 'url' => array('controller' => 'statement_entries', 'action' => 'index')); if (empty($priority))
$menu[] = array('name' => 'New Ledgers', 'url' => array('controller' => 'accounts', 'action' => 'newledger')); unset($subarea['priorities'][$pname]);
$menu[] = array('name' => 'Assess Charges', 'url' => array('controller' => 'leases', 'action' => 'assess_all')); }
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']) { //pr($this->sidemenu);
$menu[] = array('name' => 'Development', 'header' => true); $this->set('sidemenu', $this->sidemenu);
$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'));
}
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'); **************************************************************************
} **************************************************************************
* override: redirect
function beforeRender() { */
$this->set('sidemenu', $this->sideMenuLinks());
}
function redirect($url, $status = null, $exit = true) { function redirect($url, $status = null, $exit = true) {
// OK, since the controller will not be able to // OK, since the controller will not be able to
@@ -127,28 +428,6 @@ class AppController extends Controller {
return parent::redirect($url, $status, $exit); 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 * helper: gridView
* - called by derived controllers to create an index listing * - 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) { function gridView($title, $action = null, $element = null) {
$this->sideMenuEnable('SITE', $this->op_area);
$this->sideMenuAreaActivate('CONTROLLER');
$this->set('title', $title); $this->set('title', $title);
// The resulting page will contain a grid, which will // The resulting page will contain a grid, which will
// use ajax to obtain the actual data for this action // 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("/</", "&lt;", $xml);
$xml = preg_replace("/>/", "&gt;", $xml); $xml = preg_replace("/>/", "&gt;", $xml);
echo ("\n<PRE>\n$xml\n</PRE>\n"); echo ("\n<PRE>\n$xml\n</PRE>\n");
$this->render_empty();
} }
} }
@@ -314,8 +600,8 @@ class AppController extends Controller {
// Grouping (which would not be typical) // Grouping (which would not be typical)
$query['group'] = $this->gridDataCountGroup($params, $model); $query['group'] = $this->gridDataCountGroup($params, $model);
// DEBUG PURPOSES ONLY! if ($params['debug'])
$params['count_query'] = $query; $params['count_query'] = $query;
// Get the number of records prior to pagination // Get the number of records prior to pagination
return $this->gridDataCountExecute($params, $model, $query); return $this->gridDataCountExecute($params, $model, $query);
@@ -571,8 +857,8 @@ class AppController extends Controller {
isset($params['sidx']) ? $params['sidx'] : null, isset($params['sidx']) ? $params['sidx'] : null,
isset($params['sord']) ? $params['sord'] : null); isset($params['sord']) ? $params['sord'] : null);
// DEBUG PURPOSES ONLY! if ($params['debug'])
$params['query'] = $query; $params['query'] = $query;
return $this->gridDataRecordsExecute($params, $model, $query); return $this->gridDataRecordsExecute($params, $model, $query);
} }
@@ -695,6 +981,7 @@ class AppController extends Controller {
$this->gridDataPostProcessLinks($params, $model, $records, array()); $this->gridDataPostProcessLinks($params, $model, $records, array());
// DEBUG PURPOSES ONLY! // DEBUG PURPOSES ONLY!
//if ($params['debug'])
//$params['records'] = $records; //$params['records'] = $records;
} }
@@ -772,6 +1059,7 @@ class AppController extends Controller {
continue; continue;
// DEBUG PURPOSES ONLY! // DEBUG PURPOSES ONLY!
//if ($params['debug'])
//$params['linkrecord'][] = compact('table', 'field', 'id', 'controller', 'record'); //$params['linkrecord'][] = compact('table', 'field', 'id', 'controller', 'record');
$record[$table][$field] = $record[$table][$field] =
'<A HREF="' . '<A HREF="' .
@@ -802,9 +1090,8 @@ class AppController extends Controller {
} }
function gridDataOutputHeader(&$params, &$model) { function gridDataOutputHeader(&$params, &$model) {
if (!$params['debug']) { if (!$params['debug'])
header("Content-type: text/xml;charset=utf-8"); header("Content-type: text/xml;charset=utf-8");
}
} }
function gridDataOutputXMLHeader(&$params, &$model) { function gridDataOutputXMLHeader(&$params, &$model) {
@@ -867,14 +1154,26 @@ class AppController extends Controller {
echo " <cell><![CDATA[$data]]></cell>\n"; 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) { function INTERNAL_ERROR($msg, $depth = 0) {
INTERNAL_ERROR($msg, false, $depth+1); INTERNAL_ERROR($msg, false, $depth+1);
$this->render_empty(); $this->render_empty();
$this->_stop();
} }
function render_empty() { 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 { class AppHelper extends Helper {
function url($url = null, $full = false) { 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])) if (isset($this->params[$mod]) && is_array($url) && !isset($url[$mod]))
$url[$mod] = $this->params[$mod]; $url[$mod] = $this->params[$mod];
} }

View File

@@ -42,6 +42,10 @@ class AppModel extends Model {
var $useNullForEmpty = true; var $useNullForEmpty = true;
var $formatDateFields = 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 // Default Log Level, if not specified at the function level
var $default_log_level = 5; var $default_log_level = 5;
@@ -58,16 +62,35 @@ class AppModel extends Model {
var $max_log_level; 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 * function: __construct
// to have a constructor call the parent... */
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);
$caller = array_shift($trace); $caller = array_shift($trace);
if (empty($class)) if (empty($class))
$class = $caller['class']; $class = get_class($this);
$this->pr(50, compact('class', 'level'));
$this->class_log_level[$class] = $level; $this->class_log_level[$class] = $level;
} }
@@ -90,9 +114,10 @@ class AppModel extends Model {
$caller = array_shift($trace); $caller = array_shift($trace);
$caller = array_shift($trace); $caller = array_shift($trace);
if (empty($class)) if (empty($class))
$class = $caller['class']; $class = get_class($this);
if (empty($function)) if (empty($function))
$function = $caller['function']; $function = $caller['function'];
$this->pr(50, compact('class', 'function', 'level'));
$this->function_log_level["{$class}-{$function}"] = $level; $this->function_log_level["{$class}-{$function}"] = $level;
} }
@@ -280,7 +305,9 @@ class AppModel extends Model {
if (preg_match("/^_/", $name) && !$all) if (preg_match("/^_/", $name) && !$all)
unset($vars[$name]); 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)); return date('Y-m-d', strtotime($dateString));
} }
function INTERNAL_ERROR($msg, $depth = 0) { function INTERNAL_ERROR($msg, $depth = 0, $force_stop = false) {
INTERNAL_ERROR($msg, false, $depth+1); INTERNAL_ERROR($msg, $force_stop, $depth+1);
echo $this->requestAction(array('controller' => 'accounts', echo $this->requestAction(array('controller' => 'util',
'action' => 'render_empty'), 'action' => 'render_empty'),
array('return', 'bare' => false) array('return', 'bare' => false)
); );

5
site/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
site/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) { 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 '<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 '<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"; 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"; 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 // 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 '<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); $trace = array_slice(debug_backtrace(false), $drop);
for ($i = 0; $i < count($trace); ++$i) { for ($i = 0; $i < count($trace); ++$i) {
$bline = $trace[$i]['line']; $bline = $trace[$i]['line'];
@@ -57,14 +81,36 @@ function INTERNAL_ERROR($message, $exit = true, $drop = 0) {
$bclas = null; $bclas = null;
} }
$O->log(" $bfile:$bline (" . ($bclas ? "$bclas::$bfunc" : "entry point") . ")");
echo("<LI>$bfile:$bline (" . ($bclas ? "$bclas::$bfunc" : "entry point") . ")</LI>\n"); echo("<LI>$bfile:$bline (" . ($bclas ? "$bclas::$bfunc" : "entry point") . ")</LI>\n");
} }
echo "</OL>\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 '<HR style="margin-top:1.0em; margin-bottom:0.5em;">' . "\nHTTP Request:\n";
echo '<P><PRE style="color:#000; background:#c22;">' . "\n"; echo '<UL style="margin-top:0.5em; margin-left:0.0em";>' . "\n";
print_r($_REQUEST); foreach($_REQUEST AS $k => $v) {
echo "\n</PRE>\n"; $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>'; echo '</DIV>';
if ($exit) if ($exit)

View File

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

View File

@@ -10,5 +10,12 @@ class DATABASE_CONFIG {
'database' => 'property_manager', 'database' => 'property_manager',
'prefix' => 'pmgr_', '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); Router::connect('/', $default_path);
/* /*
* Route for admin functionality * Route for sandbox functionality
*/ */
Router::connect('/admin', Router::connect('/sand',
array('admin_route' => true) + $default_path); array('sand_route' => true) + $default_path);
Router::connect('/admin/:controller/:action/*', Router::connect('/sand/:controller/:action/*',
array('admin_route' => true, 'action' => null)); array('sand_route' => true, 'action' => null));
/* /*
* Route for development functionality * Route for developement functionality
*/ */
Router::connect('/dev', Router::connect('/dev',
array('dev_route' => true) + $default_path); array('dev_route' => true) + $default_path);

View File

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

View File

@@ -2,18 +2,6 @@
class ContactsController extends AppController { 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. * 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) { function gridDataOrder(&$params, &$model, $index, $direction) {
$order = parent::gridDataOrder($params, $model, $index, $direction); $order = parent::gridDataOrder($params, $model, $index, $direction);
if ($index === 'Contact.last_name') {
$order[] = 'Contact.first_name ' . $direction; // After sorting by whatever the user wants, add these
} // defaults into the sort mechanism. If we're already
if ($index === 'Contact.first_name') { // sorting by one of them, it will only be redundant,
$order[] = 'Contact.last_name ' . $direction; // and should cause no harm (possible a longer query?)
} $order[] = 'Contact.last_name ' . $direction;
$order[] = 'Contact.first_name ' . $direction;
return $order; return $order;
} }
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) { function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['Contact'] = array('id'); $links['Contact'] = array('display_name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links); return parent::gridDataPostProcessLinks($params, $model, $records, $links);
} }
@@ -78,13 +81,9 @@ class ContactsController extends AppController {
)); ));
// Set up dynamic menu items // Set up dynamic menu items
$this->sidemenu_links[] = $this->addSideMenuLink('Edit',
array('name' => 'Operations', 'header' => true); array('action' => 'edit', $id), null,
'ACTION');
$this->sidemenu_links[] =
array('name' => 'Edit',
'url' => array('action' => 'edit',
$id));
// Prepare to render. // Prepare to render.
$title = 'Contact: ' . $contact['Contact']['display_name']; $title = 'Contact: ' . $contact['Contact']['display_name'];

View File

@@ -1,25 +1,31 @@
<?php <?php
class CustomersController extends AppController { 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 * override: addGridViewSideMenuLinks
* - Generates controller specific links for the side menu * - 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; return $conditions;
} }
function gridDataOrder(&$params, &$model, $index, $direction) { function gridDataFilterTablesConfig(&$params, &$model, $table) {
$order = array(); $config = parent::gridDataFilterTablesConfig($params, $model, $table);
$order[] = parent::gridDataOrder($params, $model, $index, $direction);
if ($index !== 'PrimaryContact.last_name') // Special case for Contact; We need the Contact/Customer relationship
$order[] = parent::gridDataOrder($params, $model, if ($table == 'Contact')
'PrimaryContact.last_name', $direction); $config = array('fields' => array('ContactsCustomer.type',
if ($index !== 'PrimaryContact.first_name') 'ContactsCustomer.active'),
$order[] = parent::gridDataOrder($params, $model, 'conditions' => array('ContactsCustomer.active' => true),
'PrimaryContact.first_name', $direction); );
if ($index !== 'Customer.id')
$order[] = parent::gridDataOrder($params, $model, return $config;
'Customer.id', $direction); }
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; return $order;
} }
@@ -111,14 +127,18 @@ class CustomersController extends AppController {
* - Sets up the move-in page for the given customer. * - 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(); $customer = array();
$unit = array(); $unit = array();
if (isset($id)) { if (!empty($id)) {
$this->Customer->recursive = -1; $this->Customer->recursive = -1;
$customer = current($this->Customer->read(null, $id)); $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')); $this->set(compact('customer', 'unit'));
$title = 'Customer Move-In'; $title = 'Customer Move-In';
@@ -219,52 +239,71 @@ class CustomersController extends AppController {
$outstanding_deposit = $this->Customer->securityDepositBalance($id); $outstanding_deposit = $this->Customer->securityDepositBalance($id);
// Figure out if this customer has any non-closed leases // Figure out if this customer has any non-closed leases
$show_moveout = false; $show_moveout = false; $moveout_lease_id = null;
$show_payment = false; $show_payment = false; $payment_lease_id = null;
foreach ($customer['Lease'] AS $lease) { 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; $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; $show_moveout = true;
}
} }
// Set up dynamic menu items // 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) if ($show_payment || $outstanding_balance > 0)
$this->sidemenu_links[] = $this->addSideMenuLink('New Receipt',
array('name' => 'New Receipt', array('action' => 'receipt', $id), null,
'url' => array('action' => 'receipt', 'ACTION');
$id));
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) if (!$show_moveout && $outstanding_balance > 0)
$this->sidemenu_links[] = $this->addSideMenuLink('Write-Off',
array('name' => 'Write-Off', array('action' => 'bad_debt', $id), null,
'url' => array('action' => 'bad_debt', 'ACTION');
$id));
if ($outstanding_balance < 0) if ($outstanding_balance < 0)
$this->sidemenu_links[] = $this->addSideMenuLink('Issue Refund',
array('name' => 'Issue Refund', array('action' => 'refund', $id), null,
'url' => array('action' => 'refund', $id)); 'ACTION');
$this->addSideMenuLink('Edit',
array('action' => 'edit', $id), null,
'ACTION');
// Prepare to render. // Prepare to render.
$title = 'Customer: ' . $customer['Customer']['name']; $title = 'Customer: ' . $customer['Customer']['name'];
@@ -322,7 +361,17 @@ class CustomersController extends AppController {
$this->redirect(array('action'=>'view', $this->Customer->id)); $this->redirect(array('action'=>'view', $this->Customer->id));
// Since this is a new customer, go to the move in screen. // 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) { if ($id) {
@@ -385,7 +434,8 @@ class CustomersController extends AppController {
* - Add a new customer * - Add a new customer
*/ */
function add() { function add($unit_id = null) {
$this->set('movein', array('Unit' => array('id' => $unit_id)));
$this->edit(); $this->edit();
} }

View File

@@ -2,19 +2,6 @@
class DoubleEntriesController extends AppController { 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')), array('contain' => array('Ledger' => array('Account')),
'conditions' => array('DebitEntry.id' => $entry['DebitEntry']['id']), 'conditions' => array('DebitEntry.id' => $entry['DebitEntry']['id']),
)); ));
$entry['Ledger']['link'] =
$entry['Ledger']['Account']['level'] >=
$this->Permission->level('controller.accounts');
$entry['DebitLedger'] = $entry['Ledger']; $entry['DebitLedger'] = $entry['Ledger'];
unset($entry['Ledger']); unset($entry['Ledger']);
@@ -55,6 +45,9 @@ class DoubleEntriesController extends AppController {
array('contain' => array('Ledger' => array('Account')), array('contain' => array('Ledger' => array('Account')),
'conditions' => array('CreditEntry.id' => $entry['CreditEntry']['id']), 'conditions' => array('CreditEntry.id' => $entry['CreditEntry']['id']),
)); ));
$entry['Ledger']['link'] =
$entry['Ledger']['Account']['level'] >=
$this->Permission->level('controller.accounts');
$entry['CreditLedger'] = $entry['Ledger']; $entry['CreditLedger'] = $entry['Ledger'];
unset($entry['Ledger']); unset($entry['Ledger']);

View File

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

View File

@@ -2,19 +2,6 @@
class LedgerEntriesController extends AppController { 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) { function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['LedgerEntry'] = array('id'); $links['LedgerEntry'] = array('id');
$links['Transaction'] = array('id'); $links['Transaction'] = array('id');
$links['Ledger'] = array('id'); // REVISIT <AP>: 20090827
$links['Account'] = array('controller' => 'accounts', 'name'); // Need to take 'level' into account
if ($this->Permission->allow('controller.accounts')) {
$links['Ledger'] = array('id');
$links['Account'] = array('name');
}
$links['Tender'] = array('name'); $links['Tender'] = array('name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links); return parent::gridDataPostProcessLinks($params, $model, $records, $links);
} }
@@ -157,12 +148,8 @@ class LedgerEntriesController extends AppController {
array('fields' => array('id', 'sequence', 'name'), array('fields' => array('id', 'sequence', 'name'),
'Account' => 'Account' =>
array('fields' => array('id', 'name', 'type'), array('fields' => array('id', 'name', 'type'),
'conditions' => ),
// REVISIT <AP>: 20090811 ),
// No security issues have been worked out yet
array('Account.level >=' => 5),
),
),
'Tender' => 'Tender' =>
array('fields' => array('id', 'name'), array('fields' => array('id', 'name'),

View File

@@ -2,22 +2,26 @@
class LedgersController extends AppController { 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 * override: addGridViewSideMenuLinks
* - Generates controller specific links for the side menu * - 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); $conditions[] = array('Ledger.close_transaction_id !=' => null);
} }
// REVISIT <AP>: 20090811 $conditions[] = array('Account.level >=' =>
// No security issues have been worked out yet $this->Permission->level('controller.accounts'));
$conditions[] = array('Account.level >=' => 10);
return $conditions; return $conditions;
} }
function gridDataOrder(&$params, &$model, $index, $direction) { 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); $order = parent::gridDataOrder($params, $model, $index, $direction);
if ($id_sequence) { // After sorting by whatever the user wants, add these
$order[] = 'Ledger.sequence ' . $direction; // 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; return $order;
} }
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) { function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['Ledger'] = array('id_sequence'); // REVISIT <AP>: 20090827
$links['Account'] = array('name'); // 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); return parent::gridDataPostProcessLinks($params, $model, $records, $links);
} }
@@ -127,9 +131,8 @@ class LedgersController extends AppController {
'Account', 'Account',
), ),
'conditions' => array(array('Ledger.id' => $id), 'conditions' => array(array('Ledger.id' => $id),
// REVISIT <AP>: 20090811 array('Account.level >=' =>
// No security issues have been worked out yet $this->Permission->level('controller.accounts')),
array('Account.level >=' => 10),
), ),
) )
); );

View File

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

View File

@@ -2,19 +2,6 @@
class StatementEntriesController extends AppController { 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)) if (isset($customer_id))
$conditions[] = array('StatementEntry.customer_id' => $customer_id); $conditions[] = array('StatementEntry.customer_id' => $customer_id);
if (isset($statement_entry_id)) { if (isset($statement_entry_id))
$conditions[] = array('OR' => $conditions[] = array('OR' =>
array(array('ChargeEntry.id' => $statement_entry_id), array(array('ChargeEntry.id' => $statement_entry_id),
array('DisbursementEntry.id' => $statement_entry_id))); array('DisbursementEntry.id' => $statement_entry_id)));
}
if ($params['action'] === 'unreconciled') { if ($params['action'] === 'unreconciled') {
$query = array('conditions' => $conditions); $query = array('conditions' => $conditions);
@@ -145,7 +131,10 @@ class StatementEntriesController extends AppController {
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) { function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['StatementEntry'] = array('id'); $links['StatementEntry'] = array('id');
$links['Transaction'] = array('id'); $links['Transaction'] = array('id');
$links['Account'] = array('name'); // REVISIT <AP>: 20090827
// Need to take 'level' into account
if ($this->Permission->allow('controller.accounts'))
$links['Account'] = array('name');
$links['Customer'] = array('name'); $links['Customer'] = array('name');
$links['Lease'] = array('number'); $links['Lease'] = array('number');
$links['Unit'] = array('name'); $links['Unit'] = array('name');
@@ -266,15 +255,12 @@ class StatementEntriesController extends AppController {
('first', ('first',
array('contain' => array array('contain' => array
('Transaction' => array('fields' => array('id', 'type', 'stamp')), ('Transaction' => array('fields' => array('id', 'type', 'stamp')),
'Account' => array('id', 'name', 'type'), 'Account' => array('id', 'name', 'type', 'level'),
'Customer' => array('fields' => array('id', 'name')), 'Customer' => array('fields' => array('id', 'name')),
'Lease' => array('fields' => array('id')), 'Lease' => array('fields' => array('id', 'number')),
), ),
'conditions' => array(array('StatementEntry.id' => $id), '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')); $this->redirect(array('controller' => 'accounts', 'action'=>'index'));
} }
$entry['Account']['link'] =
$entry['Account']['level'] >=
$this->Permission->level('controller.accounts');
$stats = $this->StatementEntry->stats($id); $stats = $this->StatementEntry->stats($id);
if (in_array(strtoupper($entry['StatementEntry']['type']), $this->StatementEntry->debitTypes())) if (in_array(strtoupper($entry['StatementEntry']['type']), $this->StatementEntry->debitTypes()))
@@ -293,24 +283,16 @@ class StatementEntriesController extends AppController {
if (strtoupper($entry['StatementEntry']['type']) === 'CHARGE') { if (strtoupper($entry['StatementEntry']['type']) === 'CHARGE') {
$reversable = $this->StatementEntry->reversable($id);
// Set up dynamic menu items // Set up dynamic menu items
if ($reversable || $stats['balance'] > 0) if ($this->StatementEntry->reversable($id))
$this->sidemenu_links[] = $this->addSideMenuLink('Reverse',
array('name' => 'Operations', 'header' => true); array('action' => 'reverse', $id), null,
'ACTION');
if ($reversable)
$this->sidemenu_links[] =
array('name' => 'Reverse',
'url' => array('action' => 'reverse',
$id));
if ($stats['balance'] > 0) if ($stats['balance'] > 0)
$this->sidemenu_links[] = $this->addSideMenuLink('Waive Balance',
array('name' => 'Waive Balance', array('action' => 'waive', $id), null,
'url' => array('action' => 'waive', 'ACTION');
$id));
} }
// Prepare to render. // Prepare to render.

View File

@@ -2,19 +2,6 @@
class TendersController extends AppController { 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) { function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['Tender'] = array('name', 'id'); $links['Tender'] = array('name', 'id');
$links['Customer'] = array('name'); $links['Customer'] = array('name');
$links['TenderType'] = array('name'); //$links['TenderType'] = array('name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links); 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']) if (!empty($tender['Tender']['deposit_transaction_id'])
&& empty($tender['Tender']['nsf_transaction_id']) && empty($tender['Tender']['nsf_transaction_id'])
// Hard to tell what types of items can come back as NSF. // 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) // (or if we're in development mode)
&& (!empty($tender['TenderType']['data1_name']) || !empty($this->params['dev'])) && (!empty($tender['TenderType']['data1_name']) || !empty($this->params['dev']))
) { ) {
$this->sidemenu_links[] = $this->addSideMenuLink('NSF',
array('name' => 'NSF', array('action' => 'nsf', $id), null,
'url' => array('action' => 'nsf', 'ACTION');
$id));
} }
// 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. // Prepare to render.
$title = "Tender #{$tender['Tender']['id']} : {$tender['Tender']['name']}"; $title = "Tender #{$tender['Tender']['id']} : {$tender['Tender']['name']}";
$this->set(compact('tender', 'title')); $this->set(compact('tender', 'title'));

View File

@@ -4,23 +4,35 @@ class TransactionsController extends AppController {
var $components = array('RequestHandler'); 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 * override: addGridViewSideMenuLinks
* - Generates controller specific links for the side menu * - 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 invoice() { $this->gridView('Invoices'); }
function receipt() { $this->gridView('Receipts'); } function receipt() { $this->gridView('Receipts'); }
function deposit() { function deposit() {
$this->sidemenu_links = array /* $this->addSideMenuLink('New Deposit', */
(array('name' => 'Operations', 'header' => true), /* array('controller' => 'tenders', 'action' => 'deposit'), null, */
array('name' => 'New Deposit', 'url' => array('controller' => 'tenders', /* 'CONTROLLER', $this->new_area); */
'action' => 'deposit')));
$this->gridView('Deposits'); $this->gridView('Deposits');
} }
@@ -84,10 +95,6 @@ class TransactionsController extends AppController {
if (in_array($params['action'], array('invoice', 'receipt', 'deposit'))) if (in_array($params['action'], array('invoice', 'receipt', 'deposit')))
$conditions[] = array('Transaction.type' => strtoupper($params['action'])); $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; return $conditions;
} }
@@ -105,7 +112,7 @@ class TransactionsController extends AppController {
* - handles the creation of a charge invoice * - handles the creation of a charge invoice
*/ */
function postInvoice() { function postInvoice($redirect = true) {
if (!$this->RequestHandler->isPost()) { if (!$this->RequestHandler->isPost()) {
echo('<H2>THIS IS NOT A POST FOR SOME REASON</H2>'); echo('<H2>THIS IS NOT A POST FOR SOME REASON</H2>');
return; return;
@@ -120,6 +127,17 @@ class TransactionsController extends AppController {
die("<H1>INVOICE FAILED</H1>"); 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->layout = null;
$this->autoLayout = false; $this->autoLayout = false;
$this->autoRender = false; $this->autoRender = false;
@@ -133,7 +151,7 @@ class TransactionsController extends AppController {
* - handles the creation of a receipt * - handles the creation of a receipt
*/ */
function postReceipt() { function postReceipt($redirect = true) {
if (!$this->RequestHandler->isPost()) { if (!$this->RequestHandler->isPost()) {
echo('<H2>THIS IS NOT A POST FOR SOME REASON</H2>'); echo('<H2>THIS IS NOT A POST FOR SOME REASON</H2>');
return; return;
@@ -157,6 +175,11 @@ class TransactionsController extends AppController {
die("<H1>RECEIPT FAILED</H1>"); die("<H1>RECEIPT FAILED</H1>");
} }
if ($redirect)
$this->redirect(array('controller' => 'customers',
'action' => 'view',
$this->data['Customer']['id']));
$this->layout = null; $this->layout = null;
$this->autoLayout = false; $this->autoLayout = false;
$this->autoRender = false; $this->autoRender = false;
@@ -370,9 +393,11 @@ class TransactionsController extends AppController {
* irreversibly destroys the data. It is not for normal use. * 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->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', ('first',
array('contain' => array('contain' =>
array(// Models array(// Models
'Account(id,name)', 'Account(id,name,level)',
'Ledger(id,name)', 'Ledger(id,sequence)',
'NsfTender(id,name)', 'NsfTender(id,name)',
), ),
'conditions' => array(array('Transaction.id' => $id), '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)) { if (empty($transaction)) {
$this->Session->setFlash(__('Invalid Item.', true)); $this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('action'=>'index')); $this->redirect(array('action'=>'index'));
} }
if ($transaction['Transaction']['type'] === 'DEPOSIT' || $this->params['dev']) { $transaction['Account']['link'] =
$this->sidemenu_links[] = $transaction['Account']['level'] >=
array('name' => 'Operations', 'header' => true); $this->Permission->level('controller.accounts');
if ($transaction['Transaction']['type'] === 'DEPOSIT') if ($transaction['Transaction']['type'] === 'DEPOSIT')
$this->sidemenu_links[] = $this->addSideMenuLink('View Slip',
array('name' => 'View Slip', 'url' => array('action' => 'deposit_slip', $id)); array('action' => 'deposit_slip', $id), null,
if ($this->params['dev']) 'ACTION');
$this->sidemenu_links[] =
array('name' => 'Destroy', 'url' => array('action' => 'destroy', $id), $this->addSideMenuLink('Destroy',
'confirmMessage' => ("This may leave the database in an unstable state." . array('action' => 'destroy', $id),
" Do NOT do this unless you know what you're doing." . array('confirmMessage' =>
" Proceed anyway?")); "This may leave the database in an unstable state." .
} " Do NOT do this unless you know what you're doing." .
" Proceed anyway?"),
'ACTION', $this->admin_area);
// OK, prepare to render. // OK, prepare to render.
$title = 'Transaction #' . $transaction['Transaction']['id']; $title = 'Transaction #' . $transaction['Transaction']['id'];
@@ -440,15 +458,12 @@ class TransactionsController extends AppController {
*/ */
function deposit_slip($id) { function deposit_slip($id) {
// Build a container for the deposit slip data // Find the deposit transaction
$deposit = array('types' => array()); $this->Transaction->id = $id;
$deposit = $this->Transaction->find('first', array('contain' => false));
$this->id = $id;
$deposit +=
$this->Transaction->find('first', array('contain' => false));
// Get a summary of all forms of tender in the deposit // Get a summary of all forms of tender in the deposit
$result = $this->Transaction->find $tenders = $this->Transaction->find
('all', ('all',
array('link' => array('DepositTender' => array('link' => array('DepositTender' =>
array('fields' => array(), array('fields' => array(),
@@ -463,16 +478,17 @@ class TransactionsController extends AppController {
'group' => 'TenderType.id', 'group' => 'TenderType.id',
)); ));
if (empty($result)) { // Verify the deposit exists, and that something was actually deposited
die(); if (empty($deposit) || empty($tenders)) {
$this->Session->setFlash(__('Invalid Deposit.', true)); $this->Session->setFlash(__('Invalid Deposit.', true));
$this->redirect(array('action'=>'deposit')); $this->redirect(array('action'=>'deposit'));
} }
// Add the summary to our deposit slip data container // Add the summary to our deposit slip data container
foreach ($result AS $type) { $deposit['types'] = array();
$deposit['types'][$type['TenderType']['id']] = foreach ($tenders AS $tender) {
$type['TenderType'] + $type[0]; $deposit['types'][$tender['TenderType']['id']] =
$tender['TenderType'] + $tender[0];
} }
$deposit_total = 0; $deposit_total = 0;
@@ -482,10 +498,9 @@ class TransactionsController extends AppController {
if ($deposit['Transaction']['amount'] != $deposit_total) if ($deposit['Transaction']['amount'] != $deposit_total)
$this->INTERNAL_ERROR("Deposit items do not add up to deposit slip total"); $this->INTERNAL_ERROR("Deposit items do not add up to deposit slip total");
$this->sidemenu_links[] = $this->addSideMenuLink('View',
array('name' => 'Operations', 'header' => true); array('action' => 'view', $id), null,
$this->sidemenu_links[] = 'ACTION');
array('name' => 'View Transaction', 'url' => array('action' => 'view', $id));
$title = 'Deposit Slip'; $title = 'Deposit Slip';
$this->set(compact('title', 'deposit')); $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 { 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 * override: addGridViewSideMenuLinks
* - Generates controller specific links for the side menu * - 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 unavailable() { $this->gridView('Unavailable Units'); }
function vacant() { $this->gridView('Vacant Units'); } function vacant() { $this->gridView('Vacant Units'); }
function occupied() { $this->gridView('Occupied 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'); } function all() { $this->gridView('All Units', 'all'); }
@@ -81,6 +95,7 @@ class UnitsController extends AppController {
function gridDataFields(&$params, &$model) { function gridDataFields(&$params, &$model) {
$fields = parent::gridDataFields($params, $model); $fields = parent::gridDataFields($params, $model);
$fields[] = 'ROUND(UnitSize.width/12 * UnitSize.depth/12, 0) AS sqft';
return array_merge($fields, return array_merge($fields,
$this->Unit->Lease->StatementEntry->chargeDisbursementFields(true)); $this->Unit->Lease->StatementEntry->chargeDisbursementFields(true));
} }
@@ -100,6 +115,12 @@ class UnitsController extends AppController {
elseif ($params['action'] === 'unoccupied') { elseif ($params['action'] === 'unoccupied') {
$conditions[] = array('NOT' => array($this->Unit->conditionOccupied())); $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; return $conditions;
} }
@@ -139,7 +160,7 @@ class UnitsController extends AppController {
$customer = array(); $customer = array();
$unit = array(); $unit = array();
if (isset($id)) { if (!empty($id)) {
$this->Unit->recursive = -1; $this->Unit->recursive = -1;
$unit = current($this->Unit->read(null, $id)); $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']); $outstanding_deposit = $this->Unit->Lease->securityDepositBalance($unit['CurrentLease']['id']);
} }
// Set up dynamic menu items // If the unit is occupied, but not locked, provide a
$this->sidemenu_links[] = // mechanism to do so. This doesn't have to be restricted
array('name' => 'Operations', 'header' => true); // 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[] = // If the unit is locked, provide an option to unlock it,
array('name' => 'Edit', 'url' => array('action' => 'edit', // unless it's locked due to lien, which is not so simple.
$id)); 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']) && // If there is a current lease on this unit, then provide
!isset($unit['CurrentLease']['moveout_date'])) { // a link to move the tenant out. Current lease for a unit
$this->sidemenu_links[] = // has a bit different definition than a current lease for
array('name' => 'Move-Out', 'url' => array('action' => 'move_out', // a customer, since a lease stays with a customer until it
$id)); // 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'])) { } elseif ($this->Unit->available($unit['Unit']['status'])) {
$this->sidemenu_links[] = $this->addSideMenuLink('Move-In',
array('name' => 'Move-In', 'url' => array('action' => 'move_in', array('action' => 'move_in', $id), null,
$id)); 'ACTION');
} else { } else {
// Unit is unavailable (dirty, damaged, reserved, business-use, etc) // Unit is unavailable (dirty, damaged, reserved, business-use, etc)
} }
if (isset($unit['CurrentLease']['id']) && // If there is a current lease, allow new charges to
!isset($unit['CurrentLease']['close_date'])) { // be added, and payments to be made.
$this->sidemenu_links[] = if (isset($unit['CurrentLease']['id'])) {
array('name' => 'New Invoice', 'url' => array('controller' => 'leases', $this->addSideMenuLink('New Invoice',
'action' => 'invoice', array('controller' => 'leases',
$unit['CurrentLease']['id'])); 'action' => 'invoice',
$this->sidemenu_links[] = $unit['CurrentLease']['id']), null,
array('name' => 'New Receipt', 'url' => array('controller' => 'customers', 'ACTION');
'action' => 'receipt', $this->addSideMenuLink('New Receipt',
$unit['CurrentLease']['customer_id'])); array('controller' => 'customers',
'action' => 'receipt',
$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. // Prepare to render.
$title = 'Unit ' . $unit['Unit']['name']; $title = 'Unit ' . $unit['Unit']['name'];
$this->set(compact('unit', 'title', $this->set(compact('unit', 'title',
@@ -328,7 +391,6 @@ class UnitsController extends AppController {
$this->set(compact('unit_sizes')); $this->set(compact('unit_sizes'));
// Prepare to render. // Prepare to render.
pr($this->data);
$this->set(compact('title')); $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) { function relatedAccounts($attribute, $extra = null) {
$this->cacheQueries = true; $this->cacheQueries = true;
$accounts = $this->find('all', array $accounts = $this->find('all', array
('contain' => array('CurrentLedger'), ('fields' => array('Account.id', 'Account.name'),
'fields' => array('Account.id', 'Account.type', 'Account.name', 'CurrentLedger.id'),
'conditions' => array('Account.'.$attribute => true), 'conditions' => array('Account.'.$attribute => true),
'order' => array('Account.name'), 'order' => array('Account.name'),
) + (isset($extra) ? $extra : array()) ) + (isset($extra) ? $extra : array())
@@ -213,21 +212,10 @@ class Account extends AppModel {
* - Returns an array of accounts suitable for activity xxx * - Returns an array of accounts suitable for activity xxx
*/ */
function invoiceAccounts() { function invoiceAccounts() { return $this->relatedAccounts('invoices'); }
return $this->relatedAccounts('invoices', array('order' => 'name')); function receiptAccounts() { return $this->relatedAccounts('receipts'); }
} function depositAccounts() { return $this->relatedAccounts('deposits'); }
function refundAccounts() { return $this->relatedAccounts('refunds'); }
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'));
}
/************************************************************************** /**************************************************************************

View File

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

View File

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

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
site/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);
}
}

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));
}
}

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
site/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));
}
}

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
site/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 <?php
class Site extends AppModel { class Site extends AppModel {
var $name = 'Site'; var $hasMany =
var $validate = array( array('SiteArea',
'id' => array('numeric'), 'SiteOption',
'name' => array('notempty') 'Membership',
); );
var $hasMany = array( static $current_site_id;
'SiteArea',
'SiteOption',
);
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;
}
} }
?> ?>

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'])) if (isset($ids['transaction_id']))
$ids['deposit_id'] = $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) { foreach ($tender_groups AS $group => $tender_ids) {
$entry_id = $ids['entries'][$group]['DoubleEntry']['Entry2']['ledger_entry_id']; $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 $this->LedgerEntry->Tender->updateAll
(array('Tender.deposit_transaction_id' => $ids['deposit_id'], (array('Tender.deposit_transaction_id' => $ids['deposit_id'],
'Tender.deposit_ledger_entry_id' => $entry_id), 'Tender.deposit_ledger_entry_id' => $entry_id),
@@ -530,6 +534,8 @@ class Transaction extends AppModel {
(in_array($transaction['type'], array('INVOICE', 'RECEIPT')) (in_array($transaction['type'], array('INVOICE', 'RECEIPT'))
&& empty($transaction['customer_id'])) && 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); return $this->prReturn(false);
} }
@@ -545,6 +551,8 @@ class Transaction extends AppModel {
} }
if (!empty($se) && if (!empty($se) &&
!$this->StatementEntry->verifyStatementEntry($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); return $this->prReturn(false);
} }
} }
@@ -584,8 +592,11 @@ class Transaction extends AppModel {
// Save transaction to the database // Save transaction to the database
$this->create(); $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); return $this->prReturn(array('error' => true) + $ret);
}
$ret['transaction_id'] = $transaction['id'] = $this->id; $ret['transaction_id'] = $transaction['id'] = $this->id;
// Add the entries // Add the entries
@@ -661,6 +672,11 @@ class Transaction extends AppModel {
if (!empty($transaction['customer_id'])) { if (!empty($transaction['customer_id'])) {
$this->Customer->update($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); return $this->prReturn($ret);
} }
@@ -681,8 +697,11 @@ class Transaction extends AppModel {
$this->prEnter(compact('control', 'transaction', 'entries', 'split')); $this->prEnter(compact('control', 'transaction', 'entries', 'split'));
// Verify that we have a transaction // 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)); return $this->prReturn(array('error' => true));
}
// If the entries are not already split, do so now. // If the entries are not already split, do so now.
if ($split) { 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); return $this->prReturn($ret);
} }
@@ -762,8 +785,11 @@ class Transaction extends AppModel {
// Verify that we have a transaction and entries // Verify that we have a transaction and entries
if (empty($transaction) || 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)); return $this->prReturn(array('error' => true));
}
// set ledger ID as the current ledger of the specified account // set ledger ID as the current ledger of the specified account
if (empty($transaction['ledger_id'])) if (empty($transaction['ledger_id']))
@@ -972,8 +998,11 @@ class Transaction extends AppModel {
)); ));
$this->pr(20, compact('nsf_ledger_entry')); $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); return $this->prReturn(array('error' => true) + $ret);
}
// Build a transaction to adjust all of the statement entries // Build a transaction to adjust all of the statement entries
$rollback = $rollback =

View File

@@ -87,6 +87,23 @@ class Unit extends AppModel {
return $this->prReturn(true); 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) { function occupied($enum) {
return $this->statusCheck($enum, 'OCCUPIED', false, null, false); return $this->statusCheck($enum, 'OCCUPIED', false, null, false);
} }
@@ -115,6 +132,7 @@ class Unit extends AppModel {
} }
function available($enum) { return $this->vacant($enum); } function available($enum) { return $this->vacant($enum); }
function conditionAvailable() { return $this->conditionVacant($enum); }
/************************************************************************** /**************************************************************************

View File

@@ -1,25 +1,64 @@
<?php <?php
class UnitSize extends AppModel { class UnitSize extends AppModel {
var $name = 'UnitSize'; var $belongsTo =
var $validate = array( array(
'id' => array('numeric'), 'UnitType',
'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 $hasMany =
'UnitType', array(
); 'Unit',
);
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 <?php
class UnitType extends AppModel { class UnitType extends AppModel {
var $name = 'UnitType'; var $hasMany =
var $validate = array( array(
'id' => array('numeric'), 'UnitSize',
'code' => array('notempty'), );
'name' => array('notempty')
);
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
site/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;
}
}

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"><!-- <script type="text/javascript"><!--
$(document).ready(function(){ $(document).ready(function(){
$("#TxFromDate") datepicker('TxFromDate');
.attr('autocomplete', 'off') datepicker('TxThroughDate');
.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' });
resetForm(); resetForm();
}); });
--></script> --></script>

View File

@@ -16,7 +16,6 @@ if (isset($account['Account']))
$account = $account['Account']; $account = $account['Account'];
$rows = array(); $rows = array();
$rows[] = array('ID', $account['id']);
$rows[] = array('Name', $account['name']); $rows[] = array('Name', $account['name']);
$rows[] = array('Type', $account['type']); $rows[] = array('Type', $account['type']);
$rows[] = array('External Name', $account['external_name']); $rows[] = array('External Name', $account['external_name']);
@@ -78,12 +77,12 @@ echo $this->element('ledger_entries', array
(// Grid configuration (// Grid configuration
'config' => array 'config' => array
('grid_div_id' => 'ledger-ledger-entry-list', ('grid_div_id' => 'ledger-ledger-entry-list',
'caption' => ("Current Ledger: " . 'caption' => "Current Ledger: #{$current_ledger['sequence']}",
"(". $current_ledger['name'] .")"), 'filter' => array('Ledger.id' => $current_ledger['id']),
'filter' => array('Ledger.id' => $current_ledger['id']),
'exclude' => array('Account', 'Amount', 'Cr/Dr', 'Balance', 'exclude' => array('Account', 'Amount', 'Cr/Dr', 'Balance',
empty($account['receipts']) ? 'Tender' : null), empty($account['receipts']) ? 'Tender' : null),
'include' => array('Debit', 'Credit', 'Sub-Total'), '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', 'exclude' => array('Account', 'Amount', 'Cr/Dr', 'Balance',
empty($account['receipts']) ? 'Tender' : null), empty($account['receipts']) ? 'Tender' : null),
'include' => array('Debit', 'Credit', 'Sub-Total'), '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" . ' CLASS="'.$type.'-method-%{id}-source" ' . "\n" .
' ID="'.$type.'-method-%{id}-source-'.$stype.'"' . "\n" . ' ID="'.$type.'-method-%{id}-source-'.$stype.'"' . "\n" .
' VALUE="'.$stype.'"' . "\n" . ' VALUE="'.$stype.'"' . "\n" .
($stype == 'new' ? ' CHECKED' . "\n" : '') .
' />' . "\n" . ' />' . "\n" .
' <LABEL FOR="'.$type.'-method-%{id}-source-'.$stype.'">'.$sname.'</LABEL>' . "\n" . ' <LABEL FOR="'.$type.'-method-%{id}-source-'.$stype.'">'.$sname.'</LABEL>' . "\n" .
' '; ' ';
@@ -76,21 +77,30 @@ function contactMethodDiv($obj, $type, $legend, $values = null) {
'fields' => array 'fields' => array
( (
'preference' => array 'preference' => array
('opts' => array ('label_attributes' => array('class' => 'required'),
'opts' => array
('options' => $obj->varstore['methodPreferences'], ('options' => $obj->varstore['methodPreferences'],
'selected' => (isset($values) ? $values['ContactsMethod']['preference'] : null), 'selected' => (isset($values) ? $values['ContactsMethod']['preference'] : null),
)), ),
'after' => "Intended purpose for this method of communication.",
),
'type' => array 'type' => array
('opts' => array ('label_attributes' => array('class' => 'required'),
'opts' => array
('options' => $obj->varstore['methodTypes'], ('options' => $obj->varstore['methodTypes'],
'selected' => (isset($values) ? $values['ContactsMethod']['type'] : null), 'selected' => (isset($values) ? $values['ContactsMethod']['type'] : null),
)), ),
'after' => "How / Where this communication reaches the contact.",
),
'comment' => array 'comment' => array
('opts' => array ('label_attributes' => array('class' => 'optional empty'),
'opts' => array
('value' => (isset($values) ? $values['ContactsMethod']['comment'] : null), ('value' => (isset($values) ? $values['ContactsMethod']['comment'] : null),
)), ),
'after' => "Optional: Comments on how this form of communication relates to the contact.",
),
))) . "\n" . ))) . "\n" .
@@ -113,16 +123,23 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
if ($type === 'phone') { if ($type === 'phone') {
if ($stype === 'existing') { if ($stype === 'existing') {
$fields = array $fields = array
('id' => array('name' => 'Phone/Ext', ('id' => array('label_attributes' => array('class' => 'required empty'),
'name' => 'Phone/Ext',
'opts' => array('options' => $obj->varstore['contactPhones'])), 'opts' => array('options' => $obj->varstore['contactPhones'])),
); );
} }
elseif ($stype === 'new') { elseif ($stype === 'new') {
$fields = array $fields = array
('type' => array('opts' => array('options' => $obj->varstore['phoneTypes'])), ('type' => array('label_attributes' => array('class' => 'required'),
'phone' => true, 'opts' => array('options' => $obj->varstore['phoneTypes']),
'ext' => array('name' => "Extension"), 'after' => "Physical type of the phone."),
'comment' => true, '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') { elseif ($stype === 'show') {
@@ -149,12 +166,19 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
} }
elseif ($stype === 'new') { elseif ($stype === 'new') {
$fields = array $fields = array
('address' => true, ('address' => array('label_attributes' => array('class' => 'required empty'),
'city' => true, 'after' => "Required: First line of mailing address."),
'state' => true, 'city' => array('label_attributes' => array('class' => 'required empty'),
'postcode' => array('name' => 'Zip Code'), 'after' => "Required."),
'country' => true, 'state' => array('label_attributes' => array('class' => 'required empty'),
'comment' => true, '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') { elseif ($stype === 'show') {
@@ -177,13 +201,16 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
if ($stype === 'existing') { if ($stype === 'existing') {
$fields = array $fields = array
('id' => array('name' => 'Email', ('id' => array('name' => 'Email',
'label_attributes' => array('class' => 'required'),
'opts' => array('options' => $obj->varstore['contactEmails'])), 'opts' => array('options' => $obj->varstore['contactEmails'])),
); );
} }
elseif ($stype === 'new') { elseif ($stype === 'new') {
$fields = array $fields = array
('email' => true, ('email' => array('label_attributes' => array('class' => 'required empty'),
'comment' => true, 'after' => "Required: E-mail address."),
'comment' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Comments about this email address."),
); );
} }
elseif ($stype === 'show') { elseif ($stype === 'show') {
@@ -204,7 +231,7 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
'<div ' . "\n" . '<div ' . "\n" .
' class="'.$type.'-%{id}-div"' . "\n" . ' class="'.$type.'-%{id}-div"' . "\n" .
' id="'.$type.'-%{id}-'.$stype.'-div"' . "\n" . ' id="'.$type.'-%{id}-'.$stype.'-div"' . "\n" .
(isset($values) ? '' : ' STYLE="display:none;"' . "\n") . ((isset($values) || $stype == 'new') ? '' : ' STYLE="display:none;"' . "\n") .
'>' . "\n" . '>' . "\n" .
$obj->element $obj->element
@@ -319,8 +346,27 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
.slideDown(); .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(){ $(document).ready(function(){
resetForm(); 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> --></script>
@@ -345,17 +391,30 @@ echo($this->element
array('class' => 'item contact detail', array('class' => 'item contact detail',
'caption' => isset($this->data['Contact']) ? 'Edit Contact' : 'New Contact', 'caption' => isset($this->data['Contact']) ? 'Edit Contact' : 'New Contact',
'fields' => array 'fields' => array
('first_name' => true, ('last_name' => array('label_attributes' => array('class' => 'recommended empty'),
'last_name' => true, 'after' => "Recommended."),
'middle_name' => true, 'first_name' => array('label_attributes' => array('class' => 'recommended empty'),
'display_name' => true, 'after' => "Recommended."),
'company_name' => array('name' => 'Company'), 'middle_name' => array('label_attributes' => array('class' => 'optional empty'),
'id_federal' => array('name' => 'SSN'), 'after' => "Optional."),
'id_local' => array('name' => 'ID #'), 'company_name' => array('name' => 'Company',
'id_local_state' => array('name' => 'ID State'), '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', */ /* 'id_local_exp' => array('name' => 'ID Expiration', */
/* 'opts' => array('empty' => true)), */ /* 'opts' => array('empty' => true)), */
'comment' => true, 'comment' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Comments about this contact."),
))) . "\n"); ))) . "\n");
echo $form->submit('Update') . "\n"; echo $form->submit('Update') . "\n";

View File

@@ -17,16 +17,17 @@ if (isset($contact['Contact']))
$contact = $contact['Contact']; $contact = $contact['Contact'];
$rows = array(); $rows = array();
$rows[] = array('First Name', $contact['first_name']); $rows[] = array('Display Name', $contact['display_name']);
$rows[] = array('Middle Name', $contact['middle_name']); $rows[] = array('First Name', $contact['first_name']);
$rows[] = array('Last Name', $contact['last_name']); $rows[] = array('Middle Name', $contact['middle_name']);
$rows[] = array('Company', $contact['company_name']); $rows[] = array('Last Name', $contact['last_name']);
$rows[] = array('SSN', $contact['id_federal']); $rows[] = array('Company', $contact['company_name']);
$rows[] = array('ID', ($contact['id_local'] $rows[] = array('SSN', $contact['id_federal']);
. ($contact['id_local'] $rows[] = array('ID', ($contact['id_local']
? " - ".$contact['id_local_state'] . ($contact['id_local']
: ""))); ? " - ".$contact['id_local_state']
$rows[] = array('Comment', $contact['comment']); : "")));
$rows[] = array('Comment', $contact['comment']);
echo $this->element('table', echo $this->element('table',
array('class' => 'item contact detail', array('class' => 'item contact detail',
@@ -135,6 +136,7 @@ echo $this->element('customers', array
'config' => array 'config' => array
('caption' => 'Related Customers', ('caption' => 'Related Customers',
'filter' => array('Contact.id' => $contact['id']), '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" . ' CLASS="contact-%{id}-source" ' . "\n" .
' ID="contact-%{id}-source-'.$stype.'"' . "\n" . ' ID="contact-%{id}-source-'.$stype.'"' . "\n" .
' VALUE="'.$stype.'"' . "\n" . ' VALUE="'.$stype.'"' . "\n" .
//' CHECKED' . "\n" . ($stype == 'new' ? ' CHECKED' . "\n" : '') .
' />' . "\n" . ' />' . "\n" .
' <LABEL FOR="contact-%{id}-source-'.$stype.'">'.$sname.'</LABEL>' . "\n" . ' <LABEL FOR="contact-%{id}-source-'.$stype.'">'.$sname.'</LABEL>' . "\n" .
' '; ' ';
} }
$div .= "<P>(Phone numbers / Addresses can be added later)";
} }
$div .= "\n"; $div .= "\n";
@@ -75,23 +76,35 @@ function customerContactDiv($obj, $values = null, $primary = false) {
( (
'Customer.primary_contact_entry' => array 'Customer.primary_contact_entry' => array
('name' => 'Primary Contact', ('name' => 'Primary Contact',
'label_attributes' => array('class' => null),
'no_prefix' => true, 'no_prefix' => true,
'opts' => array 'opts' => array
('type' => 'radio', ('type' => 'radio',
'options' => array('%{id}' => false), 'options' => array('%{id}' => false),
'value' => ($primary ? '%{id}' : 'bogus-value-to-suppress-hidden-input'), '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 'type' => array
('opts' => array ('label_attributes' => array('class' => 'required'),
'opts' => array
('options' => $obj->varstore['contactTypes'], ('options' => $obj->varstore['contactTypes'],
'selected' => (isset($values) ? $values['ContactsCustomer']['type'] : null), 'selected' => (isset($values) ? $values['ContactsCustomer']['type'] : null),
)), ),
'after' => "An actual tenant, or just an alternate contact?"
),
'comment' => array 'comment' => array
('opts' => array ('label_attributes' => array('class' => 'optional empty'),
'opts' => array
('value' => (isset($values) ? $values['ContactsCustomer']['comment'] : null), ('value' => (isset($values) ? $values['ContactsCustomer']['comment'] : null),
)), ),
'after' => "Optional: Comments on the relationship between this customer and this contact."
),
))) . "\n" . ))) . "\n" .
@@ -115,22 +128,37 @@ function customerContactTypeDiv($obj, $stype, $values = null) {
if ($stype === 'existing') { if ($stype === 'existing') {
$fields = array $fields = array
('id' => array('name' => 'Contact', ('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') { elseif ($stype === 'new') {
$fields = array $fields = array
('first_name' => true, ('last_name' => array('label_attributes' => array('class' => 'recommended empty'),
'last_name' => true, 'after' => "Recommended."),
'middle_name' => true, 'first_name' => array('label_attributes' => array('class' => 'recommended empty'),
'display_name' => true, 'after' => "Recommended."),
'company_name' => array('name' => 'Company'), 'middle_name' => array('label_attributes' => array('class' => 'optional empty'),
'id_federal' => array('name' => 'SSN'), 'after' => "Optional."),
'id_local' => array('name' => 'ID #'), 'company_name' => array('name' => 'Company',
'id_local_state' => array('name' => 'ID State'), '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', */ /* 'id_local_exp' => array('name' => 'ID Expiration', */
/* 'opts' => array('empty' => true)), */ /* 'opts' => array('empty' => true)), */
'comment' => true, 'comment' => array('label_attributes' => array('class' => 'optional empty'),
'after' => "Optional: Comments about this contact."),
); );
} }
elseif ($stype === 'show') { elseif ($stype === 'show') {
@@ -151,14 +179,14 @@ function customerContactTypeDiv($obj, $stype, $values = null) {
'<div ' . "\n" . '<div ' . "\n" .
' class="contact-%{id}-div"' . "\n" . ' class="contact-%{id}-div"' . "\n" .
' id="contact-%{id}-'.$stype.'-div"' . "\n" . ' id="contact-%{id}-'.$stype.'-div"' . "\n" .
(isset($values) ? '' : ' STYLE="display:none;"' . "\n") . ((isset($values) || $stype == 'new') ? '' : ' STYLE="display:none;"' . "\n") .
'>' . "\n" . '>' . "\n" .
$obj->element $obj->element
($element, ($element,
array('class' => "item contact {$class}", array('class' => "item contact {$class}",
'field_prefix' => 'Contact.%{id}') 'field_prefix' => 'Contact.%{id}')
+ compact('rows', 'fields', 'column_class')) . + compact('rows', 'fields', 'row_class', 'column_class')) .
($stype === 'show' ($stype === 'show'
? '<input type="hidden" name="data[Contact][%{id}][id]" value="'.$values['id'].'"/>' . "\n" ? '<input type="hidden" name="data[Contact][%{id}][id]" value="'.$values['id'].'"/>' . "\n"
@@ -221,8 +249,28 @@ function customerContactTypeDiv($obj, $stype, $values = null) {
.slideDown(); .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(){ $(document).ready(function(){
resetForm(); 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> --></script>
@@ -247,8 +295,12 @@ echo($this->element
array('class' => 'item customer detail', array('class' => 'item customer detail',
'caption' => isset($this->data['Customer']) ? 'Edit Customer' : 'New Customer', 'caption' => isset($this->data['Customer']) ? 'Edit Customer' : 'New Customer',
'fields' => array 'fields' => array
('name' => true, ('name' => array('label_attributes' => array('class' => 'optional empty'),
'comment' => true, '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"); ))) . "\n");
echo $form->submit(isset($this->data['Customer']) ? 'Update' : 'Add New 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 <?php
; // Alignment ; // 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(isset($this->data['Customer']) ? 'Update' : 'Add New Customer') . "\n";
echo $form->submit('Cancel', array('name' => 'cancel')) . "\n"; echo $form->submit('Cancel', array('name' => 'cancel')) . "\n";
echo $form->end() . "\n"; echo $form->end() . "\n";

View File

@@ -28,17 +28,53 @@ Configure::write('debug', '0');
// other available options: // other available options:
//clearForm: true, // clear all form fields after successful submit //clearForm: true, // clear all form fields after successful submit
//resetForm: true, // reset the form 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' // bind form using 'ajaxForm'
$('#receipt-form').ajaxForm(options); if ($('#receipt-form').ajaxForm != null)
$('#receipt-form').ajaxForm(options);
else
$('#repeat, label[for=repeat]').remove();
}); });
// pre-submit callback // pre-submit callback
function verifyRequest(formData, jqForm, options) { 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>'); $('#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; return true;
} }
@@ -112,20 +148,7 @@ function onRowSelect(grid_id, customer_id) {
// Set the customer id that will be returned with the form // Set the customer id that will be returned with the form
$("#customer-id").val(customer_id); $("#customer-id").val(customer_id);
// Get the item names from the grid // Set the customer name, so the user knows who the receipt is for
//$("#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>');
$("#receipt-customer-name").html($(grid_id).getCell(customer_id, 'Customer-name')); $("#receipt-customer-name").html($(grid_id).getCell(customer_id, 'Customer-name'));
// Hide the "no customer" message and show the current customer // 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">' . echo ('<DIV CLASS="receipt grid-selection-text">' .
'<DIV CLASS="customer-selection-valid" style="display:none">' . '<DIV CLASS="customer-selection-valid" style="display:none">' .
'Customer <SPAN id="receipt-customer-id"></SPAN>' . 'Customer: <SPAN id="receipt-customer-name"></SPAN>' .
': <SPAN id="receipt-customer-name"></SPAN>' .
/* '<DIV CLASS="supporting">' . */ /* '<DIV CLASS="supporting">' . */
/* '<TABLE>' . */ /* '<TABLE>' . */
@@ -377,29 +399,15 @@ Configure::write('debug', '0');
<script type="text/javascript"><!-- <script type="text/javascript"><!--
$(document).ready(function(){ $(document).ready(function(){
$("#TransactionStamp") datepicker('TransactionStamp');
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
$("#receipt-customer-id").html("INTERNAL ERROR"); $("#customer-id").val(0);
$("#receipt-customer-name").html("INTERNAL ERROR"); $("#receipt-customer-name").html("INTERNAL ERROR");
$("#receipt-balance").html("INTERNAL ERROR"); $("#receipt-balance").html("INTERNAL ERROR");
$("#receipt-charges-caption").html("Outstanding Charges"); $("#receipt-charges-caption").html("Outstanding Charges");
<?php if (isset($customer['id'])): ?> <?php if (isset($customer['id'])): ?>
$("#customer-id").val(<?php echo $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-customer-name").html("<?php echo $customer['name']; ?>");
$("#receipt-balance").html(fmtCurrency("<?php echo $stats['balance']; ?>")); $("#receipt-balance").html(fmtCurrency("<?php echo $stats['balance']; ?>"));
onGridState(null, 'hidden'); onGridState(null, 'hidden');

View File

@@ -61,7 +61,7 @@ echo $this->element('contacts', array
'config' => array 'config' => array
('caption' => 'Customer Contacts', ('caption' => 'Customer Contacts',
'filter' => array('Customer.id' => $customer['Customer']['id']), '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', ('caption' => 'Lease History',
'filter' => array('Customer.id' => $customer['Customer']['id']), 'filter' => array('Customer.id' => $customer['Customer']['id']),
'exclude' => array('Customer'), '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'], 'filter' => array('Customer.id' => $customer['Customer']['id'],
'type !=' => 'VOID'), 'type !=' => 'VOID'),
'exclude' => array('Customer'), 'exclude' => array('Customer'),
'sort_column' => 'Effective',
'sort_order' => 'DESC',
))); )));
@@ -107,9 +107,8 @@ echo $this->element('ledger_entries', array
'Tender.id !=' => null, 'Tender.id !=' => null,
//'Account.id !=' => '-AR-' //'Account.id !=' => '-AR-'
), ),
'exclude' => array('Account', 'Cr/Dr'), 'include' => array('Transaction'),
'sort_column' => 'Date', 'exclude' => array('Entry', 'Account', 'Cr/Dr'),
'sort_order' => 'DESC',
))); )));

View File

@@ -1,50 +1,17 @@
<?php /* -*- mode:PHP -*- */ <?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 in separate accounts (each make up one of the two
// entries required for "double entry"). This, when we provide // entries required for "double entry").
// 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.
/********************************************************************** /**********************************************************************
********************************************************************** **********************************************************************
********************************************************************** **********************************************************************
********************************************************************** **********************************************************************
* LedgerEntry Detail Main Section * DoubleEntry Detail Main Section
*/ */
$transaction = $entry['Transaction']; $transaction = $entry['Transaction'];
@@ -55,7 +22,6 @@ $entries = array('debit' => $entry['DebitEntry'],
$entry = $entry['DoubleEntry']; $entry = $entry['DoubleEntry'];
$rows = array(); $rows = array();
$rows[] = array('ID', $entry['id']);
$rows[] = array('Transaction', $html->link('#'.$transaction['id'], $rows[] = array('Transaction', $html->link('#'.$transaction['id'],
array('controller' => 'transactions', array('controller' => 'transactions',
'action' => 'view', 'action' => 'view',
@@ -64,41 +30,17 @@ $rows[] = array('Timestamp', FormatHelper::datetime($transaction['stamp']
$rows[] = array('Comment', $entry['comment']); $rows[] = array('Comment', $entry['comment']);
echo $this->element('table', echo $this->element('table',
array('class' => 'item ledger-entry detail', array('class' => 'item double-entry detail',
'caption' => 'Double Ledger Entry Detail', 'caption' => 'Double Ledger Entry',
'rows' => $rows, 'rows' => $rows,
'column_class' => array('field', 'value'))); '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"); echo ('<DIV CLASS="ledger-double-entry">' . "\n");
foreach ($ledgers AS $type => $ledger) { foreach ($ledgers AS $type => $ledger) {
$rows = array(); $rows = array();
@@ -114,21 +56,24 @@ foreach ($ledgers AS $type => $ledger) {
/* array('controller' => 'entries', */ /* array('controller' => 'entries', */
/* 'action' => 'view', */ /* 'action' => 'view', */
/* $entries[$type]['id']))); */ /* $entries[$type]['id']))); */
$rows[] = array('Account', $html->link($ledger['Account']['name'], $rows[] = array('Account', ($ledger['link']
array('controller' => 'accounts', ? $html->link($ledger['Account']['name'],
'action' => 'view', array('controller' => 'accounts',
$ledger['Account']['id']))); 'action' => 'view',
$rows[] = array('Ledger', $html->link('#' . $ledger['Account']['id'] $ledger['Account']['id']))
. '-' . $ledger['sequence'], : $ledger['Account']['name']));
array('controller' => 'ledgers', $rows[] = array('Ledger', ($ledger['link']
'action' => 'view', ? $html->link('#' . $ledger['sequence'],
$ledger['id']))); array('controller' => 'ledgers',
'action' => 'view',
$ledger['id']))
: '#' . $ledger['sequence']));
$rows[] = array('Amount', FormatHelper::currency($entries[$type]['amount'])); $rows[] = array('Amount', FormatHelper::currency($entries[$type]['amount']));
//$rows[] = array('Effect', $ledger['Account']['ftype'] == $type ? 'INCREASE' : 'DECREASE'); //$rows[] = array('Effect', $ledger['Account']['ftype'] == $type ? 'INCREASE' : 'DECREASE');
echo $this->element('table', echo $this->element('table',
array('class' => array('item', $type, 'detail'), array('class' => array('item', $type, 'detail'),
'caption' => ucfirst($type) . ' Ledger Entry', 'caption' => ucfirst($type) . ' Entry',
'rows' => $rows, 'rows' => $rows,
'column_class' => array('field', 'value'))); 'column_class' => array('field', 'value')));
} }

View File

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

View File

@@ -2,19 +2,18 @@
// Define the table columns // Define the table columns
$cols = array(); $cols = array();
$cols['ID'] = array('index' => 'Contact.id', 'formatter' => 'id'); $cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum');
$cols['Last Name'] = array('index' => 'Contact.last_name', 'formatter' => 'name'); $cols['Name'] = array('index' => 'Contact.display_name', 'formatter' => 'longname');
$cols['First Name'] = array('index' => 'Contact.first_name', 'formatter' => 'name'); $cols['Last Name'] = array('index' => 'Contact.last_name', 'formatter' => 'name');
$cols['Company'] = array('index' => 'Contact.company_name', 'formatter' => 'longname'); $cols['First Name'] = array('index' => 'Contact.first_name', 'formatter' => 'name');
$cols['Type'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum'); $cols['Company'] = array('index' => 'Contact.company_name', 'formatter' => 'longname');
$cols['Active'] = array('index' => 'ContactsCustomer.active', 'formatter' => 'enum'); $cols['Comment'] = array('index' => 'Contact.comment', 'formatter' => 'comment');
$cols['Comment'] = array('index' => 'Contact.comment', 'formatter' => 'comment');
// Render the grid // Render the grid
$grid $grid
->columns($cols) ->columns($cols)
->sortField('Last Name') ->sortField('Last Name')
->defaultFields(array('ID', 'Last Name', 'First Name')) ->defaultFields(array('Last Name', 'First Name'))
->searchFields(array('Last Name', 'First Name', 'Company')) ->searchFields(array('Last Name', 'First Name', 'Company'))
->render($this, isset($config) ? $config : null, ->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 // Define the table columns
$cols = array(); $cols = array();
$cols['ID'] = array('index' => 'Customer.id', 'formatter' => 'id');
$cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum'); $cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum');
$cols['Name'] = array('index' => 'Customer.name', 'formatter' => 'longname'); $cols['Name'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Last Name'] = array('index' => 'PrimaryContact.last_name', 'formatter' => 'name'); $cols['Last Name'] = array('index' => 'PrimaryContact.last_name', 'formatter' => 'name');
@@ -11,16 +10,11 @@ $cols['Leases'] = array('index' => 'current_lease_count', 'formatt
$cols['Balance'] = array('index' => 'balance', 'formatter' => 'currency'); $cols['Balance'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Comment'] = array('index' => 'Customer.comment', 'formatter' => 'comment'); $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 // Render the grid
$grid $grid
->columns($cols) ->columns($cols)
->sortField('Name') ->sortField('Name')
->defaultFields(array('ID', 'Name')) ->defaultFields(array('Name'))
->searchFields(array('Name', 'Last Name', 'First Name')) ->searchFields(array('Name', 'Last Name', 'First Name'))
->render($this, isset($config) ? $config : null, ->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,8 +32,8 @@ foreach ($fields AS $field => $config) {
$include_after = true; $include_after = true;
} }
if (empty($column_class))
$column_class = array(); $column_class = array();
if ($include_before) if ($include_before)
$column_class[] = 'before'; $column_class[] = 'before';
$column_class[] = 'field'; $column_class[] = 'field';
@@ -79,7 +79,13 @@ foreach ($fields AS $field => $config) {
$cells[] = null; $cells[] = null;
} }
$name = $config['name']; 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'])) if (isset($config['with_name_before']))
$name = $config['with_name_before'] . $name; $name = $config['with_name_before'] . $name;
elseif (isset($with_name_before)) elseif (isset($with_name_before))

View File

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

View File

@@ -2,18 +2,17 @@
// Define the table columns // Define the table columns
$cols = array(); $cols = array();
$cols['LeaseID'] = array('index' => 'Lease.id', 'hidden' => true);
$cols['Lease'] = array('index' => 'Lease.number', 'formatter' => 'id'); $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['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Rent'] = array('index' => 'Lease.rent', 'formatter' => 'currency', 'hiddenz' => true); $cols['Rent'] = array('index' => 'Lease.rent', 'formatter' => 'currency');
$cols['Deposit'] = array('index' => 'Lease.deposit', 'formatter' => 'currency', 'hiddenz' => true); $cols['Deposit'] = array('index' => 'Lease.deposit', 'formatter' => 'currency');
$cols['Signed'] = array('index' => 'Lease.lease_date', 'formatter' => 'date'); $cols['Signed'] = array('index' => 'Lease.lease_date', 'formatter' => 'date');
$cols['Move-In'] = array('index' => 'Lease.movein_date', 'formatter' => 'date'); $cols['Move-In'] = array('index' => 'Lease.movein_date', 'formatter' => 'date');
$cols['Move-Out'] = array('index' => 'Lease.moveout_date', 'formatter' => 'date'); $cols['Move-Out'] = array('index' => 'Lease.moveout_date', 'formatter' => 'date');
$cols['Closed'] = array('index' => 'Lease.close_date', 'formatter' => 'date'); $cols['Closed'] = array('index' => 'Lease.close_date', 'formatter' => 'date');
$cols['Paid-Thru'] = array('index' => 'Lease.paid_through_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['Balance'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Comment'] = array('index' => 'Lease.comment', 'formatter' => 'comment'); $cols['Comment'] = array('index' => 'Lease.comment', 'formatter' => 'comment');
@@ -29,8 +28,8 @@ if (!empty($this->params['action'])) {
// Render the grid // Render the grid
$grid $grid
->columns($cols) ->columns($cols)
->sortField('LeaseID') ->sortField('Lease')
->defaultFields(array('LeaseID', 'Lease')) ->defaultFields(array('Lease'))
->searchFields(array('Customer', 'Unit')) ->searchFields(array('Customer', 'Unit'))
->render($this, isset($config) ? $config : null, ->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Signed', 'Status', 'Comment'))); 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 // Render the grid
$grid $grid
->limit(50)
->columns($cols) ->columns($cols)
->sortField('Date') ->sortField('Date', 'DESC')
->defaultFields(array('Entry', 'Date', 'Amount')) ->defaultFields(array('Entry', 'Date', 'Amount'))
->searchFields(array('Customer', 'Unit')) ->searchFields(array('Customer', 'Unit'))
->render($this, isset($config) ? $config : null, ->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 // Define the table columns
$cols = array(); $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['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['Open Date'] = array('index' => 'PriorCloseTransaction.stamp', 'formatter' => 'date');
$cols['Close Date'] = array('index' => 'CloseTransaction.stamp', 'formatter' => 'date'); $cols['Close Date'] = array('index' => 'CloseTransaction.stamp', 'formatter' => 'date');
$cols['Comment'] = array('index' => 'Ledger.comment', 'formatter' => 'comment'); $cols['Comment'] = array('index' => 'Ledger.comment', 'formatter' => 'comment');
@@ -16,8 +15,8 @@ $cols['Balance'] = array('index' => 'balance', 'formatter' => 'c
// Render the grid // Render the grid
$grid $grid
->columns($cols) ->columns($cols)
->sortField('ID', 'ASC') ->sortField('Sequence')
->defaultFields(array('ID', 'Name', 'Account')) ->defaultFields(array('Sequence'))
->searchFields(array('Account', 'Comment')) ->searchFields(array('Comment'))
->render($this, isset($config) ? $config : null, ->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 // Define the table columns
$cols = array(); $cols = array();
$cols['ID'] = array('index' => 'Map.id', 'formatter' => 'id');
$cols['Name'] = array('index' => 'Map.name', 'formatter' => 'longname'); $cols['Name'] = array('index' => 'Map.name', 'formatter' => 'longname');
$cols['Site Area'] = array('index' => 'SiteArea.name', 'formatter' => 'longname'); $cols['Site Area'] = array('index' => 'SiteArea.name', 'formatter' => 'longname');
$cols['Width'] = array('index' => 'Map.width', 'formatter' => 'number'); $cols['Width'] = array('index' => 'Map.width', 'formatter' => 'number');
@@ -13,7 +12,7 @@ $cols['Comment'] = array('index' => 'Map.comment', 'formatter' => 'comment
$grid $grid
->columns($cols) ->columns($cols)
->sortField('Name') ->sortField('Name')
->defaultFields(array('ID', 'Name')) ->defaultFields(array('Name'))
->searchFields(array('Name')) ->searchFields(array('Name'))
->render($this, isset($config) ? $config : null, ->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array())); array_diff(array_keys($cols), array()));

View File

@@ -8,17 +8,78 @@
* @package pmgr * @package pmgr
*/ */
foreach ($menu AS $item) { // REVISIT <AP>: 20090823
if (isset($item['header'])) // Add way to slide the entire menu off the page
echo('<DIV CLASS="header">' . $item['name'] . '</DIV>' . "\n");
elseif (isset($item['hr']))
echo('<HR>' . "\n");
elseif (isset($item['url']))
echo('<DIV CLASS="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"); // 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['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['Account'] = array('index' => 'Account.name', 'formatter' => 'name');
$cols['Debit'] = array('index' => 'charge', 'formatter' => 'currency'); $cols['Debit'] = array('index' => 'charge', 'formatter' => 'currency');
$cols['Credit'] = array('index' => 'disbursement', 'formatter' => 'currency'); $cols['Credit'] = array('index' => 'disbursement', 'formatter' => 'currency');
@@ -38,11 +38,11 @@ $grid->customData(compact('statement_entry_id'));
// Render the grid // Render the grid
$grid $grid
->columns($cols) ->columns($cols)
->sortField('Date') ->sortField('Date', 'DESC')
->defaultFields(array('Entry', 'Date', 'Charge', 'Payment')) ->defaultFields(array('Entry', 'Date', 'Charge', 'Payment'))
->searchFields(array('Customer', 'Unit')) ->searchFields(array('Customer', 'Unit'))
->render($this, isset($config) ? $config : null, ->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', 'Amount', 'Applied', 'Balance', 'Sub-Total',
'Comment'))); 'Comment')));

View File

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

View File

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

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 = array();
$cols['Sort'] = array('index' => 'Unit.sort_order', 'hidden' => true); $cols['Sort'] = array('index' => 'Unit.sort_order', 'hidden' => true);
$cols['Walk'] = array('index' => 'Unit.walk_order', 'formatter' => 'number'); $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['Unit'] = array('index' => 'Unit.name', 'formatter' => 'shortname');
$cols['Size'] = array('index' => 'UnitSize.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['Rent'] = array('index' => 'Unit.rent', 'formatter' => 'currency');
$cols['Deposit'] = array('index' => 'Unit.deposit', '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['Balance'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Comment'] = array('index' => 'Unit.comment', 'formatter' => 'comment'); $cols['Comment'] = array('index' => 'Unit.comment', 'formatter' => 'comment');
if (in_array($this->params['action'], array('vacant', 'unavailable')))
$grid->invalidFields('Balance');
// Render the grid // Render the grid
$grid $grid
->columns($cols) ->columns($cols)
->sortField('Sort') ->sortField('Sort')
->defaultFields(array('Sort', 'ID', 'Unit')) ->defaultFields(array('Sort', 'Unit'))
->searchFields(array('Unit', 'Size', 'Status')) ->searchFields(array('Unit', 'Size', 'Status'))
->render($this, isset($config) ? $config : null, ->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Walk', 'Deposit', 'Comment'))); array_diff(array_keys($cols), array('Walk', 'Deposit', 'Comment')));

View File

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

View File

@@ -268,14 +268,21 @@ class FormatHelper extends AppHelper {
// Helper function to convert PHP vars to javascript // 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 // Establish a prefix to use before printing $var
$prefix = $depth; 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 given a name, set it up JS style
if ($name) if ($name)
$prefix .= $name . ": "; $prefix .= $name . ":" . $pretty_sp;
if (!isset($var)) if (!isset($var))
return $prefix . 'null'; return $prefix . 'null';
@@ -328,22 +335,22 @@ class FormatHelper extends AppHelper {
// PHP array indices can be a mix of integer and string based. // PHP array indices can be a mix of integer and string based.
// Just guess here, unless flagged as a special case. // Just guess here, unless flagged as a special case.
if (isset($var[0]) || $special) if (isset($var[0]) || $special)
return ($prefix . "[\n" return ($prefix . "[" . $pretty_nl
. implode(",\n", . implode("," . $pretty_nl,
array_map(array('FormatHelper', 'phpVarToJavascript'), array_map(array('FormatHelper', 'phpVarToJavascript'),
array_values($var), array_values($var),
array(), array(),
array_fill(0, count($var), $depth.' ') array_fill(0, count($var), $depth.' ')
)) ))
. "\n$depth]"); . ($pretty ? "\n$depth" : '') . "]");
return ($prefix . "{\n" return ($prefix . "{" . $pretty_nl
. implode(",\n", . implode("," . $pretty_nl,
array_map(array('FormatHelper', 'phpVarToJavascript'), array_map(array('FormatHelper', 'phpVarToJavascript'),
array_values($var), array_keys($var), array_values($var), array_keys($var),
array_fill(0, count($var), $depth.' ') 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 $included, $invalid;
var $columns; var $columns;
var $controller; var $controller;
static $first_grid = true;
function __construct() { function __construct() {
$this->reset(); $this->reset();
@@ -218,8 +219,12 @@ class GridHelper extends AppHelper {
if (isset($config)) if (isset($config))
$this->jqGrid_options = array_merge($this->jqGrid_options, $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)); //pr(compact('config') + array('jqGrid_options' => $this->jqGrid_options));
echo $view->element('jqGrid', $this->jqGrid_options); echo $view->element('jqGrid', $this->jqGrid_options);
self::$first_grid = false;
// Since we only have one instance of this class // Since we only have one instance of this class
// as a helper, we must assume it could be used // 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"> <!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"> <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> <head>
<?php echo $html->charset(); ?> <?php echo $html->charset(); ?>
<title> <title>
<?php if (devbox()) echo "*DEVBOX* "; ?>
<?php if (sandbox()) echo "*SANDBOX* "; ?>
Property Manager: <?php echo $title_for_layout; ?> Property Manager: <?php echo $title_for_layout; ?>
<?php if (sandbox()) echo " *SANDBOX*"; ?>
<?php if (devbox()) echo " *DEVBOX*"; ?>
</title> </title>
<?php <?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->meta('icon') . "\n";
echo $html->css('cake.generic') . "\n"; echo $html->css('cake.generic') . "\n";
echo $html->css('layout') . "\n"; echo $html->css('layout') . "\n";
echo $html->css('print', null, array('media' => 'print')) . "\n"; echo $html->css('print', null, array('media' => 'print')) . "\n";
echo $html->css('sidemenu') . "\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"; $theme = 'smoothness';
//echo $html->css('themes/base/ui.all') . "\n"; $theme = 'base';
//echo $html->css('themes/smoothness/ui.all') . "\n"; $theme = 'dotluv';
//echo $html->css('themes/dotluv/ui.all') . "\n"; $theme = 'dark-hive';
echo $html->css('themes/start/ui.all') . "\n"; $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.form') . "\n";
echo $javascript->link('jquery.hoverIntent') . "\n";
echo $javascript->link('pmgr') . "\n"; echo $javascript->link('pmgr') . "\n";
echo $scripts_for_layout . "\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> </head>
<body> <body>
@@ -89,5 +142,7 @@
<?php echo $cakeDebug; ?> <?php echo $cakeDebug; ?>
<?php /* pr($this); */ ?> <?php /* pr($this); */ ?>
<?php echo implode("\n", $this->__scripts) . "\n"; ?>
</body> </body>
</html> </html>

View File

@@ -27,7 +27,7 @@ Configure::write('debug', '0');
// prepare the form when the DOM is ready // prepare the form when the DOM is ready
$(document).ready(function() { $(document).ready(function() {
var options = { var options = {
target: '#output-debug', // target element(s) to be updated with server response target: '#output-debug', // target element(s) to be updated with server response
beforeSubmit: verifyRequest, // pre-submit callback beforeSubmit: verifyRequest, // pre-submit callback
success: showResponse, // post-submit callback success: showResponse, // post-submit callback
@@ -35,17 +35,52 @@ Configure::write('debug', '0');
// other available options: // other available options:
//clearForm: true, // clear all form fields after successful submit //clearForm: true, // clear all form fields after successful submit
//resetForm: true, // reset the form 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' // bind form using 'ajaxForm'
if ($('#invoice-form').ajaxForm != null)
$('#invoice-form').ajaxForm(options); $('#invoice-form').ajaxForm(options);
else
$('#repeat, label[for=repeat]').remove();
}); });
// pre-submit callback // pre-submit callback
function verifyRequest(formData, jqForm, options) { 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>'); $('#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; return true;
} }
@@ -99,20 +134,7 @@ function onRowSelect(grid_id, lease_id) {
// Set the item id that will be returned with the form // Set the item id that will be returned with the form
$("#lease-id").val(lease_id); $("#lease-id").val(lease_id);
// Get the item names from the grid $("#invoice-lease").html($(grid_id).getCell(lease_id, 'Lease-number'));
//$("#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-unit").html($(grid_id).getCell(lease_id, 'Unit-name')); $("#invoice-unit").html($(grid_id).getCell(lease_id, 'Unit-name'));
$("#invoice-customer").html($(grid_id).getCell(lease_id, 'Customer-name')); $("#invoice-customer").html($(grid_id).getCell(lease_id, 'Customer-name'));
$("#invoice-rent").html($(grid_id).getCell(lease_id, 'Lease-rent')); $("#invoice-rent").html($(grid_id).getCell(lease_id, 'Lease-rent'));
@@ -183,19 +205,8 @@ function addChargeSource(flash) {
'</FIELDSET>' '</FIELDSET>'
); );
$("#Entry"+id+"EffectiveDate") datepicker("Entry"+id+"EffectiveDate");
.attr('autocomplete', 'off') datepicker("Entry"+id+"ThroughDate");
.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' });
return id; return id;
} }
@@ -222,6 +233,7 @@ if (empty($movein))
array('gridstate' => array('gridstate' =>
'onGridState("#"+$(this).attr("id"), gridstate)'), 'onGridState("#"+$(this).attr("id"), gridstate)'),
), ),
'exclude' => array('Closed'),
'action' => 'active', 'action' => 'active',
'nolinks' => true, 'nolinks' => true,
'limit' => 10, 'limit' => 10,
@@ -259,6 +271,12 @@ echo $form->input("Lease.id",
'type' => 'hidden', 'type' => 'hidden',
'value' => 0)); '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 '<fieldset CLASS="invoice">' . "\n"; */
/* echo ' <legend>Invoice</legend>' . "\n"; */ /* echo ' <legend>Invoice</legend>' . "\n"; */
@@ -313,13 +331,9 @@ Configure::write('debug', '0');
}; };
$(document).ready(function(){ $(document).ready(function(){
$("#TransactionStamp") datepicker('TransactionStamp');
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
$("#lease-id").val(0);
$("#invoice-lease").html("INTERNAL ERROR"); $("#invoice-lease").html("INTERNAL ERROR");
$("#invoice-unit").html("INTERNAL ERROR"); $("#invoice-unit").html("INTERNAL ERROR");
$("#invoice-customer").html("INTERNAL ERROR"); $("#invoice-customer").html("INTERNAL ERROR");
@@ -337,7 +351,7 @@ Configure::write('debug', '0');
var id; var id;
resetForm(true); resetForm(true);
$("#TransactionStamp").datepicker('disable'); $("#TransactionStamp").attr('disabled', true);
$("#TransactionStamp").val("<?php echo date('m/d/Y', $movein['time']); ?>"); $("#TransactionStamp").val("<?php echo date('m/d/Y', $movein['time']); ?>");
$('#TransactionStamp').after $('#TransactionStamp').after
('<input type="hidden"' + ('<input type="hidden"' +
@@ -399,15 +413,7 @@ Configure::write('debug', '0');
<?php if (isset($lease['id'])): ?> <?php if (isset($lease['id'])): ?>
$("#lease-id").val(<?php echo $lease['id']; ?>); $("#lease-id").val(<?php echo $lease['id']; ?>);
//$("#invoice-lease").html("<?php echo '#'.$lease['number']; ?>"); $("#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-unit").html("<?php echo $unit['name']; ?>"); $("#invoice-unit").html("<?php echo $unit['name']; ?>");
$("#invoice-customer").html("<?php echo $customer['name']; ?>"); $("#invoice-customer").html("<?php echo $customer['name']; ?>");
$("#invoice-rent").html("<?php echo FormatHelper::currency($lease['rent']); ?>"); $("#invoice-rent").html("<?php echo FormatHelper::currency($lease['rent']); ?>");

View File

@@ -26,14 +26,53 @@ $move_type = preg_replace("/.*_/", "", $this->action);
// Reset the form // Reset the form
function resetForm() { function resetForm() {
$("#customer-id").val(0); $("#customer-id").val(0);
$("#move-customer").html("INTERNAL ERROR");
$("#unit-id").val(0); $("#unit-id").val(0);
$("#lease-id").val(0);
$("#move-customer").html("INTERNAL ERROR");
$("#move-unit").html("INTERNAL ERROR"); $("#move-unit").html("INTERNAL ERROR");
$("#move-lease").html("INTERNAL ERROR");
datepickerNow('LeaseMoveDate', false); 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) { 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 // Set the item id that will be returned with the form
$("#"+item_type+"-id").val(item_id); $("#"+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')); $("#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 // Hide the "no customer" message and show the current customer
$("."+item_type+"-selection-invalid").hide(); $("."+item_type+"-selection-invalid").hide();
$("."+item_type+"-selection-valid").show(); $("."+item_type+"-selection-valid").show();
@@ -56,12 +111,12 @@ function onRowSelect(grid_id, item_type, item_id) {
function onGridState(grid_id, item_type, state) { function onGridState(grid_id, item_type, state) {
if (state == 'visible') { if (state == 'visible') {
$("."+item_type+"-selection-new").show();
$("."+item_type+"-selection-invalid").hide(); $("."+item_type+"-selection-invalid").hide();
$("."+item_type+"-selection-valid").hide(); $("."+item_type+"-selection-valid").hide();
} }
else { else {
//if ($(grid_id).getGridParam("selrow")) $("."+item_type+"-selection-new").hide();
//alert("id:" + $("#"+item_type+"-id").val());
if ($("#"+item_type+"-id").val() > 0) { if ($("#"+item_type+"-id").val() > 0) {
$("."+item_type+"-selection-invalid").hide(); $("."+item_type+"-selection-invalid").hide();
$("."+item_type+"-selection-valid").show(); $("."+item_type+"-selection-valid").show();
@@ -78,7 +133,42 @@ function onGridState(grid_id, item_type, state) {
<?php <?php
; // align ; // 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 echo $this->element('customers', array
('config' => array ('config' => array
('grid_div_id' => 'customers-list', ('grid_div_id' => 'customers-list',
@@ -96,22 +186,27 @@ if ($move_type !== 'out') {
'nolinks' => true, 'nolinks' => true,
'limit' => 10, 'limit' => 10,
))); )));
}
echo ('<DIV CLASS="move-inout grid-selection-text">' . echo ('<DIV CLASS="move-inout grid-selection-text">' .
'<DIV CLASS="customer-selection-valid" style="display:none">' . '<DIV CLASS="customer-selection-new" style="display:none">' .
'Customer: <SPAN id="move-customer"></SPAN>' . $html->link('Create a new Customer',
'</DIV>' . array('controller' => 'customers',
'action' => 'add',
(empty($unit['id']) ? null : $unit['id'])),
array('id' => 'customer-selection-new-url')) .
'</DIV>' .
'<DIV CLASS="customer-selection-invalid" style="display:none">' . '<DIV CLASS="customer-selection-valid" style="display:none">' .
'Please select customer' . 'Customer: <SPAN id="move-customer"></SPAN>' .
'</DIV>' . '</DIV>' .
'</DIV>' . "\n"); '<DIV CLASS="customer-selection-invalid" style="display:none">' .
'Please select customer' .
'</DIV>' .
'</DIV>' . "\n");
if ($move_type !== 'out') {
echo $this->element('units', array echo $this->element('units', array
('config' => array ('config' => array
('grid_div_id' => 'units-list', ('grid_div_id' => 'units-list',
@@ -132,39 +227,41 @@ if ($move_type !== 'out') {
'nolinks' => true, 'nolinks' => true,
'limit' => 10, 'limit' => 10,
))); )));
echo ('<DIV CLASS="move-inout grid-selection-text">' .
'<DIV CLASS="unit-selection-valid" style="display:none">' .
'Unit: <SPAN id="move-unit"></SPAN>' .
'</DIV>' .
'<DIV CLASS="unit-selection-invalid" style="display:none">' .
'Please select unit' .
'</DIV>' .
'</DIV>' . "\n");
} }
echo ('<DIV CLASS="move-inout grid-selection-text">' .
'<DIV CLASS="unit-selection-valid" style="display:none">' .
'Unit: <SPAN id="move-unit"></SPAN>' .
'</DIV>' .
'<DIV CLASS="unit-selection-invalid" style="display:none">' .
'Please select unit' .
'</DIV>' .
'</DIV>' . "\n");
echo $form->create(null, array('id' => 'move-inout-form', echo $form->create(null, array('id' => 'move-inout-form',
'onsubmit' => 'return verifyRequest();',
'url' => array('controller' => 'leases', 'url' => array('controller' => 'leases',
'action' => $move_action))); 'action' => $move_action)));
echo $form->input("Lease.customer_id",
array('id' => 'customer-id',
'type' => 'hidden',
'value' => 0));
echo $form->input("Lease.unit_id",
array('id' => 'unit-id',
'type' => 'hidden',
'value' => 0));
if ($move_type === 'out') { if ($move_type === 'out') {
echo $form->input('Lease.id', echo $form->input('Lease.id',
array('type' => 'hidden', array('id' => 'lease-id',
'value' => $lease['id'], 'type' => 'hidden',
)); 'value' => 0));
}
else {
echo $form->input("Lease.customer_id",
array('id' => 'customer-id',
'type' => 'hidden',
'value' => 0));
echo $form->input("Lease.unit_id",
array('id' => 'unit-id',
'type' => 'hidden',
'value' => 0));
} }
echo $this->element('form_table', echo $this->element('form_table',
@@ -219,15 +316,23 @@ echo $form->end('Perform Move ' . ucfirst($move_type));
<script type="text/javascript"><!-- <script type="text/javascript"><!--
$(document).ready(function(){ $(document).ready(function(){
$("#LeaseMoveDate") datepicker('LeaseMoveDate');
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
resetForm(); 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'])): ?> <?php if (isset($customer['id'])): ?>
$("#customer-id").val(<?php echo $customer['id']; ?>); $("#customer-id").val(<?php echo $customer['id']; ?>);
$("#move-customer").html("<?php echo $customer['name']; ?>"); $("#move-customer").html("<?php echo $customer['name']; ?>");
@@ -243,6 +348,10 @@ echo $form->end('Perform Move ' . ucfirst($move_type));
<?php else: ?> <?php else: ?>
onGridState(null, 'unit', 'visible'); onGridState(null, 'unit', 'visible');
<?php endif; ?> <?php endif; ?>
<?php } /* end (move_type === 'out') */ ?>
}); });
--></script> --></script>

View File

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

View File

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

View File

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

View File

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

View File

@@ -60,13 +60,7 @@ function resetForm() {
} }
$(document).ready(function(){ $(document).ready(function(){
$("#TransactionStamp") datepicker('TransactionStamp');
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
resetForm(); resetForm();
}); });
--></script> --></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('Through', FormatHelper::date($entry['through_date']));
$rows[] = array('Type', $entry['type']); $rows[] = array('Type', $entry['type']);
$rows[] = array('Amount', FormatHelper::currency($entry['amount'])); $rows[] = array('Amount', FormatHelper::currency($entry['amount']));
$rows[] = array('Account', $html->link($account['name'], $rows[] = array('Account', ($account['link']
array('controller' => 'accounts', ? $html->link($account['name'],
'action' => 'view', array('controller' => 'accounts',
$account['id']))); 'action' => 'view',
$account['id']))
: $account['name']));
$rows[] = array('Customer', (isset($customer['name']) $rows[] = array('Customer', (isset($customer['name'])
? $html->link($customer['name'], ? $html->link($customer['name'],
array('controller' => 'customers', array('controller' => 'customers',
@@ -40,7 +42,7 @@ $rows[] = array('Customer', (isset($customer['name'])
$customer['id'])) $customer['id']))
: null)); : null));
$rows[] = array('Lease', (isset($lease['id']) $rows[] = array('Lease', (isset($lease['id'])
? $html->link('#'.$lease['id'], ? $html->link('#'.$lease['number'],
array('controller' => 'leases', array('controller' => 'leases',
'action' => 'view', 'action' => 'view',
$lease['id'])) $lease['id']))
@@ -115,7 +117,6 @@ echo $this->element('statement_entries', array
'config' => array 'config' => array
('caption' => $applied_caption, ('caption' => $applied_caption,
//'filter' => array('id' => $entry['id']), //'filter' => array('id' => $entry['id']),
'exclude' => array('Transaction'),
))); )));

View File

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

View File

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

View File

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

View File

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

View File

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

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();
$rows[] = array('Name', $unit['name']); $rows[] = array('Name', $unit['name']);
$rows[] = array('Status', $unit['status']); $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('Deposit', FormatHelper::currency($unit['deposit']));
$rows[] = array('Rent', FormatHelper::currency($unit['rent'])); $rows[] = array('Rent', FormatHelper::currency($unit['rent']));
$rows[] = array('Comment', $unit['comment']); $rows[] = array('Comment', $unit['comment']);
@@ -68,6 +71,8 @@ echo $this->element('leases', array
('caption' => 'Lease History', ('caption' => 'Lease History',
'filter' => array('Unit.id' => $unit['id']), 'filter' => array('Unit.id' => $unit['id']),
'exclude' => array('Unit'), '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']), 'filter' => array('Lease.id' => $current_lease['id']),
'include' => array('Through'), 'include' => array('Through'),
'exclude' => array('Customer', 'Lease', 'Unit'), 'exclude' => array('Customer', 'Lease', 'Unit'),
'sort_column' => 'Effective',
'sort_order' => 'DESC',
))); )));
} }

View File

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

View File

@@ -11,10 +11,12 @@
* Overall page layout * Overall page layout
*/ */
body { padding: 0; margin: 0 }
table#layout { width: 100% } table#layout { width: 100% }
td#sidecolumn , td#sidecolumn ,
td#pagecolumn { vertical-align: top; } td#pagecolumn { vertical-align: top; }
td#pagecolumn { padding-left: 4mm; } td#pagecolumn { padding-left: 4mm; }
td#sidecolumn { width: 1% }
/************************************************************ /************************************************************
@@ -46,7 +48,7 @@ span.fmt-age.delinquent { color: #f00; }
table.item th , table.item th ,
table.item td { padding: 0.1em 0.4em 0.1em 0.4em; } 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; /\*IE*\/border-collapse: collapse; empty-cells: show } */
table.item { border-spacing: 0 0; empty-cells: show } table.item { border-spacing: 0 0; empty-cells: show }
table.item { border:1px solid #ccc; table.item { border:1px solid #ccc;
@@ -122,6 +124,11 @@ div.detail.supporting { clear : both;
.edit table.detail { width : 80%; .edit table.detail { width : 80%;
float : none; 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; color: #a00;
} }
span.ui-jqgrid-title { .ui-jqgrid span.ui-jqgrid-title {
color: #ffb; font-size: 160%;
font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif; margin: 0;
font-size: 180%;
margin-bottom: 0.0em;
} }
span.ui-jqgrid-title h2 { .ui-jqgrid span.ui-jqgrid-title h2 {
color: #ffb;
font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif;
font-weight: bold; font-weight: bold;
font-size: 140%; font-size: 140%;
margin-bottom: 0.0em; margin: 0;
} }
@@ -359,45 +362,18 @@ fieldset fieldset div {
/* margin: 0 20px; */ /* 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 { form div.submit {
border: 0; border: 0;
clear: both; clear: both;
margin-top: 10px; margin-top: 10px;
/* margin-left: 140px; */
} }
/************************************************************ /************************************************************
************************************************************ ************************************************************
* General Style Info * General Style Info
*/ */
body {
/* background: #003d4c; */
/* color: #fff; */
font-family:'lucida grande',verdana,helvetica,arial,sans-serif;
font-size:90%;
margin: 0;
}
a { a {
color: #003d4c; color: #003d4c;
text-decoration: underline; text-decoration: underline;
@@ -407,35 +383,4 @@ a:hover {
color: #00f; color: #00f;
text-decoration:none; 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 * Side Menu Layout
*/ */
td#sidecolumn { width: 10em; background: lightblue; text-align: left; } #sidemenu-container { width: 12em; height: 20em; }
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; }
/************************************************************ /************************************************************
@@ -36,5 +11,11 @@ td#sidecolumn hr { margin-top: 0.4em; margin-bottom: 0.3em; }
* Menu Items * 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

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