Compare commits

..

7 Commits

Author SHA1 Message Date
abijah
fbc2de9427 Merge out from the pre_0.1 branch (previous so called 'merge in' was also really a merge out)
git-svn-id: file:///svn-source/pmgr/branches/sandbox_0.1@796 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-27 17:28:12 +00:00
abijah
0e8b541e34 Merge in from the pre_0.1 branch
git-svn-id: file:///svn-source/pmgr/branches/sandbox_0.1@794 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-27 17:23:22 +00:00
abijah
d32b002a98 Changed the theme to make it clear when we're in the sandbox.
git-svn-id: file:///svn-source/pmgr/branches/sandbox_0.1@748 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 18:53:21 +00:00
abijah
3c7f02e76c Merge in from pre_0.1 branch
git-svn-id: file:///svn-source/pmgr/branches/sandbox_0.1@747 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 18:50:59 +00:00
abijah
3e78240974 Modified to use the sandbox database
git-svn-id: file:///svn-source/pmgr/branches/sandbox_0.1@746 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 18:49:20 +00:00
abijah
3b98b74517 Merge in from the pre_0.1 branch
git-svn-id: file:///svn-source/pmgr/branches/sandbox_0.1@744 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 14:43:16 +00:00
abijah
9e550c7833 Branch to contain the most stable 0.1 work, along with changes to ensure a sandbox database is used.
git-svn-id: file:///svn-source/pmgr/branches/sandbox_0.1@742 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 14:25:05 +00:00
107 changed files with 908 additions and 8206 deletions

View File

@@ -1,3 +1,6 @@
@echo off @echo off
mysql --user=pmgr --password=pmgruser < %~dp0\db\property_manager.sql sed "s/property_manager/pmgr_sand/g" %~dp0\db\property_manager.sql > H:\pmgr_sand.sql
echo Done! mysql --user=pmgr --password=pmgruser < H:\pmgr_sand.sql
del H:\pmgr_sand.sql
echo Rebuild Complete!

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 / USERS -- ## GROUPS
-- ## -- ##
@@ -256,103 +256,80 @@ 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_users
DROP TABLE IF EXISTS `pmgr_users`;
CREATE TABLE `pmgr_users` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`code` VARCHAR(12) NOT NULL, -- User style "id"
`login` VARCHAR(30) NOT NULL,
-- Contact information for this user
`contact_id` INT(10) UNSIGNED DEFAULT NULL,
-- Specific comments
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) 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 -- TABLE pmgr_group_options
DROP TABLE IF EXISTS `pmgr_group_options`; DROP TABLE IF EXISTS `pmgr_group_options`;
CREATE TABLE `pmgr_group_options` ( CREATE TABLE `pmgr_group_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`group_id` INT(10) UNSIGNED NOT NULL, `group_id` INT(10) UNSIGNED NOT NULL,
`option_value_id` INT(10) UNSIGNED NOT NULL, `name` VARCHAR(50) NOT NULL,
`value` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL, `comment` VARCHAR(255) DEFAULT NULL,
KEY `group_key` (`group_id`),
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
-- ##
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_users
DROP TABLE IF EXISTS `pmgr_users`;
CREATE TABLE `pmgr_users` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`code` VARCHAR(12) NOT NULL, -- User style "id"
-- 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_id` INT(10) UNSIGNED NOT NULL,
-- Specific comments
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -363,131 +340,12 @@ CREATE TABLE `pmgr_group_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,
`option_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_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, `name` VARCHAR(50) NOT NULL,
`value` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL, `comment` VARCHAR(255) DEFAULT NULL,
UNIQUE KEY `name_key` (`name`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
PRIMARY KEY (`user_id`, `name`)
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- 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;
@@ -522,6 +380,46 @@ 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
@@ -539,38 +437,6 @@ 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;
-- ###################################################################### -- ######################################################################
-- ###################################################################### -- ######################################################################
-- ###################################################################### -- ######################################################################

View File

@@ -157,422 +157,3 @@ 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
;

View File

@@ -45,7 +45,7 @@ Operations to be functional
X - Receive and record Money Orders X - Receive and record Money Orders
X - Receive and record Cash X - Receive and record Cash
X - Receive and record ACH Deposits X - Receive and record ACH Deposits
X - Reverse rent charges (early moveout on prepaid occupancy) ? - Reverse rent charges (early moveout on prepaid occupancy)
X - Handle NSF checks X - Handle NSF checks
X - Assess NSF Fees X - Assess NSF Fees
X - Determine Lease Paid-Through status X - Determine Lease Paid-Through status

View File

@@ -10,9 +10,9 @@ deny from all
# Now allow local access # Now allow local access
# Localhost # Localhost
# allow from 127.0.0 allow from 127.0.0
# Local subnet # Local subnet
# allow from 192.168.7 allow from 192.168.7
# Provide a mechanism for user authentication # Provide a mechanism for user authentication
AuthType Digest AuthType Digest

View File

@@ -35,11 +35,10 @@
* @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 $sidemenu = array('areas' => array('SITE' => false, 'CONTROLLER' => false, 'ACTION' => false));
var $std_area = 10; var $std_area = 10;
var $admin_area = 20; var $admin_area = 20;
var $dev_area = 30; var $dev_area = 30;
@@ -71,8 +70,6 @@ class AppController extends Controller {
$name = Inflector::humanize($this->params['controller']); $name = Inflector::humanize($this->params['controller']);
elseif ($area == 'ACTION') elseif ($area == 'ACTION')
$name = Inflector::humanize(Inflector::singularize($this->params['controller'])); $name = Inflector::humanize(Inflector::singularize($this->params['controller']));
elseif ($area == 'SANDBOX')
$name = 'Sandbox';
if (empty($this->sidemenu['areas'][$area])) if (empty($this->sidemenu['areas'][$area]))
$this->sidemenu['areas'][$area] $this->sidemenu['areas'][$area]
@@ -199,6 +196,7 @@ class AppController extends Controller {
array('controller' => 'transactions', 'action' => 'deposit'), null, array('controller' => 'transactions', 'action' => 'deposit'), null,
'SITE'); 'SITE');
$this->addSideMenuLink('Accounts', $this->addSideMenuLink('Accounts',
array('controller' => 'accounts', 'action' => 'index'), null, array('controller' => 'accounts', 'action' => 'index'), null,
'SITE', $this->admin_area); 'SITE', $this->admin_area);
@@ -220,6 +218,13 @@ class AppController extends Controller {
$this->addSideMenuLink('Stmt Entries', $this->addSideMenuLink('Stmt Entries',
array('controller' => 'statement_entries', 'action' => 'index'), null, array('controller' => 'statement_entries', 'action' => 'index'), null,
'SITE', $this->admin_area); 'SITE', $this->admin_area);
$this->addSideMenuLink('Assess Charges',
array('controller' => 'leases', 'action' => 'assess_all'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('RESET DATA',
array('controller' => 'accounts', 'action' => 'reset_data'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Un-Nuke', $this->addSideMenuLink('Un-Nuke',
'#', array('htmlAttributes' => '#', array('htmlAttributes' =>
@@ -228,56 +233,27 @@ class AppController extends Controller {
$this->addSideMenuLink('New Ledgers', $this->addSideMenuLink('New Ledgers',
array('controller' => 'accounts', 'action' => 'newledger'), null, array('controller' => 'accounts', 'action' => 'newledger'), null,
'SITE', $this->dev_area); 'SITE', $this->dev_area);
//array('name' => 'RESET DATA', array('controller' => 'accounts', 'action' => 'reset_data'));
$this->addSideMenuLink('New Receipt', $this->addSideMenuLink('New Receipt',
array('controller' => 'customers', 'action' => 'receipt'), null, array('controller' => 'customers', 'action' => 'receipt'), null,
'SITE', $this->op_area); 'SITE', $this->op_area);
$this->addSideMenuLink('New Invoice', $this->addSideMenuLink('New Invoice',
array('controller' => 'leases', 'action' => 'invoice'), null, array('controller' => 'leases', 'action' => 'invoice'), null,
'SITE', $this->op_area); 'SITE', $this->op_area);
$this->addSideMenuLink('Move-In', $this->addSideMenuLink('Move-In',
array('controller' => 'customers', 'action' => 'move_in'), null, array('controller' => 'customers', 'action' => 'move_in'), null,
'SITE', $this->op_area); 'SITE', $this->op_area);
$this->addSideMenuLink('Move-Out', $this->addSideMenuLink('Move-Out',
array('controller' => 'leases', 'action' => 'move_out'), null, array('controller' => 'leases', 'action' => 'move_out'), null,
'SITE', $this->op_area); 'SITE', $this->op_area);
$this->addSideMenuLink('New Deposit', $this->addSideMenuLink('New Deposit',
array('controller' => 'tenders', 'action' => 'deposit'), null, array('controller' => 'tenders', 'action' => 'deposit'), null,
'SITE', $this->op_area); '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 // REVISIT <AP>: 20090824
// Depending on preference, we may put this into the gridView // Depending on preference, we may put this into the gridView
@@ -304,32 +280,23 @@ class AppController extends Controller {
*/ */
function beforeFilter() { function beforeFilter() {
$this->params['user'] = $this->Permission->User->currentUser(); $this->params['dev'] =
$this->params['admin'] = $this->Option->enabled('admin'); (!empty($this->params['dev_route']));
$this->params['dev'] = devbox(); $this->params['admin'] =
(!empty($this->params['admin_route']) || !empty($this->params['dev_route']));
if ($this->params['dev'] && !$this->Option->enabled('dev'))
$this->redirect("/");
if (!$this->params['dev']) if (!$this->params['dev'])
Configure::write('debug', '0'); Configure::write('debug', '0');
$this->addDefaultSideMenuLinks(); $this->addDefaultSideMenuLinks();
//$this->sideMenuEnable('SITE', $this->op_area, false); $this->sideMenuEnable('SITE', $this->op_area, false);
foreach ($this->sidemenu['areas'] AS $area_name => $area) { foreach ($this->sidemenu['areas'] AS $area_name => $area) {
if (empty($this->params['dev'])) if (empty($this->params['dev']))
$this->sideMenuEnable($area_name, $this->dev_area, false); $this->sideMenuEnable($area_name, $this->dev_area, false);
if (empty($this->params['admin'])) if (empty($this->params['admin']))
$this->sideMenuEnable($area_name, $this->admin_area, false); $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');
} }
@@ -366,21 +333,21 @@ class AppController extends Controller {
foreach ($subarea['priorities'] AS $pname => &$priority) { foreach ($subarea['priorities'] AS $pname => &$priority) {
if (empty($priority)) if (empty($priority))
unset($subarea['priorities'][$pname]); unset($subarea['priorities'][$pname]);
} }
unset($priority); unset($priority);
if (empty($subarea['priorities'])) if (empty($subarea['priorities']))
unset($area['subareas'][$sname]); unset($area['subareas'][$sname]);
} }
unset($subarea); unset($subarea);
if (empty($area['subareas'])) if (empty($area['subareas']))
unset($this->sidemenu['areas'][$aname]); unset($this->sidemenu['areas'][$aname]);
} }
unset($area); unset($area);
// Activate a default section (unless already specified) // Activate a default section (unless already specified)
foreach (array_reverse(array_diff_key($this->sidemenu['areas'], array('SANDBOX'=>1))) AS $area_name => $area) { foreach (array_reverse($this->sidemenu['areas']) AS $area_name => $area) {
if (empty($area)) if (empty($area))
continue; continue;
@@ -429,6 +396,35 @@ class AppController extends Controller {
} }
/**************************************************************************
**************************************************************************
**************************************************************************
* 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 = preg_replace("%/webroot/index\.php$%",
"/../build.cmd",
$_SERVER['SCRIPT_FILENAME']);
echo "<P>" . date('r') . "\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>\n";
while (($read = fread($handle, 2096))) {
echo str_replace("\n", "<BR>\n", htmlspecialchars($read));
}
pclose($handle);
}
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
************************************************************************** **************************************************************************
@@ -600,8 +596,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);
if ($params['debug']) // DEBUG PURPOSES ONLY!
$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);
@@ -857,8 +853,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);
if ($params['debug']) // DEBUG PURPOSES ONLY!
$params['query'] = $query; $params['query'] = $query;
return $this->gridDataRecordsExecute($params, $model, $query); return $this->gridDataRecordsExecute($params, $model, $query);
} }
@@ -981,7 +977,6 @@ 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;
} }
@@ -1059,7 +1054,6 @@ 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="' .
@@ -1092,7 +1086,7 @@ 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) {
echo "<?xml version='1.0' encoding='utf-8'?>\n"; echo "<?xml version='1.0' encoding='utf-8'?>\n";
@@ -1154,26 +1148,14 @@ 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() {
echo $this->render('/empty'); $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('sand_route', 'dev_route') AS $mod) { foreach(array('admin_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,10 +42,6 @@ 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;
@@ -62,35 +58,16 @@ 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
* function: __construct // loop, but it seems the correct way
*/ // 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'); */
/* } */
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
@@ -104,8 +81,7 @@ 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 = get_class($this); $class = $caller['class'];
$this->pr(50, compact('class', 'level'));
$this->class_log_level[$class] = $level; $this->class_log_level[$class] = $level;
} }
@@ -114,10 +90,9 @@ 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 = get_class($this); $class = $caller['class'];
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;
} }
@@ -305,9 +280,7 @@ class AppModel extends Model {
if (preg_match("/^_/", $name) && !$all) if (preg_match("/^_/", $name) && !$all)
unset($vars[$name]); unset($vars[$name]);
} }
//$vars['class'] = get_class_vars(get_class($this)); pr($vars);
$this->pr(1, $vars);
} }
@@ -507,9 +480,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, $force_stop = false) { function INTERNAL_ERROR($msg, $depth = 0) {
INTERNAL_ERROR($msg, $force_stop, $depth+1); INTERNAL_ERROR($msg, false, $depth+1);
echo $this->requestAction(array('controller' => 'util', echo $this->requestAction(array('controller' => 'accounts',
'action' => 'render_empty'), 'action' => 'render_empty'),
array('return', 'bare' => false) array('return', 'bare' => false)
); );

View File

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

View File

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

View File

@@ -32,36 +32,7 @@
* *
*/ */
function _box($type) {
static $box = array('type' => null, 'test' => array());
if (!isset($box['type']) && !isset($box['test'][$type])) {
$r = Router::requestRoute();
/* if (!preg_match("/gridData/", $_SERVER['REQUEST_URI'])) { */
/* print("<PRE>Route:\n");print_r($r);print("\n</PRE>\n"); */
/* } */
$box['test'][$type] = !empty($r[3]["${type}_route"]);
if ($box['test'][$type])
$box['type'] = $type;
}
return $box['type'] == $type;
}
function sandbox() { return _box('sand'); }
function devbox() { return _box('dev'); }
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";
@@ -69,10 +40,8 @@ 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-top:0.5em; margin-left:0.0em";>' . "\n"; echo '<OL style="margin-left:1.5em";>' . "\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'];
@@ -88,36 +57,14 @@ 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 '<UL style="margin-top:0.5em; margin-left:0.0em";>' . "\n"; echo '<P><PRE style="color:#000; background:#c22;">' . "\n";
foreach($_REQUEST AS $k => $v) { print_r($_REQUEST);
$O->log(sprintf(" %-20s => %s", $k, $v)); echo "\n</PRE>\n";
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

@@ -7,14 +7,12 @@ class DATABASE_CONFIG {
'host' => 'localhost', 'host' => 'localhost',
'login' => 'pmgr', 'login' => 'pmgr',
'password' => 'pmgruser', 'password' => 'pmgruser',
'database' => 'property_manager', 'database' => 'pmgr_sand',
'prefix' => 'pmgr_', 'prefix' => 'pmgr_',
); );
function __construct() { function __construct() {
if (devbox()) if (preg_match("%^/[^/]*sand/%", $_SERVER['REQUEST_URI']))
$this->default['database'] = 'pmgr_dev';
if (sandbox())
$this->default['database'] = 'pmgr_sand'; $this->default['database'] = 'pmgr_sand';
} }
} }

View File

@@ -37,39 +37,19 @@ $default_path = array('controller' => 'maps', 'action' => 'view', '1');
Router::connect('/', $default_path); Router::connect('/', $default_path);
/* /*
* Route for sandbox functionality * Route for admin functionality
*/ */
Router::connect('/sand', Router::connect('/admin',
array('sand_route' => true) + $default_path); array('admin_route' => true) + $default_path);
Router::connect('/sand/:controller/:action/*', Router::connect('/admin/:controller/:action/*',
array('sand_route' => true, 'action' => null)); array('admin_route' => true, 'action' => null));
/* Unfortunately, for some reason we need an extra route to solve
* a bug with form generation. When $this->data is set by the
* controller, and a URL is generated by the FormHelper, this
* route is required to ensure the form action is correct. An
* example of a broken page is for /customers/edit/XX. It appears
* the page location uses the route above, it's only URL generation
* that seems to be broken.
*/
Router::connect('/sand/:controller/:action/:id/*',
array('sand_route' => true,'action' => null, 'id'=>null));
/* /*
* Route for developement functionality * Route for development functionality
*/ */
Router::connect('/dev', Router::connect('/dev',
array('dev_route' => true) + $default_path); array('dev_route' => true) + $default_path);
Router::connect('/dev/:controller/:action/*', Router::connect('/dev/:controller/:action/*',
array('dev_route' => true, 'action' => null)); array('dev_route' => true, 'action' => null));
/* Unfortunately, for some reason we need an extra route to solve
* a bug with form generation. When $this->data is set by the
* controller, and a URL is generated by the FormHelper, this
* route is required to ensure the form action is correct. An
* example of a broken page is for /customers/edit/XX. It appears
* the page location uses the route above, it's only URL generation
* that seems to be broken.
*/
Router::connect('/dev/:controller/:action/:id/*',
array('dev_route' => true,'action' => null, 'id'=>null));
?> ?>

View File

@@ -2,6 +2,8 @@
class AccountsController extends AppController { class AccountsController extends AppController {
var $uses = array('Account', 'LedgerEntry');
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
@@ -98,8 +100,9 @@ class AccountsController extends AppController {
$conditions[] = array('Account.type' => strtoupper($params['action'])); $conditions[] = array('Account.type' => strtoupper($params['action']));
} }
$conditions[] = array('Account.level >=' => // REVISIT <AP>: 20090811
$this->Permission->level('controller.accounts')); // No security issues have been worked out yet
$conditions[] = array('Account.level >=' => 10);
return $conditions; return $conditions;
} }
@@ -180,8 +183,9 @@ 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),
array('Account.level >=' => // REVISIT <AP>: 20090811
$this->Permission->level('controller.accounts')), // No security issues have been worked out yet
array('Account.level >=' => 10),
), ),
) )
); );

View File

@@ -23,9 +23,9 @@ class CustomersController extends AppController {
array('controller' => 'customers', 'action' => 'all'), null, array('controller' => 'customers', 'action' => 'all'), null,
'CONTROLLER'); 'CONTROLLER');
/* $this->addSideMenuLink('New Customer', */ $this->addSideMenuLink('New Customer',
/* array('controller' => 'customers', 'action' => 'add'), null, */ array('controller' => 'customers', 'action' => 'add'), null,
/* 'CONTROLLER', $this->new_area); */ 'ACTION', $this->new_area);
} }

View File

@@ -34,9 +34,6 @@ 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']);
@@ -45,9 +42,6 @@ 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

@@ -394,10 +394,6 @@ 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']);

View File

@@ -117,12 +117,8 @@ 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');
// REVISIT <AP>: 20090827 $links['Ledger'] = array('id');
// Need to take 'level' into account $links['Account'] = array('controller' => 'accounts', 'name');
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);
} }
@@ -148,8 +144,12 @@ 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

@@ -86,8 +86,9 @@ class LedgersController extends AppController {
$conditions[] = array('Ledger.close_transaction_id !=' => null); $conditions[] = array('Ledger.close_transaction_id !=' => null);
} }
$conditions[] = array('Account.level >=' => // REVISIT <AP>: 20090811
$this->Permission->level('controller.accounts')); // No security issues have been worked out yet
$conditions[] = array('Account.level >=' => 10);
return $conditions; return $conditions;
} }
@@ -106,12 +107,8 @@ class LedgersController extends AppController {
} }
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) { function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
// REVISIT <AP>: 20090827 $links['Ledger'] = array('name');
// Need to take 'level' into account $links['Account'] = array('name');
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);
} }
@@ -131,8 +128,9 @@ class LedgersController extends AppController {
'Account', 'Account',
), ),
'conditions' => array(array('Ledger.id' => $id), 'conditions' => array(array('Ledger.id' => $id),
array('Account.level >=' => // REVISIT <AP>: 20090811
$this->Permission->level('controller.accounts')), // No security issues have been worked out yet
array('Account.level >=' => 10),
), ),
) )
); );

View File

@@ -47,17 +47,7 @@ class StatementEntriesController extends AppController {
if (!empty($params['post']['custom']['statement_entry_id'])) { if (!empty($params['post']['custom']['statement_entry_id'])) {
$link['ChargeEntry'] = array(); $link['ChargeEntry'] = array();
// This query actually represents a union... $link['DisbursementEntry'] = array();
// Unpaid Charge/Surplus: ChargeID - NULL; DisbursementID - NULL
// Paid Charge/Refund: ChargeID - NULL; DisbursementID - !NULL
// Disbursement/Reversal: ChargeID - !NULL; DisbursementID - NULL
// <EMPTY SET>: ChargeID - !NULL; DisbursementID - !NULL
//
// The query is really slow unless we add the `id` condition to the join.
// A cleaner query would be nice, but we must work within the Cake framework.
$link['DisbursementEntry'] = array('conditions' =>
'`DisbursementEntry`.`id` = '
. $params['post']['custom']['statement_entry_id']);
} }
return array('link' => $link); return array('link' => $link);
@@ -118,10 +108,11 @@ 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);
@@ -141,10 +132,7 @@ 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');
// REVISIT <AP>: 20090827 $links['Account'] = array('name');
// 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');
@@ -265,12 +253,15 @@ 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', 'level'), 'Account' => array('id', 'name', 'type'),
'Customer' => array('fields' => array('id', 'name')), 'Customer' => array('fields' => array('id', 'name')),
'Lease' => array('fields' => array('id', 'number')), '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)
), ),
)); ));
@@ -279,10 +270,6 @@ 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()))

View File

@@ -62,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);
} }

View File

@@ -48,9 +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->addSideMenuLink('New Deposit', */ $this->addSideMenuLink('New Deposit',
/* array('controller' => 'tenders', 'action' => 'deposit'), null, */ array('controller' => 'tenders', 'action' => 'deposit'), null,
/* 'CONTROLLER', $this->new_area); */ 'ACTION', $this->new_area);
$this->gridView('Deposits'); $this->gridView('Deposits');
} }
@@ -95,6 +95,10 @@ 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;
} }
@@ -112,7 +116,7 @@ class TransactionsController extends AppController {
* - handles the creation of a charge invoice * - handles the creation of a charge invoice
*/ */
function postInvoice($redirect = true) { function postInvoice() {
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;
@@ -127,17 +131,6 @@ 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;
@@ -151,7 +144,7 @@ class TransactionsController extends AppController {
* - handles the creation of a receipt * - handles the creation of a receipt
*/ */
function postReceipt($redirect = true) { function postReceipt() {
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;
@@ -175,11 +168,6 @@ 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;
@@ -292,7 +280,7 @@ class TransactionsController extends AppController {
$this->Session->setFlash(__('Unable to Create Deposit', true)); $this->Session->setFlash(__('Unable to Create Deposit', true));
$this->redirect(array('controller' => 'tenders', 'action'=>'deposit')); $this->redirect(array('controller' => 'tenders', 'action'=>'deposit'));
} }
// Present the deposit slip to the user // Present the deposit slip to the user
$this->redirect(array('controller' => 'transactions', $this->redirect(array('controller' => 'transactions',
'action' => 'deposit_slip', 'action' => 'deposit_slip',
@@ -393,11 +381,9 @@ 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) { function destroy($id = null) {
$this->Transaction->id = $id;
$customer_id = $this->Transaction->field('customer_id');
$this->Transaction->destroy($id); $this->Transaction->destroy($id);
$this->redirect(array('controller' => 'customers', 'action' => 'view', $customer_id)); //$this->redirect(array('action' => 'index'));
} }
@@ -413,23 +399,28 @@ class TransactionsController extends AppController {
('first', ('first',
array('contain' => array('contain' =>
array(// Models array(// Models
'Account(id,name,level)', 'Account(id,name)',
'Ledger(id,sequence)', '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'));
} }
$transaction['Account']['link'] =
$transaction['Account']['level'] >=
$this->Permission->level('controller.accounts');
if ($transaction['Transaction']['type'] === 'DEPOSIT') if ($transaction['Transaction']['type'] === 'DEPOSIT')
$this->addSideMenuLink('View Slip', $this->addSideMenuLink('View Slip',
array('action' => 'deposit_slip', $id), null, array('action' => 'deposit_slip', $id), null,
@@ -441,7 +432,7 @@ class TransactionsController extends AppController {
"This may leave the database in an unstable state." . "This may leave the database in an unstable state." .
" Do NOT do this unless you know what you're doing." . " Do NOT do this unless you know what you're doing." .
" Proceed anyway?"), " Proceed anyway?"),
'ACTION', $this->admin_area); 'ACTION', $this->dev_area);
// OK, prepare to render. // OK, prepare to render.
$title = 'Transaction #' . $transaction['Transaction']['id']; $title = 'Transaction #' . $transaction['Transaction']['id'];
@@ -458,12 +449,15 @@ class TransactionsController extends AppController {
*/ */
function deposit_slip($id) { function deposit_slip($id) {
// Find the deposit transaction // Build a container for the deposit slip data
$this->Transaction->id = $id; $deposit = array('types' => array());
$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
$tenders = $this->Transaction->find $result = $this->Transaction->find
('all', ('all',
array('link' => array('DepositTender' => array('link' => array('DepositTender' =>
array('fields' => array(), array('fields' => array(),
@@ -478,17 +472,16 @@ class TransactionsController extends AppController {
'group' => 'TenderType.id', 'group' => 'TenderType.id',
)); ));
// Verify the deposit exists, and that something was actually deposited if (empty($result)) {
if (empty($deposit) || empty($tenders)) { die();
$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
$deposit['types'] = array(); foreach ($result AS $type) {
foreach ($tenders AS $tender) { $deposit['types'][$type['TenderType']['id']] =
$deposit['types'][$tender['TenderType']['id']] = $type['TenderType'] + $type[0];
$tender['TenderType'] + $tender[0];
} }
$deposit_total = 0; $deposit_total = 0;

View File

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

@@ -192,13 +192,6 @@ class Customer extends AppModel {
} }
$id = $this->id; $id = $this->id;
// Appears that $this->save() "helpfully" choses to add in
// any missing data fields, populated with default values.
// So, after saving is complete, the fields 'lease_count',
// 'past_lease_count', and 'current_lease_count' have all
// been reset to zero. Gee, thanks Cake...
$this->update($id);
// Remove all associated Customer Contacts, as it ensures // Remove all associated Customer Contacts, as it ensures
// any entries deleted by the user actually get deleted // any entries deleted by the user actually get deleted
// in the system. We'll recreate the needed ones anyway. // in the system. We'll recreate the needed ones anyway.
@@ -254,10 +247,10 @@ class Customer extends AppModel {
return; return;
} }
// updateLeaseCount is typically handled directly when needed. // REVISIT <AP>: 20090812
// However, this function is used to _ensure_ customer info is // updateLeaseCount is handled directly when needed.
// current, so we're obligated to call it anyway. // Should we simplify by just doing it anyway?
$this->updateLeaseCount($id); //$this->updateLeaseCount($id);
$current_leases = $current_leases =
$this->find('all', $this->find('all',

View File

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

@@ -1,21 +0,0 @@
<?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));
}
}

View File

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

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

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

@@ -1,37 +0,0 @@
<?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));
}
}

View File

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

@@ -1,35 +0,0 @@
<?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);
}
}

View File

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

@@ -1,36 +0,0 @@
<?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,37 +1,16 @@
<?php <?php
class Site extends AppModel { class Site extends AppModel {
var $hasMany = var $name = 'Site';
array('SiteArea', var $validate = array(
'SiteOption', 'id' => array('numeric'),
'Membership', 'name' => array('notempty')
); );
static $current_site_id; var $hasMany = array(
'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

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

@@ -1,24 +0,0 @@
<?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,14 +350,10 @@ 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'];
$this->pr(21, array_intersect_key($ids, array('deposit_id'=>1)) if (!empty($ids['deposit_id']) && !empty($control['update_tender'])) {
+ 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(19, compact('group', 'tender_ids', 'entry_id')); $this->pr(10, 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),
@@ -534,8 +530,6 @@ 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);
} }
@@ -551,8 +545,6 @@ 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);
} }
} }
@@ -592,11 +584,8 @@ 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
@@ -672,11 +661,6 @@ 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);
} }
@@ -697,11 +681,8 @@ 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) {
@@ -761,10 +742,6 @@ 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);
} }
@@ -785,11 +762,8 @@ 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']))
@@ -998,11 +972,8 @@ 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

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

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

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

View File

@@ -28,61 +28,17 @@ 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'
if ($('#receipt-form').ajaxForm != null) $('#receipt-form').ajaxForm(options);
$('#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("Please select a customer first.");
return false;
}
if (formData[i]['name'] == "data[Transaction][stamp]" &&
formData[i]['value'] == '') {
//$("#debug").append('<P>Bad Stamp');
if (formData[i]['value'] != '')
alert(formData[i]['value'] + " is not valid date stamp. Please correct it.");
else
alert("Please enter a valid date stamp first.");
return false;
}
// Terrible way to accomplish this...
for (var j = 0; j < 20; ++j) {
if (formData[i]['name'] == "data[Entry]["+j+"][amount]") {
var val = formData[i]['value'].replace(/\$/,'');
//$("#debug").append('<P>Bad Amount');
if (!(val > 0)) {
if (formData[i]['value'] == '')
alert("Please enter an amount first.");
else
alert('"'+formData[i]['value']+'"' + " is not valid amount. Please correct it.");
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;
} }
@@ -407,9 +363,13 @@ Configure::write('debug', '0');
<script type="text/javascript"><!-- <script type="text/javascript"><!--
$(document).ready(function(){ $(document).ready(function(){
datepicker('TransactionStamp'); $("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
$("#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");

View File

@@ -56,18 +56,14 @@ foreach ($ledgers AS $type => $ledger) {
/* array('controller' => 'entries', */ /* array('controller' => 'entries', */
/* 'action' => 'view', */ /* 'action' => 'view', */
/* $entries[$type]['id']))); */ /* $entries[$type]['id']))); */
$rows[] = array('Account', ($ledger['link'] $rows[] = array('Account', $html->link($ledger['Account']['name'],
? $html->link($ledger['Account']['name'], array('controller' => 'accounts',
array('controller' => 'accounts', 'action' => 'view',
'action' => 'view', $ledger['Account']['id'])));
$ledger['Account']['id'])) $rows[] = array('Ledger', $html->link('#' . $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');

View File

@@ -4,8 +4,8 @@
$cols = array(); $cols = array();
$cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum'); $cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum');
$cols['Name'] = array('index' => 'Contact.display_name', 'formatter' => 'longname'); $cols['Name'] = array('index' => 'Contact.display_name', 'formatter' => 'longname');
$cols['Last Name'] = array('index' => 'Contact.last_name', 'formatter' => 'name'); $cols['Last Name'] = array('index' => 'Contact.last_name', 'formatter' => 'longname');
$cols['First Name'] = array('index' => 'Contact.first_name', 'formatter' => 'name'); $cols['First Name'] = array('index' => 'Contact.first_name', 'formatter' => 'longname');
$cols['Company'] = array('index' => 'Contact.company_name', 'formatter' => 'longname'); $cols['Company'] = array('index' => 'Contact.company_name', 'formatter' => 'longname');
$cols['Comment'] = array('index' => 'Contact.comment', 'formatter' => 'comment'); $cols['Comment'] = array('index' => 'Contact.comment', 'formatter' => 'comment');

View File

@@ -148,14 +148,8 @@ foreach ($jqGridColumns AS $header => &$col) {
// No special formatting for name // No special formatting for name
unset($col['formatter']); unset($col['formatter']);
} }
elseif (preg_match("/^(long|short)?enum$/", elseif ($col['formatter'] === '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
@@ -172,8 +166,7 @@ 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) * 7; $min_width = strlen($header) * 10;
$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;
} }
@@ -246,7 +239,6 @@ $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,
@@ -266,46 +258,50 @@ $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);
}
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+'%';
}
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) . "\n"; ?> <?php echo FormatHelper::phpVarToJavascript($jqGrid_setup); ?>
).navGrid('#<?php echo $grid_id; ?>-pager', { view:false,edit:false,add:false,del:false,search:true,refresh:true}); ).navGrid('#<?php echo $grid_id; ?>-pager',
{ 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

@@ -3,23 +3,22 @@
// Define the table columns // Define the table columns
$cols = array(); $cols = array();
$cols['Lease'] = array('index' => 'Lease.number', 'formatter' => 'id'); $cols['Lease'] = array('index' => 'Lease.number', 'formatter' => 'id');
$cols['Unit'] = array('index' => 'Unit.name', 'formatter' => 'shortname', 'align' => 'center'); $cols['Unit'] = array('index' => 'Unit.name', 'width' => '50', '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'); $cols['Rent'] = array('index' => 'Lease.rent', 'formatter' => 'currency', 'hiddenz' => true);
$cols['Deposit'] = array('index' => 'Lease.deposit', 'formatter' => 'currency'); $cols['Deposit'] = array('index' => 'Lease.deposit', 'formatter' => 'currency', 'hiddenz' => true);
$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['Charge-Thru'] = array('index' => 'Lease.charge_through_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' => 'longenum'); $cols['Status'] = array('index' => 'status', 'formatter' => 'enum', 'width' => 100);
$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');
if (!empty($this->params['action'])) { if (!empty($this->params['action'])) {
if ($this->params['action'] === 'closed') if ($this->params['action'] === 'closed')
$grid->invalidFields(array('Charge-Thru', 'Paid-Thru', 'Status')); $grid->invalidFields(array('Paid-Thru', 'Status'));
elseif ($this->params['action'] === 'active') elseif ($this->params['action'] === 'active')
$grid->invalidFields(array('Closed')); $grid->invalidFields(array('Closed'));
elseif ($this->params['action'] === 'delinquent') elseif ($this->params['action'] === 'delinquent')
@@ -33,4 +32,4 @@ $grid
->defaultFields(array('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', 'Charge-Thru', 'Status', 'Comment'))); array_diff(array_keys($cols), array('Signed', 'Status', 'Comment')));

View File

@@ -15,8 +15,8 @@ $cols['Balance'] = array('index' => 'balance', 'formatter' => 'c
// Render the grid // Render the grid
$grid $grid
->columns($cols) ->columns($cols)
->sortField('Sequence') ->sortField('Account')
->defaultFields(array('Sequence')) ->defaultFields(array('Account', 'Sequence'))
->searchFields(array('Comment')) ->searchFields(array('Account', 'Comment'))
->render($this, isset($config) ? $config : null, ->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Account', 'Open Date', 'Comment'))); array_diff(array_keys($cols), array('Open Date', 'Comment')));

View File

@@ -70,16 +70,14 @@ echo('</DIV>' . "\n"); // End #sidemenu-container
$javascript->codeBlock( $javascript->codeBlock(
<<<JSCB <<<JSCB
jQuery(document).ready(function(){ jQuery(document).ready(function(){
if (jQuery("#sidemenu").accordion != null) { jQuery("#sidemenu").accordion
jQuery("#sidemenu").accordion ({ fillSpace : true,
({ fillSpace : true, event : "click hoverintent",
event : "click hoverintent", animated : "bounceslide",
animated : "bounceslide"
JSCB JSCB
. (isset($active_section) ? ",\n\t active : $active_section\n" : '') . . (isset($active_section) ? "\tactive : $active_section,\n" : '') .
<<<JSCB <<<JSCB
}); });
}
}); });
JSCB JSCB
, array('inline' => false)); , 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' => 'longenum'); $cols['Type'] = array('index' => 'StatementEntry.type', 'formatter' => 'enum', 'width'=>120);
$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');

View File

@@ -17,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('Comment', 'Sub-Total'))); array_diff(array_keys($cols), array('Sub-Total')));

View File

@@ -9,7 +9,7 @@ $cols['Size'] = array('index' => 'UnitSize.name', 'formatter' => 'shortname'
$cols['Area'] = array('index' => 'sqft', 'formatter' => 'number'); $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' => 'enum'); $cols['Status'] = array('index' => 'Unit.status', 'formatter' => 'name'); // We have enough real estate
$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');

View File

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

View File

@@ -268,21 +268,14 @@ 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, $pretty = false) { function phpVarToJavascript($var, $name = '', $depth='', $special = false) {
// Establish a prefix to use before printing $var // Establish a prefix to use before printing $var
if ($pretty) { $prefix = $depth;
$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 . ":" . $pretty_sp; $prefix .= $name . ": ";
if (!isset($var)) if (!isset($var))
return $prefix . 'null'; return $prefix . 'null';
@@ -335,22 +328,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 . "[" . $pretty_nl return ($prefix . "[\n"
. implode("," . $pretty_nl, . implode(",\n",
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.' ')
)) ))
. ($pretty ? "\n$depth" : '') . "]"); . "\n$depth]");
return ($prefix . "{" . $pretty_nl return ($prefix . "{\n"
. implode("," . $pretty_nl, . implode(",\n",
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.' ')
)) ))
. ($pretty ? "\n$depth" : '') . "}"); . "\n$depth}");
} }
} }

View File

@@ -6,7 +6,6 @@ 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();
@@ -219,12 +218,8 @@ 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

@@ -34,11 +34,7 @@
<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 // Reset the __scripts variable, which has already been dumped to
@@ -52,7 +48,7 @@
// mechanism _additional_ to what Cake has provided :-/ // mechanism _additional_ to what Cake has provided :-/
$this->__scripts = array(); $this->__scripts = array();
if (!empty($_SERVER['HTTPS'])) if (!empty($_SERVER['HTTPS']))
$protocol = 'https://'; $protocol = 'https://';
else else
$protocol = 'http://'; $protocol = 'http://';
@@ -62,42 +58,17 @@
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($protocol . 'ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js') . "\n";
$theme = 'smoothness'; echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js') . "\n";
$theme = 'base'; //echo $html->css('themes/base/ui.all') . "\n";
$theme = 'dotluv'; echo $html->css('themes/smoothness/ui.all') . "\n";
$theme = 'dark-hive'; //echo $html->css('themes/dotluv/ui.all') . "\n";
$theme = 'start'; //echo $html->css('themes/start/ui.all') . "\n";
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.jquery') . "\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>

View File

@@ -10,7 +10,6 @@ $customer = $lease['Customer'];
if (isset($lease['Lease'])) if (isset($lease['Lease']))
$lease = $lease['Lease']; $lease = $lease['Lease'];
//pr(compact('unit', 'customer', 'lease', 'movein'));
/********************************************************************** /**********************************************************************
********************************************************************** **********************************************************************
@@ -26,72 +25,27 @@ Configure::write('debug', '0');
<script type="text/javascript"><!-- <script type="text/javascript"><!--
var lease_charge_through;
// 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
// 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', // bind form using 'ajaxForm'
'action' => 'postInvoice', 0)); ?>"
};
// 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');
if (formData[i]['value'] != '')
alert(formData[i]['value'] + " is not valid date stamp. Please correct it.");
else
alert("Please enter a valid date stamp first.");
return false;
}
// Terrible way to accomplish this...
for (var j = 0; j < 20; ++j) {
if (formData[i]['name'] == "data[Entry]["+j+"][amount]") {
var val = formData[i]['value'].replace(/\$/,'');
//$("#debug").append('<P>Bad Amount');
if (!(val > 0)) {
if (formData[i]['value'] == '')
alert("Please enter an amount for Charge #"+j+", or remove the Charge completely.");
else
alert('"'+formData[i]['value']+'"' + " is not a valid amount for Charge #"+j+". Please correct it.");
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;
} }
@@ -153,7 +107,6 @@ function onRowSelect(grid_id, lease_id) {
$("#invoice-deposit").html($(grid_id).getCell(lease_id, 'Lease-deposit') $("#invoice-deposit").html($(grid_id).getCell(lease_id, 'Lease-deposit')
? $(grid_id).getCell(lease_id, 'Lease-deposit') ? $(grid_id).getCell(lease_id, 'Lease-deposit')
: '-'); : '-');
lease_charge_through = $(grid_id).getCell(lease_id, 'Lease-charge_through_date')
// Hide the "no lease" message and show the current lease // Hide the "no lease" message and show the current lease
$(".lease-selection-invalid").hide(); $(".lease-selection-invalid").hide();
@@ -179,78 +132,6 @@ function onGridState(grid_id, state) {
} }
} }
function setNextRent(id) {
var chg_thru;
$('.ChargeForm').each( function(i) {
if ($('.ChargeFormThroughDate', this).attr('id') == 'Entry'+id+'ThroughDate')
return;
if ($('.ChargeFormAccount option:selected', this).val() == <?php echo $rentAccount ?>
&& $('.ChargeFormThroughDate', this).val()) {
var dt = new Date($('.ChargeFormThroughDate', this).val());
//$('#debug').append('Rent in ' + i + '; date ' + dt + '<BR>');
if (chg_thru == null || dt > chg_thru)
chg_thru = dt;
}
});
if (!chg_thru)
chg_thru = new Date(lease_charge_through);
if (chg_thru < dateEOM(chg_thru)) {
// Add a charge to finish out the month
datepickerSet('Entry'+id+'EffectiveDate', dateTomorrow(chg_thru));
datepickerSet('Entry'+id+'ThroughDate', dateEOM(chg_thru));
} else {
// Add a whole month's charge for next month
datepickerSet('Entry'+id+'EffectiveDate', dateNextBOM(chg_thru));
datepickerSet('Entry'+id+'ThroughDate', dateNextEOM(chg_thru));
}
// Now add in the amount owed based on the calculated
// effective and through dates.
prorate(id);
}
function prorate(id) {
var edt = datepickerGet('Entry'+id+'EffectiveDate');
var tdt = datepickerGet('Entry'+id+'ThroughDate');
var rent = $('#invoice-rent').html().replace(/\$/,'');
// Reset the comment. It might wipe out a user comment,
// but it's probably low risk/concern
$('#Entry'+id+'Comment').val('');
if (edt == null || tdt == null) {
alert('Can only prorate with both effective and through dates');
rent = 0;
}
else if (edt > tdt) {
alert('Effective date is later than the Through date');
rent = 0;
}
else if (tdt.getMonth() == edt.getMonth() + 1 &&
edt.getDate() == tdt.getDate() + 1) {
// appears to be anniversary billing, one full cycle
}
else if (edt.getTime() == dateBOM(edt).getTime() &&
tdt.getTime() == dateEOM(edt).getTime()) {
// appears to be one full month
}
else {
var one_day=1000*60*60*24;
var days = Math.ceil((tdt.getTime()-edt.getTime()+1)/(one_day));
var dim =
((edt.getMonth() == tdt.getMonth())
? dateEOM(edt).getDate() // prorated within the month.
: 30); // prorated across months.
rent *= days / dim;
$('#Entry'+id+'Comment').val('Rent proration: '+days+'/'+dim+' days');
}
$('#Entry'+id+'Amount').val(fmtCurrency(rent));
}
function addChargeSource(flash) { function addChargeSource(flash) {
var id = $("#charge-entry-id").val(); var id = $("#charge-entry-id").val();
addDiv('charge-entry-id', 'charge', 'charges', flash, addDiv('charge-entry-id', 'charge', 'charges', flash,
@@ -262,32 +143,26 @@ function addChargeSource(flash) {
echo FormatHelper::phpVarToJavascript echo FormatHelper::phpVarToJavascript
($this->element('form_table', ($this->element('form_table',
array('id' => 'Entry%{id}Form', array('id' => 'Entry%{id}Form',
'class' => "ChargeForm item invoice ledger-entry entry", 'class' => "item invoice ledger-entry entry",
//'with_name_after' => ':', //'with_name_after' => ':',
'field_prefix' => 'Entry.%{id}', 'field_prefix' => 'Entry.%{id}',
'fields' => array 'fields' => array
("account_id" => array('name' => 'Account', ("account_id" => array('name' => 'Account',
'opts' => 'opts' =>
array('class' => 'ChargeFormAccount', array('options' => $chargeAccounts,
'options' => $chargeAccounts,
'value' => $defaultAccount, 'value' => $defaultAccount,
), ),
'between' => '<A HREF="#" ONCLICK="setNextRent(\'%{id}\'); return false;">Rent</A>',
), ),
"effective_date" => array('opts' => "effective_date" => array('opts' =>
array('class' => 'ChargeFormEffectiveDate', array('type' => 'text'),
'type' => 'text'),
'between' => '<A HREF="#" ONCLICK="datepickerBOM(\'TransactionStamp\',\'Entry%{id}EffectiveDate\'); return false;">BOM</A>', 'between' => '<A HREF="#" ONCLICK="datepickerBOM(\'TransactionStamp\',\'Entry%{id}EffectiveDate\'); return false;">BOM</A>',
), ),
"through_date" => array('opts' => "through_date" => array('opts' =>
array('class' => 'ChargeFormThroughDate', array('type' => 'text'),
'type' => 'text'),
'between' => '<A HREF="#" ONCLICK="datepickerEOM(\'Entry%{id}EffectiveDate\',\'Entry%{id}ThroughDate\'); return false;">EOM</A>', 'between' => '<A HREF="#" ONCLICK="datepickerEOM(\'Entry%{id}EffectiveDate\',\'Entry%{id}ThroughDate\'); return false;">EOM</A>',
), ),
"amount" => array('opts' => array('class' => 'ChargeFormAmount invoice amount'), "amount" => array('opts' => array('class' => 'invoice amount')),
'between' => '<A HREF="#" ONCLICK="prorate(\'%{id}\'); return false;">Prorate</A>', "comment" => array('opts' => array('size' => 50)),
),
"comment" => array('opts' => array('class' => 'ChargeFormComment', 'size' => 50)),
), ),
))) . "+\n"; ))) . "+\n";
?> ?>
@@ -295,8 +170,19 @@ function addChargeSource(flash) {
'</FIELDSET>' '</FIELDSET>'
); );
datepicker("Entry"+id+"EffectiveDate"); $("#Entry"+id+"EffectiveDate")
datepicker("Entry"+id+"ThroughDate"); .attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
$("#Entry"+id+"ThroughDate")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
return id; return id;
} }
@@ -323,8 +209,7 @@ if (empty($movein))
array('gridstate' => array('gridstate' =>
'onGridState("#"+$(this).attr("id"), gridstate)'), 'onGridState("#"+$(this).attr("id"), gridstate)'),
), ),
'include' => array('Charge-Thru'), 'exclude' => array('Closed'),
'exclude' => array('Closed', 'Paid-Thru'),
'action' => 'active', 'action' => 'active',
'nolinks' => true, 'nolinks' => true,
'limit' => 10, 'limit' => 10,
@@ -362,12 +247,6 @@ 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"; */
@@ -421,43 +300,20 @@ Configure::write('debug', '0');
$('tr td:nth-child('+col+'), tr th:nth-child('+col+')', this).remove(); $('tr td:nth-child('+col+'), tr th:nth-child('+col+')', this).remove();
}; };
function addHidden(id, fld, name) {
$('#Entry'+id+fld).after
('<input type="hidden"' +
' name="data[Entry]['+id+']['+name+']"' +
' value="' + $('#Entry'+id+fld).val() + '">');
}
$(document).ready(function(){ $(document).ready(function(){
datepicker('TransactionStamp'); $("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
<?php if (isset($lease['id'])): ?>
$("#lease-id").val(<?php echo $lease['id']; ?>);
$("#invoice-lease").html("<?php echo '#'.$lease['number']; ?>");
$("#invoice-unit").html("<?php echo $unit['name']; ?>");
$("#invoice-customer").html("<?php echo $customer['name']; ?>");
$("#invoice-rent").html("<?php echo FormatHelper::currency($lease['rent']); ?>");
$("#invoice-late").html("<?php echo FormatHelper::currency($defaultLate); ?>");
$("#invoice-deposit").html("<?php echo FormatHelper::currency($lease['deposit']); ?>");
lease_charge_through = <?php
if ($lease['charge_through_date'])
echo 'new Date("'.date('m/d/Y', strtotime($lease['charge_through_date'])).'")';
elseif ($lease['paid_through_date'])
echo 'new Date("'.date('m/d/Y', strtotime($lease['paid_through_date'])).'")';
else
echo 'dateYesterday("'.date('m/d/Y', strtotime($lease['movein_date'])).'")';
?>;
<?php else: ?>
$("#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");
$("#invoice-rent").html("INTERNAL ERROR"); $("#invoice-rent").html("INTERNAL ERROR");
$("#invoice-late").html("INTERNAL ERROR"); $("#invoice-late").html("INTERNAL ERROR");
$("#invoice-deposit").html("INTERNAL ERROR"); $("#invoice-deposit").html("INTERNAL ERROR");
<?php endif; ?>
<?php if (empty($movein)): ?> <?php if (empty($movein)): ?>
@@ -469,12 +325,12 @@ Configure::write('debug', '0');
var id; var id;
resetForm(true); resetForm(true);
$("#TransactionStamp").attr('disabled', true); $("#TransactionStamp").datepicker('disable');
$("#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"' +
' name="data[Transaction][stamp]"' + ' name="data[Transaction][stamp]"' +
' value="' + $("#TransactionStamp").val() + '">'); ' value="<?php echo date('m/d/Y', $movein['time']); ?>">');
$("#TransactionComment").val('Move-In Charges'); $("#TransactionComment").val('Move-In Charges');
<?php if ($movein['deposit'] != 0): ?> <?php if ($movein['deposit'] != 0): ?>
@@ -482,28 +338,61 @@ Configure::write('debug', '0');
$('#Entry'+id+'Form').removeCol(2); $('#Entry'+id+'Form').removeCol(2);
$('#Entry'+id+'Form input, #Entry'+id+'Form select').attr('disabled', true); $('#Entry'+id+'Form input, #Entry'+id+'Form select').attr('disabled', true);
$('#Entry'+id+'EffectiveDate').val("<?php echo date('m/d/Y', $movein['effective_time']); ?>"); $('#Entry'+id+'EffectiveDate').val("<?php echo date('m/d/Y', $movein['effective_time']); ?>");
addHidden(id, 'EffectiveDate', 'effective_date'); $('#Entry'+id+'EffectiveDate').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][effective_date]"' +
' value="<?php echo date('m/d/Y', $movein['effective_time']); ?>">');
$('#Entry'+id+'AccountId').val(<?php echo $securityDepositAccount; ?>); $('#Entry'+id+'AccountId').val(<?php echo $securityDepositAccount; ?>);
addHidden(id, 'AccountId', 'account_id'); $('#Entry'+id+'AccountId').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][account_id]"' +
' value="<?php echo $securityDepositAccount; ?>">');
$('#Entry'+id+'Amount').val("<?php echo FormatHelper::currency($movein['deposit']); ?>"); $('#Entry'+id+'Amount').val("<?php echo FormatHelper::currency($movein['deposit']); ?>");
addHidden(id, 'Amount', 'amount'); $('#Entry'+id+'Amount').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][amount]"' +
' value="<?php echo FormatHelper::currency($movein['deposit']); ?>">');
//$('#Entry'+id+'Comment').val('Move-In Security Deposit');
$('#Entry'+id+'Comment').removeAttr('disabled'); $('#Entry'+id+'Comment').removeAttr('disabled');
<?php endif; ?> <?php endif; ?>
id = addChargeSource(false); id = addChargeSource(false);
$('#Entry'+id+'Form').removeCol(2); $('#Entry'+id+'Form').removeCol(2);
$('#Entry'+id+'Form input, #Entry'+id+'Form select').attr('disabled', true); $('#Entry'+id+'Form input, #Entry'+id+'Form select').attr('disabled', true);
setNextRent(id); $('#Entry'+id+'EffectiveDate').val("<?php echo date('m/d/Y', $movein['effective_time']); ?>");
addHidden(id, 'EffectiveDate', 'effective_date'); $('#Entry'+id+'EffectiveDate').after
addHidden(id, 'ThroughDate', 'through_date'); ('<input type="hidden"' +
addHidden(id, 'AccountId', 'account_id'); ' name="data[Entry]['+id+'][effective_date]"' +
addHidden(id, 'Amount', 'amount'); ' value="<?php echo date('m/d/Y', $movein['effective_time']); ?>">');
$('#Entry'+id+'ThroughDate').val("<?php echo date('m/d/Y', $movein['through_time']); ?>");
$('#Entry'+id+'ThroughDate').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][through_date]"' +
' value="<?php echo date('m/d/Y', $movein['through_time']); ?>">');
$('#Entry'+id+'AccountId').val(<?php echo $rentAccount; ?>);
$('#Entry'+id+'AccountId').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][account_id]"' +
' value="<?php echo $rentAccount; ?>">');
$('#Entry'+id+'Amount').val("<?php echo FormatHelper::currency($movein['prorated_rent']); ?>");
$('#Entry'+id+'Amount').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][amount]"' +
' value="<?php echo FormatHelper::currency($movein['prorated_rent']); ?>">');
$('#Entry'+id+'Comment').val("<?php echo($movein['prorated'] ? 'Move-In Rent (Prorated)' : ''); ?>");
$('#Entry'+id+'Comment').removeAttr('disabled'); $('#Entry'+id+'Comment').removeAttr('disabled');
<?php endif; ?> <?php endif; ?>
<?php if (isset($lease['id'])): ?> <?php if (isset($lease['id'])): ?>
$("#lease-id").val(<?php echo $lease['id']; ?>);
$("#invoice-lease").html("<?php echo '#'.$lease['number']; ?>");
$("#invoice-unit").html("<?php echo $unit['name']; ?>");
$("#invoice-customer").html("<?php echo $customer['name']; ?>");
$("#invoice-rent").html("<?php echo FormatHelper::currency($lease['rent']); ?>");
$("#invoice-late").html("<?php echo FormatHelper::currency($defaultLate); ?>");
$("#invoice-deposit").html("<?php echo FormatHelper::currency($lease['deposit']); ?>");
onGridState(null, 'hidden'); onGridState(null, 'hidden');
<?php else: ?> <?php else: ?>
onGridState(null, 'visible'); onGridState(null, 'visible');

View File

@@ -34,39 +34,6 @@ function resetForm() {
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); cell_name = item_type.charAt(0).toUpperCase() + item_type.substr(1);
if (item_type == 'lease') if (item_type == 'lease')
@@ -242,7 +209,6 @@ else {
} }
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)));
@@ -316,7 +282,13 @@ echo $form->end('Perform Move ' . ucfirst($move_type));
<script type="text/javascript"><!-- <script type="text/javascript"><!--
$(document).ready(function(){ $(document).ready(function(){
datepicker('LeaseMoveDate'); $("#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 ($move_type === 'out') { ?>

View File

@@ -6,19 +6,6 @@
{// 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'] . ',' .
@@ -29,8 +16,20 @@
$html->url(array('controller' => 'units', $html->url(array('controller' => 'units',
'action' => 'view', 'action' => 'view',
$unit['id'])) . $unit['id'])) .
'" alt="' . $title . '" alt="Unit #' .
'" title="' . $title . $unit['name'] .
'" 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,7 +60,13 @@ function resetForm() {
} }
$(document).ready(function(){ $(document).ready(function(){
datepicker('TransactionStamp'); $("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
resetForm(); resetForm();
}); });
--></script> --></script>

View File

@@ -29,12 +29,10 @@ 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', ($account['link'] $rows[] = array('Account', $html->link($account['name'],
? $html->link($account['name'], array('controller' => 'accounts',
array('controller' => 'accounts', 'action' => 'view',
'action' => 'view', $account['id'])));
$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',

View File

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

View File

@@ -33,13 +33,11 @@ for ($i=1; $i<=4; ++$i)
if (!empty($ttype["data{$i}_name"])) if (!empty($ttype["data{$i}_name"]))
$rows[] = array($ttype["data{$i}_name"], $tender["data{$i}"]); $rows[] = array($ttype["data{$i}_name"], $tender["data{$i}"]);
$rows[] = array('Deposit', if (!empty($tender['deposit_transaction_id']))
empty($tender['deposit_transaction_id']) $rows[] = array('Deposit', $html->link('#'.$tender['deposit_transaction_id'],
? "-" array('controller' => 'transactions',
: $html->link('#'.$tender['deposit_transaction_id'], 'action' => 'view',
array('controller' => 'transactions', $tender['deposit_transaction_id'])));
'action' => 'deposit_slip',
$tender['deposit_transaction_id'])));
if (!empty($tender['nsf_transaction_id'])) if (!empty($tender['nsf_transaction_id']))
$rows[] = array('NSF', $html->link('#'.$tender['nsf_transaction_id'], $rows[] = array('NSF', $html->link('#'.$tender['nsf_transaction_id'],

View File

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

View File

@@ -92,7 +92,13 @@ function resetForm() {
} }
$(document).ready(function(){ $(document).ready(function(){
datepicker('TransactionStamp'); $("#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', ($account['link'] $rows[] = array('Account', $html->link($account['name'],
? $html->link($account['name'], array('controller' => 'accounts',
array('controller' => 'accounts', 'action' => 'view',
'action' => 'view', $account['id'])));
$account['id'])) $rows[] = array('Ledger', $html->link('#' . $ledger['sequence'],
: $account['name'])); array('controller' => 'ledgers',
'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

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

View File

@@ -11,7 +11,6 @@
* 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; }
@@ -278,15 +277,19 @@ span.grid-error {
color: #a00; color: #a00;
} }
.ui-jqgrid span.ui-jqgrid-title { span.ui-jqgrid-title {
font-size: 160%; color: #ffb;
margin: 0; font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif;
font-size: 180%;
margin-bottom: 0.0em;
} }
.ui-jqgrid span.ui-jqgrid-title h2 { 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: 0; margin-bottom: 0.0em;
} }
@@ -362,18 +365,45 @@ 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;
@@ -383,4 +413,35 @@ 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

@@ -16,14 +16,6 @@ div#debug-kit-toolbar
{ display: none; } { display: none; }
/************************************************************
* Form inputs
*/
/* The "page N / M" input box... make it look like normal text */
input[type='button'], input[type='submit'], input[type='reset']
{ display: none; }
/************************************************************ /************************************************************
* Grid display * Grid display
*/ */

View File

@@ -18,4 +18,3 @@
#sidemenu.ui-accordion .ui-accordion-header { padding: 0 0.5em 0 1.1em; } #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.ui-accordion .ui-accordion-content { padding: 0 0.5em 0 1.1em; }
#sidemenu a { font-size: 90%; }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -1,406 +0,0 @@
/*
* jQuery UI CSS Framework
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
*/
/* Layout helpers
----------------------------------*/
.ui-helper-hidden { display: none; }
.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
.ui-helper-clearfix { display: inline-block; }
/* required comment for clearfix to work in Opera \*/
* html .ui-helper-clearfix { height:1%; }
.ui-helper-clearfix { display:block; }
/* end clearfix */
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
/* Interaction Cues
----------------------------------*/
.ui-state-disabled { cursor: default !important; }
/* Icons
----------------------------------*/
/* states and images */
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
/* Misc visuals
----------------------------------*/
/* Overlays */
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
/*
* jQuery UI CSS Framework
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,%20Arial,%20sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=444444&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=44&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=14_loop.png&bgImgOpacityContent=25&borderColorContent=555555&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=222222&bgTextureDefault=03_highlight_soft.png&bgImgOpacityDefault=35&borderColorDefault=444444&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=003147&bgTextureHover=03_highlight_soft.png&bgImgOpacityHover=33&borderColorHover=0b93d5&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=0972a5&bgTextureActive=04_highlight_hard.png&bgImgOpacityActive=20&borderColorActive=26b3f7&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=02_glass.png&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=01_flat.png&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
*/
/* Component containers
----------------------------------*/
.ui-widget { font-family: Verdana, Arial, sans-serif; font-size: 1.1em; }
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana, Arial, sans-serif; font-size: 1em; }
.ui-widget-content { border: 1px solid #555555; background: #000000 url(images/ui-bg_loop_25_000000_21x21.png) 50% 50% repeat; color: #ffffff; }
.ui-widget-content a { color: #ffffff; }
.ui-widget-header { border: 1px solid #333333; background: #444444 url(images/ui-bg_highlight-soft_44_444444_1x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
.ui-widget-header a { color: #ffffff; }
/* Interaction states
----------------------------------*/
.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #444444; background: #222222 url(images/ui-bg_highlight-soft_35_222222_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #eeeeee; outline: none; }
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #eeeeee; text-decoration: none; outline: none; }
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #0b93d5; background: #003147 url(images/ui-bg_highlight-soft_33_003147_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; }
.ui-state-hover a, .ui-state-hover a:hover { color: #ffffff; text-decoration: none; outline: none; }
.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #26b3f7; background: #0972a5 url(images/ui-bg_highlight-hard_20_0972a5_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; }
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; outline: none; text-decoration: none; }
/* Interaction Cues
----------------------------------*/
.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #cccccc; background: #eeeeee url(images/ui-bg_highlight-soft_80_eeeeee_1x100.png) 50% top repeat-x; color: #2e7db2; }
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #2e7db2; }
.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #ffb73d; background: #ffc73d url(images/ui-bg_glass_40_ffc73d_1x400.png) 50% 50% repeat-x; color: #111111; }
.ui-state-error a, .ui-widget-content .ui-state-error a { color: #111111; }
.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #111111; }
.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; }
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
/* Icons
----------------------------------*/
/* states and images */
.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_cccccc_256x240.png); }
.ui-widget-content .ui-icon {background-image: url(images/ui-icons_cccccc_256x240.png); }
.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
.ui-state-default .ui-icon { background-image: url(images/ui-icons_cccccc_256x240.png); }
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
.ui-state-active .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_4b8e0b_256x240.png); }
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_a83300_256x240.png); }
/* positioning */
.ui-icon-carat-1-n { background-position: 0 0; }
.ui-icon-carat-1-ne { background-position: -16px 0; }
.ui-icon-carat-1-e { background-position: -32px 0; }
.ui-icon-carat-1-se { background-position: -48px 0; }
.ui-icon-carat-1-s { background-position: -64px 0; }
.ui-icon-carat-1-sw { background-position: -80px 0; }
.ui-icon-carat-1-w { background-position: -96px 0; }
.ui-icon-carat-1-nw { background-position: -112px 0; }
.ui-icon-carat-2-n-s { background-position: -128px 0; }
.ui-icon-carat-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -64px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -64px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-off { background-position: -96px -144px; }
.ui-icon-radio-on { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
/* Misc visuals
----------------------------------*/
/* Corner radius */
.ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; }
.ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; }
.ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; }
.ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; }
.ui-corner-top { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; }
.ui-corner-bottom { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; }
.ui-corner-right { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; }
.ui-corner-left { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; }
.ui-corner-all { -moz-border-radius: 6px; -webkit-border-radius: 6px; }
/* Overlays */
.ui-widget-overlay { background: #5c5c5c url(images/ui-bg_flat_50_5c5c5c_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); }
.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; background: #cccccc url(images/ui-bg_flat_30_cccccc_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 8px; -webkit-border-radius: 8px; }/* Accordion
----------------------------------*/
.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
.ui-accordion .ui-accordion-li-fix { display: inline; }
.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; }
.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; }
.ui-accordion .ui-accordion-content-active { display: block; }/* Datepicker
----------------------------------*/
.ui-datepicker { width: 17em; padding: .2em .2em 0; }
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
.ui-datepicker .ui-datepicker-prev { left:2px; }
.ui-datepicker .ui-datepicker-next { right:2px; }
.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
.ui-datepicker .ui-datepicker-next-hover { right:1px; }
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; }
.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
.ui-datepicker select.ui-datepicker-month,
.ui-datepicker select.ui-datepicker-year { width: 49%;}
.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; }
.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
.ui-datepicker td { border: 0; padding: 1px; }
.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
/* with multiple calendars */
.ui-datepicker.ui-datepicker-multi { width:auto; }
.ui-datepicker-multi .ui-datepicker-group { float:left; }
.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
.ui-datepicker-row-break { clear:both; width:100%; }
/* RTL support */
.ui-datepicker-rtl { direction: rtl; }
.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
.ui-datepicker-rtl .ui-datepicker-group { float:right; }
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
.ui-datepicker-cover {
display: none; /*sorry for IE5*/
display/**/: block; /*sorry for IE5*/
position: absolute; /*must have*/
z-index: -1; /*must have*/
filter: mask(); /*must have*/
top: -4px; /*must have*/
left: -4px; /*must have*/
width: 200px; /*must have*/
height: 200px; /*must have*/
}/* Dialog
----------------------------------*/
.ui-dialog { position: relative; padding: .2em; width: 300px; }
.ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative; }
.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; }
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
.ui-draggable .ui-dialog-titlebar { cursor: move; }
/* Progressbar
----------------------------------*/
.ui-progressbar { height:2em; text-align: left; }
.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable
----------------------------------*/
.ui-resizable { position: relative;}
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; }
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; }
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; }
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; }
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider
----------------------------------*/
.ui-slider { position: relative; text-align: left; }
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; }
.ui-slider-horizontal { height: .8em; }
.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
.ui-slider-horizontal .ui-slider-range-min { left: 0; }
.ui-slider-horizontal .ui-slider-range-max { right: 0; }
.ui-slider-vertical { width: .8em; height: 100px; }
.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs
----------------------------------*/
.ui-tabs { padding: .2em; zoom: 1; }
.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; }
.ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; }
.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; }
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; }
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; }
.ui-tabs .ui-tabs-hide { display: none !important; }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

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