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
This commit is contained in:
abijah
2009-08-27 17:23:22 +00:00
49 changed files with 1605 additions and 694 deletions

View File

@@ -239,8 +239,6 @@ SET character_set_client = @saved_cs_client;
LOCK TABLES `pmgr_contact_addresses` WRITE;
/*!40000 ALTER TABLE `pmgr_contact_addresses` DISABLE KEYS */;
INSERT INTO `pmgr_contact_addresses` VALUES (1,'1324 N Liberty Lake Rd\nPMB 263','Liberty Lake','WA','99019','USA',NULL);
INSERT INTO `pmgr_contact_addresses` VALUES (2,'5221 W Myrtlewood Ct','Spokane','WA','99208','USA',NULL);
INSERT INTO `pmgr_contact_addresses` VALUES (3,'PO Box 275','Valley','WA','99181','USA',NULL);
INSERT INTO `pmgr_contact_addresses` VALUES (4,'4045 Hesseltine Rd','Springdale','WA','99173','USA',NULL);
INSERT INTO `pmgr_contact_addresses` VALUES (5,'PO Box 275','Valley','WA','99181','USA',NULL);
@@ -309,9 +307,6 @@ SET character_set_client = @saved_cs_client;
LOCK TABLES `pmgr_contact_emails` WRITE;
/*!40000 ALTER TABLE `pmgr_contact_emails` DISABLE KEYS */;
INSERT INTO `pmgr_contact_emails` VALUES (1,'abijah@PerkinsHouse.com',NULL);
INSERT INTO `pmgr_contact_emails` VALUES (2,'abijah@PerkinsREI.com',NULL);
INSERT INTO `pmgr_contact_emails` VALUES (3,'abijah@ValleyStorage.info',NULL);
/*!40000 ALTER TABLE `pmgr_contact_emails` ENABLE KEYS */;
UNLOCK TABLES;
@@ -339,11 +334,6 @@ SET character_set_client = @saved_cs_client;
LOCK TABLES `pmgr_contact_phones` WRITE;
/*!40000 ALTER TABLE `pmgr_contact_phones` DISABLE KEYS */;
INSERT INTO `pmgr_contact_phones` VALUES (1,'MOBILE','5098445573',NULL,NULL);
INSERT INTO `pmgr_contact_phones` VALUES (2,'MOBILE','5098445973',NULL,NULL);
INSERT INTO `pmgr_contact_phones` VALUES (3,'VIRTUAL','5095901112',NULL,NULL);
INSERT INTO `pmgr_contact_phones` VALUES (4,'VIRTUAL','8774488664',NULL,NULL);
INSERT INTO `pmgr_contact_phones` VALUES (5,'FAX','8662960131',NULL,NULL);
INSERT INTO `pmgr_contact_phones` VALUES (6,'LANDLINE','5099374611',NULL,NULL);
INSERT INTO `pmgr_contact_phones` VALUES (7,'LANDLINE','5092182061',NULL,NULL);
INSERT INTO `pmgr_contact_phones` VALUES (8,'LANDLINE','5099374611',NULL,NULL);
@@ -421,7 +411,7 @@ CREATE TABLE `pmgr_contacts` (
`middle_name` varchar(255) DEFAULT NULL,
`last_name` varchar(255) DEFAULT NULL,
`company_name` varchar(255) DEFAULT NULL,
`display_name` varchar(512) DEFAULT NULL,
`display_name` varchar(512) NOT NULL,
`id_federal` varchar(16) DEFAULT NULL,
`id_local` varchar(16) DEFAULT NULL,
`id_local_state` char(2) DEFAULT NULL,
@@ -437,7 +427,6 @@ SET character_set_client = @saved_cs_client;
LOCK TABLES `pmgr_contacts` WRITE;
/*!40000 ALTER TABLE `pmgr_contacts` DISABLE KEYS */;
INSERT INTO `pmgr_contacts` VALUES (1,'Abijah',NULL,'Perkins',NULL,'Perkins, Abijah',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (2,'Vern',NULL,'Emert',NULL,'Emert, Vern',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (3,'Georgann',NULL,'Dahlen',NULL,'Dahlen, Georgann',NULL,'DAHLEGS501DS','WA',NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (4,'Vicky',NULL,'Emert',NULL,'Emert, Vicky',NULL,NULL,NULL,NULL,NULL);
@@ -452,7 +441,7 @@ INSERT INTO `pmgr_contacts` VALUES (12,'Joe',NULL,'Barrett',NULL,'Barrett, Joe',
INSERT INTO `pmgr_contacts` VALUES (13,'Tabbi',NULL,'Barrett',NULL,'Barrett, Tabbi',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (14,'Scott',NULL,'Riese',NULL,'Riese, Scott',NULL,'RIESESL339MD','WA',NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (15,'James',NULL,'McBride',NULL,'McBride, James',NULL,'MCBRIJC432C1','WA',NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (16,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (16,NULL,NULL,NULL,NULL,'McBride Contact - Unknown',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (17,'Glen',NULL,'Wittner',NULL,'Wittner, Glen',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (18,'Marlana',NULL,'Francis',NULL,'Francis, Marlana',NULL,'FRANCMM371JS','WA',NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (19,'Don',NULL,'Francis',NULL,'Francis, Don',NULL,NULL,NULL,NULL,NULL);
@@ -490,9 +479,9 @@ INSERT INTO `pmgr_contacts` VALUES (50,'Vivian',NULL,'McMahon',NULL,'McMahon, Vi
INSERT INTO `pmgr_contacts` VALUES (51,'Murray',NULL,'McMahon',NULL,'McMahon, Murray',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (52,'Ron',NULL,'Linhoff',NULL,'Linhoff, Ron',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (53,'Ed',NULL,'Hatcher',NULL,'Hatcher, Ed',NULL,'HATCHEW441D9','WA',NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (54,NULL,NULL,NULL,'Valley Bible Church',NULL,NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (54,NULL,NULL,NULL,'Valley Bible Church','Valley Bible Church',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (55,'Pamela',NULL,'Hovland',NULL,'Hovland, Pamela',NULL,'HIGGIPD461L7','WA',NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (56,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (56,NULL,NULL,NULL,NULL,'Hoveland Contact - Unknown ',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (57,'R.R.',NULL,'Hooke',NULL,'Hooke, R.R.',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (58,'Bill',NULL,'Clark',NULL,'Clark, Bill',NULL,NULL,NULL,NULL,NULL);
INSERT INTO `pmgr_contacts` VALUES (59,'Shirley',NULL,'Jackson',NULL,'Jackson, Shirley',NULL,NULL,NULL,NULL,NULL);
@@ -633,7 +622,7 @@ CREATE TABLE `pmgr_contacts_methods` (
`method` enum('ADDRESS','PHONE','EMAIL') NOT NULL,
`method_id` int(10) unsigned NOT NULL,
`type` enum('MAIN','HOME','BUSINESS','OTHER') NOT NULL DEFAULT 'MAIN',
`preference` enum('PRIMARY','WORK','ALTERNATE','EMERGENCY') NOT NULL DEFAULT 'PRIMARY',
`preference` enum('PRIMARY','ALTERNATE','EMERGENCY') NOT NULL DEFAULT 'PRIMARY',
`comment` varchar(255) DEFAULT NULL,
PRIMARY KEY (`contact_id`,`method`,`method_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -645,16 +634,6 @@ SET character_set_client = @saved_cs_client;
LOCK TABLES `pmgr_contacts_methods` WRITE;
/*!40000 ALTER TABLE `pmgr_contacts_methods` DISABLE KEYS */;
INSERT INTO `pmgr_contacts_methods` VALUES (1,'ADDRESS',1,'MAIN','PRIMARY',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (1,'ADDRESS',2,'HOME','ALTERNATE',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (1,'PHONE',1,'MAIN','PRIMARY',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (1,'PHONE',2,'MAIN','ALTERNATE',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (1,'PHONE',3,'BUSINESS','WORK',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (1,'PHONE',4,'BUSINESS','WORK',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (1,'PHONE',5,'BUSINESS','WORK',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (1,'EMAIL',1,'HOME','PRIMARY',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (1,'EMAIL',2,'HOME','WORK',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (1,'EMAIL',3,'BUSINESS','WORK',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (2,'ADDRESS',3,'HOME','PRIMARY',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (2,'PHONE',6,'MAIN','PRIMARY',NULL);
INSERT INTO `pmgr_contacts_methods` VALUES (3,'ADDRESS',4,'HOME','PRIMARY',NULL);
@@ -5685,6 +5664,11 @@ SET character_set_client = utf8;
CREATE TABLE `pmgr_unit_types` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(12) NOT NULL,
`residential` tinyint(1) unsigned NOT NULL DEFAULT '0',
`enclosed` tinyint(1) unsigned NOT NULL DEFAULT '0',
`climate` tinyint(1) unsigned NOT NULL DEFAULT '0',
`outdoor` tinyint(1) unsigned NOT NULL DEFAULT '0',
`covered` tinyint(1) unsigned NOT NULL DEFAULT '0',
`name` varchar(80) NOT NULL,
`comment` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
@@ -5697,9 +5681,9 @@ SET character_set_client = @saved_cs_client;
LOCK TABLES `pmgr_unit_types` WRITE;
/*!40000 ALTER TABLE `pmgr_unit_types` DISABLE KEYS */;
INSERT INTO `pmgr_unit_types` VALUES (1,'xxx','Self Storage',NULL);
INSERT INTO `pmgr_unit_types` VALUES (2,'xxx','Yard Parking',NULL);
INSERT INTO `pmgr_unit_types` VALUES (3,'xxx','Apartment',NULL);
INSERT INTO `pmgr_unit_types` VALUES (1,'xxx',0,1,0,0,0,'Self Storage',NULL);
INSERT INTO `pmgr_unit_types` VALUES (2,'xxx',0,0,0,1,0,'Yard Parking',NULL);
INSERT INTO `pmgr_unit_types` VALUES (3,'xxx',1,0,0,0,0,'Apartment',NULL);
/*!40000 ALTER TABLE `pmgr_unit_types` ENABLE KEYS */;
UNLOCK TABLES;
@@ -5716,7 +5700,6 @@ CREATE TABLE `pmgr_units` (
`code` varchar(12) NOT NULL,
`name` varchar(80) NOT NULL,
`status` enum('DELETED','DAMAGED','COMPANY','UNAVAILABLE','RESERVED','DIRTY','VACANT','OCCUPIED','LOCKED','LIENED') NOT NULL DEFAULT 'VACANT',
`current_lease_id` int(10) unsigned DEFAULT NULL,
`sort_order` mediumint(8) unsigned NOT NULL,
`walk_order` mediumint(8) unsigned NOT NULL,
`deposit` float(12,2) DEFAULT NULL,
@@ -5732,84 +5715,84 @@ SET character_set_client = @saved_cs_client;
LOCK TABLES `pmgr_units` WRITE;
/*!40000 ALTER TABLE `pmgr_units` DISABLE KEYS */;
INSERT INTO `pmgr_units` VALUES (1,1,'10','10','OCCUPIED',11,23,10,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (2,1,'11','11','VACANT',13,24,9,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (3,1,'12','12','VACANT',NULL,25,8,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (4,1,'13','13','OCCUPIED',18,26,7,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (5,2,'14','14','OCCUPIED',3,27,6,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (6,2,'15','15','VACANT',47,28,5,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (7,2,'16','16','OCCUPIED',21,29,4,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (8,2,'17','17','VACANT',8,30,3,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (9,2,'18','18','OCCUPIED',27,31,2,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (10,2,'19','19','VACANT',10,32,1,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (11,2,'22','22','UNAVAILABLE',NULL,33,50,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (12,2,'23','23','VACANT',50,34,49,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (13,2,'24','24','OCCUPIED',33,35,48,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (14,2,'25','25','VACANT',NULL,36,47,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (15,2,'26','26','OCCUPIED',22,37,46,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (16,2,'27','27','OCCUPIED',5,38,45,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (17,1,'28','28','VACANT',17,39,31,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (18,1,'29','29','OCCUPIED',2,40,30,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (19,1,'30','30','OCCUPIED',15,41,29,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (20,3,'31','31','OCCUPIED',NULL,42,28,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (21,3,'32','32','VACANT',37,43,27,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (22,3,'33','33','OCCUPIED',49,44,26,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (23,3,'34','34','OCCUPIED',51,45,25,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (24,3,'35','35','VACANT',26,46,24,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (25,3,'36','36','OCCUPIED',38,47,23,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (26,4,'37','37','OCCUPIED',31,48,22,25.00,50.00,NULL);
INSERT INTO `pmgr_units` VALUES (27,4,'38','38','UNAVAILABLE',NULL,49,21,25.00,50.00,NULL);
INSERT INTO `pmgr_units` VALUES (28,5,'39','39','OCCUPIED',14,50,68,25.00,80.00,NULL);
INSERT INTO `pmgr_units` VALUES (29,6,'40','40','LOCKED',NULL,51,67,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (30,6,'41','41','LOCKED',NULL,52,66,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (31,6,'42','42','OCCUPIED',NULL,53,65,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (32,6,'43','43','VACANT',NULL,54,64,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (33,6,'44','44','VACANT',NULL,55,63,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (34,6,'45','45','OCCUPIED',4,56,62,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (35,7,'A01','A01','VACANT',35,1,39,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (36,7,'A02','A02','VACANT',NULL,2,40,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (37,7,'A03','A03','OCCUPIED',9,3,41,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (38,7,'A04','A04','OCCUPIED',7,4,42,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (39,8,'A05','A05','VACANT',NULL,5,43,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (40,8,'A06','A06','VACANT',NULL,6,44,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (41,9,'APT','APT','OCCUPIED',40,68,20,150.00,375.00,NULL);
INSERT INTO `pmgr_units` VALUES (42,7,'B01','B01','OCCUPIED',19,7,32,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (43,7,'B02','B02','VACANT',6,8,33,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (44,7,'B03','B03','VACANT',NULL,9,34,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (45,7,'B04','B04','VACANT',41,10,35,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (46,8,'B05','B05','LOCKED',42,11,36,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (47,8,'B06','B06','OCCUPIED',16,12,37,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (48,8,'B07','B07','VACANT',NULL,13,38,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (49,10,'C01','C01','OCCUPIED',43,14,11,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (50,10,'C02','C02','OCCUPIED',25,15,12,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (51,10,'C03','C03','OCCUPIED',20,16,13,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (52,10,'C04','C04','OCCUPIED',36,17,14,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (53,10,'C05','C05','VACANT',12,18,15,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (54,10,'C06','C06','OCCUPIED',NULL,19,16,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (55,8,'C07','C07','VACANT',NULL,20,17,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (56,8,'C08','C08','VACANT',28,21,18,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (57,8,'C09','C09','OCCUPIED',NULL,22,19,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (58,3,'D01','D01','OCCUPIED',1,57,61,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (59,3,'D02','D02','OCCUPIED',23,58,60,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (60,3,'D03','D03','OCCUPIED',30,59,59,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (61,3,'D04','D04','OCCUPIED',45,60,58,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (62,3,'D05','D05','OCCUPIED',24,61,57,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (63,3,'D06','D06','OCCUPIED',NULL,62,56,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (64,3,'D07','D07','OCCUPIED',39,63,55,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (65,3,'D08','D08','OCCUPIED',NULL,64,54,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (66,3,'D09','D09','OCCUPIED',32,65,53,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (67,11,'D10','D10','VACANT',48,66,52,25.00,60.00,NULL);
INSERT INTO `pmgr_units` VALUES (68,11,'D11','D11','VACANT',NULL,67,51,25.00,60.00,NULL);
INSERT INTO `pmgr_units` VALUES (69,12,'Y01','Y01','OCCUPIED',34,69,69,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (70,12,'Y02','Y02','OCCUPIED',29,70,70,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (71,12,'Y03','Y03','OCCUPIED',52,71,71,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (72,12,'Y04','Y04','VACANT',NULL,72,72,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (73,12,'Y05','Y05','OCCUPIED',NULL,73,73,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (74,12,'Y06','Y06','VACANT',NULL,74,74,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (75,12,'Y07','Y07','UNAVAILABLE',NULL,75,75,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (76,12,'Y08','Y08','UNAVAILABLE',NULL,76,76,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (77,12,'Y09','Y09','UNAVAILABLE',NULL,77,77,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (78,12,'Y10','Y10','UNAVAILABLE',NULL,78,78,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (1,1,'10','10','OCCUPIED',23,10,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (2,1,'11','11','VACANT',24,9,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (3,1,'12','12','VACANT',25,8,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (4,1,'13','13','OCCUPIED',26,7,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (5,2,'14','14','OCCUPIED',27,6,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (6,2,'15','15','VACANT',28,5,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (7,2,'16','16','OCCUPIED',29,4,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (8,2,'17','17','VACANT',30,3,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (9,2,'18','18','OCCUPIED',31,2,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (10,2,'19','19','VACANT',32,1,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (11,2,'22','22','DAMAGED',33,50,25.00,35.00,'Water leaks down the east wall');
INSERT INTO `pmgr_units` VALUES (12,2,'23','23','VACANT',34,49,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (13,2,'24','24','OCCUPIED',35,48,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (14,2,'25','25','VACANT',36,47,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (15,2,'26','26','OCCUPIED',37,46,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (16,2,'27','27','OCCUPIED',38,45,25.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (17,1,'28','28','VACANT',39,31,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (18,1,'29','29','OCCUPIED',40,30,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (19,1,'30','30','OCCUPIED',41,29,25.00,90.00,NULL);
INSERT INTO `pmgr_units` VALUES (20,3,'31','31','OCCUPIED',42,28,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (21,3,'32','32','VACANT',43,27,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (22,3,'33','33','OCCUPIED',44,26,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (23,3,'34','34','OCCUPIED',45,25,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (24,3,'35','35','VACANT',46,24,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (25,3,'36','36','OCCUPIED',47,23,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (26,4,'37','37','OCCUPIED',48,22,25.00,50.00,NULL);
INSERT INTO `pmgr_units` VALUES (27,4,'38','38','COMPANY',49,21,25.00,50.00,'Contains lumber, tools, etc.');
INSERT INTO `pmgr_units` VALUES (28,5,'39','39','OCCUPIED',50,68,25.00,80.00,NULL);
INSERT INTO `pmgr_units` VALUES (29,6,'40','40','LOCKED',51,67,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (30,6,'41','41','LOCKED',52,66,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (31,6,'42','42','OCCUPIED',53,65,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (32,6,'43','43','VACANT',54,64,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (33,6,'44','44','VACANT',55,63,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (34,6,'45','45','OCCUPIED',56,62,25.00,55.00,NULL);
INSERT INTO `pmgr_units` VALUES (35,7,'A01','A01','VACANT',1,39,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (36,7,'A02','A02','VACANT',2,40,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (37,7,'A03','A03','OCCUPIED',3,41,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (38,7,'A04','A04','OCCUPIED',4,42,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (39,8,'A05','A05','VACANT',5,43,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (40,8,'A06','A06','VACANT',6,44,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (41,9,'APT','APT','OCCUPIED',68,20,150.00,375.00,NULL);
INSERT INTO `pmgr_units` VALUES (42,7,'B01','B01','OCCUPIED',7,32,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (43,7,'B02','B02','VACANT',8,33,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (44,7,'B03','B03','VACANT',9,34,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (45,7,'B04','B04','VACANT',10,35,25.00,49.00,NULL);
INSERT INTO `pmgr_units` VALUES (46,8,'B05','B05','LOCKED',11,36,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (47,8,'B06','B06','OCCUPIED',12,37,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (48,8,'B07','B07','VACANT',13,38,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (49,10,'C01','C01','OCCUPIED',14,11,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (50,10,'C02','C02','OCCUPIED',15,12,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (51,10,'C03','C03','OCCUPIED',16,13,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (52,10,'C04','C04','OCCUPIED',17,14,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (53,10,'C05','C05','VACANT',18,15,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (54,10,'C06','C06','OCCUPIED',19,16,25.00,40.00,NULL);
INSERT INTO `pmgr_units` VALUES (55,8,'C07','C07','VACANT',20,17,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (56,8,'C08','C08','VACANT',21,18,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (57,8,'C09','C09','OCCUPIED',22,19,25.00,63.00,NULL);
INSERT INTO `pmgr_units` VALUES (58,3,'D01','D01','OCCUPIED',57,61,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (59,3,'D02','D02','OCCUPIED',58,60,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (60,3,'D03','D03','OCCUPIED',59,59,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (61,3,'D04','D04','OCCUPIED',60,58,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (62,3,'D05','D05','OCCUPIED',61,57,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (63,3,'D06','D06','OCCUPIED',62,56,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (64,3,'D07','D07','OCCUPIED',63,55,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (65,3,'D08','D08','OCCUPIED',64,54,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (66,3,'D09','D09','OCCUPIED',65,53,25.00,70.00,NULL);
INSERT INTO `pmgr_units` VALUES (67,11,'D10','D10','VACANT',66,52,25.00,60.00,NULL);
INSERT INTO `pmgr_units` VALUES (68,11,'D11','D11','VACANT',67,51,25.00,60.00,NULL);
INSERT INTO `pmgr_units` VALUES (69,12,'Y01','Y01','OCCUPIED',69,69,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (70,12,'Y02','Y02','OCCUPIED',70,70,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (71,12,'Y03','Y03','OCCUPIED',71,71,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (72,12,'Y04','Y04','VACANT',72,72,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (73,12,'Y05','Y05','OCCUPIED',73,73,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (74,12,'Y06','Y06','VACANT',74,74,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (75,12,'Y07','Y07','VACANT',75,75,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (76,12,'Y08','Y08','VACANT',76,76,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (77,12,'Y09','Y09','VACANT',77,77,0.00,35.00,NULL);
INSERT INTO `pmgr_units` VALUES (78,12,'Y10','Y10','VACANT',78,78,0.00,35.00,NULL);
/*!40000 ALTER TABLE `pmgr_units` ENABLE KEYS */;
UNLOCK TABLES;
@@ -5880,4 +5863,4 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2009-08-19 20:30:11
-- Dump completed on 2009-08-26 20:06:39

View File

@@ -475,8 +475,6 @@ CREATE TABLE `pmgr_units` (
'LIENED')
NOT NULL DEFAULT 'VACANT',
`current_lease_id` INT(10) UNSIGNED DEFAULT NULL,
`sort_order` MEDIUMINT UNSIGNED NOT NULL,
`walk_order` MEDIUMINT UNSIGNED NOT NULL,

View File

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

View File

@@ -38,7 +38,7 @@ class AppController extends Controller {
var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid');
var $components = array('DebugKit.Toolbar');
var $sidemenu_areas = array('SITE' => false, 'CONTROLLER' => false, 'ACTION' => false);
var $sidemenu = array('areas' => array('SITE' => false, 'CONTROLLER' => false, 'ACTION' => false));
var $std_area = 10;
var $new_area = 20;
var $op_area = 30;
@@ -61,7 +61,7 @@ class AppController extends Controller {
function sideMenuAreaVerify(&$area, $subarea, $priority = null) {
$area = strtoupper($area);
if (!array_key_exists($area, $this->sidemenu_areas))
if (!array_key_exists($area, $this->sidemenu['areas']))
$this->INTERNAL_ERROR("Sidemenu link '{$area}': Unknown");
if ($area == 'SITE')
@@ -71,9 +71,9 @@ class AppController extends Controller {
elseif ($area == 'ACTION')
$name = Inflector::humanize(Inflector::singularize($this->params['controller']));
if (empty($this->sidemenu_areas[$area]))
$this->sidemenu_areas[$area]
= array('enable' => true, 'name' => $name, 'subarea' => array());
if (empty($this->sidemenu['areas'][$area]))
$this->sidemenu['areas'][$area]
= array('enable' => true, 'name' => $name, 'subareas' => array());
if (empty($subarea))
return;
@@ -83,7 +83,7 @@ class AppController extends Controller {
$subname .= '';
elseif ($subarea == $this->op_area)
//$subname .= '-Ops';
$subname = 'Operations';
$subname = 'Actions';
elseif ($subarea == $this->new_area)
//$subname .= '-New';
$subname = 'Creation';
@@ -94,15 +94,15 @@ class AppController extends Controller {
else
$subname .= '-' . $subarea;
if (empty($this->sidemenu_areas[$area]['subarea'][$subarea]))
$this->sidemenu_areas[$area]['subarea'][$subarea]
if (empty($this->sidemenu['areas'][$area]['subareas'][$subarea]))
$this->sidemenu['areas'][$area]['subareas'][$subarea]
= array('enable' => true, 'name' => $subname, 'priorities' => array());
if (empty($priority))
return;
if (empty($this->sidemenu_areas[$area]['subarea'][$subarea]['priorities'][$priority]))
$this->sidemenu_areas[$area]['subarea'][$subarea]['priorities'][$priority]
if (empty($this->sidemenu['areas'][$area]['subareas'][$subarea]['priorities'][$priority]))
$this->sidemenu['areas'][$area]['subareas'][$subarea]['priorities'][$priority]
= array();
}
@@ -117,9 +117,22 @@ class AppController extends Controller {
function sideMenuAreaName($name, $area, $subarea = null) {
$this->sideMenuAreaVerify($area, $subarea);
if (empty($subarea))
$this->sidemenu_areas[$area]['name'] = $name;
$this->sidemenu['areas'][$area]['name'] = $name;
else
$this->sidemenu_areas[$area]['subarea'][$subarea]['name'] = $name;
$this->sidemenu['areas'][$area]['subareas'][$subarea]['name'] = $name;
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: sideMenuAreaActivate
* - Sets the selected area/subarea to be active when the
* page is first loaded.
*/
function sideMenuAreaActivate($area, $subarea = null) {
$this->sidemenu['active'] = compact('area', 'subarea');
}
@@ -133,9 +146,9 @@ class AppController extends Controller {
function sideMenuEnable($area, $subarea = null, $enable = true) {
$this->sideMenuAreaVerify($area, $subarea);
if (isset($subarea))
$this->sidemenu_areas[$area]['subarea'][$subarea]['enable'] = $enable;
$this->sidemenu['areas'][$area]['subareas'][$subarea]['enable'] = $enable;
else
$this->sidemenu_areas[$area]['enable'] = $enable;
$this->sidemenu['areas'][$area]['enable'] = $enable;
}
@@ -150,7 +163,7 @@ class AppController extends Controller {
if (empty($subarea))
$subarea = $this->std_area;
$this->sideMenuAreaVerify($area, $subarea);
$this->sidemenu_areas[$area]['subarea'][$subarea]['priorities'][$priority][]
$this->sidemenu['areas'][$area]['subareas'][$subarea]['priorities'][$priority][]
= array('name' => $name, 'url' => $url) + (empty($extra) ? array() : $extra);
}
@@ -167,6 +180,9 @@ class AppController extends Controller {
$this->addSideMenuLink('Site Map',
array('controller' => 'maps', 'action' => 'view', 1), null,
'SITE');
$this->addSideMenuLink('Unit Sizes',
array('controller' => 'unit_sizes', 'action' => 'index'), null,
'SITE');
$this->addSideMenuLink('Units',
array('controller' => 'units', 'action' => 'index'), null,
'SITE');
@@ -179,72 +195,83 @@ class AppController extends Controller {
$this->addSideMenuLink('Deposits',
array('controller' => 'transactions', 'action' => 'deposit'), null,
'SITE');
$this->addSideMenuLink('Accounts',
array('controller' => 'accounts', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Contacts',
array('controller' => 'contacts', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Ledgers',
array('controller' => 'ledgers', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Tenders',
array('controller' => 'tenders', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Transactions',
array('controller' => 'transactions', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Ldgr Entries',
array('controller' => 'ledger_entries', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Stmt Entries',
array('controller' => 'statement_entries', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('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->addSideMenuLink('Move-In', */
/* array('controller' => 'customers', 'action' => 'move_in'), null, */
/* 'SITE', $this->op_area); */
/* $this->addSideMenuLink('Move-Out', */
/* array('controller' => 'customers', 'action' => 'move_out'), null, */
/* 'SITE', $this->op_area); */
/* $this->addSideMenuLink('New Receipt', */
/* array('controller' => 'customers', 'action' => 'receipt'), null, */
/* 'SITE', $this->op_area); */
/* $this->addSideMenuLink('New Customer', */
/* array('controller' => 'customers', 'action' => 'add'), null, */
/* 'SITE', $this->op_area); */
/* $this->addSideMenuLink('New Deposit', */
/* array('controller' => 'tenders', 'action' => 'deposit'), null, */
/* 'SITE', $this->op_area); */
if ($this->params['admin']) {
$this->addSideMenuLink('Accounts',
array('controller' => 'accounts', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Contacts',
array('controller' => 'contacts', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Ledgers',
array('controller' => 'ledgers', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Tenders',
array('controller' => 'tenders', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Transactions',
array('controller' => 'transactions', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Ldgr Entries',
array('controller' => 'ledger_entries', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Stmt Entries',
array('controller' => 'statement_entries', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Assess Charges',
array('controller' => 'leases', 'action' => 'assess_all'), null,
'SITE', $this->admin_area);
}
if ($this->params['dev']) {
$this->addSideMenuLink('Un-Nuke',
'#', array('htmlAttributes' =>
array('onclick' => '$(".pr-section").show(); return false;')),
'SITE', $this->dev_area);
$this->addSideMenuLink('New Ledgers',
array('controller' => 'accounts', 'action' => 'newledger'), null,
'SITE', $this->dev_area);
}
'SITE', $this->admin_area);
$this->sideMenuAreaName('Operations', 'SITE', $this->op_area);
$this->addSideMenuLink('Un-Nuke',
'#', array('htmlAttributes' =>
array('onclick' => '$(".pr-section").show(); return false;')),
'SITE', $this->dev_area);
$this->addSideMenuLink('New Ledgers',
array('controller' => 'accounts', 'action' => 'newledger'), null,
'SITE', $this->dev_area);
$this->addSideMenuLink('New Receipt',
array('controller' => 'customers', 'action' => 'receipt'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('New Invoice',
array('controller' => 'leases', 'action' => 'invoice'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('Move-In',
array('controller' => 'customers', 'action' => 'move_in'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('Move-Out',
array('controller' => 'leases', 'action' => 'move_out'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('New Deposit',
array('controller' => 'tenders', 'action' => 'deposit'), null,
'SITE', $this->op_area);
// REVISIT <AP>: 20090824
// Depending on preference, we may put this into the gridView
// function, making the links available only when navigating.
$this->addGridViewSideMenuLinks();
}
/**************************************************************************
**************************************************************************
**************************************************************************
* virtual: addGridViewSideMenuLinks
* - Adds the grid view specific navigation links, if overridden.
*/
function addGridViewSideMenuLinks() {
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -263,6 +290,13 @@ class AppController extends Controller {
$this->addDefaultSideMenuLinks();
$this->sideMenuEnable('SITE', $this->op_area, false);
foreach ($this->sidemenu['areas'] AS $area_name => $area) {
if (empty($this->params['dev']))
$this->sideMenuEnable($area_name, $this->dev_area, false);
if (empty($this->params['admin']))
$this->sideMenuEnable($area_name, $this->admin_area, false);
}
}
@@ -282,24 +316,48 @@ class AppController extends Controller {
$this->params['admin'] = false;
}
foreach ($this->sidemenu_areas AS &$area) {
foreach ($this->sidemenu['areas'] AS $aname => &$area) {
if (empty($area['enable']))
$area = array();
if (empty($area['subarea']))
if (empty($area['subareas']))
continue;
ksort($area['subarea']);
ksort($area['subareas']);
foreach ($area['subarea'] AS &$subarea) {
foreach ($area['subareas'] AS $sname => &$subarea) {
if (empty($subarea['enable']))
$subarea = array();
if (empty($subarea['priorities']))
continue;
ksort($subarea['priorities']);
foreach ($subarea['priorities'] AS $pname => &$priority) {
if (empty($priority))
unset($subarea['priorities'][$pname]);
}
unset($priority);
if (empty($subarea['priorities']))
unset($area['subareas'][$sname]);
}
unset($subarea);
if (empty($area['subareas']))
unset($this->sidemenu['areas'][$aname]);
}
unset($area);
// Activate a default section (unless already specified)
foreach (array_reverse($this->sidemenu['areas']) AS $area_name => $area) {
if (empty($area))
continue;
if (empty($this->sidemenu['active']) ||
empty($this->sidemenu['areas'][$this->sidemenu['active']['area']]))
$this->sideMenuAreaActivate($area_name);
}
//pr($this->sidemenu_areas);
$this->set('sidemenu', $this->sidemenu_areas);
//pr($this->sidemenu);
$this->set('sidemenu', $this->sidemenu);
}
@@ -373,9 +431,14 @@ class AppController extends Controller {
* helper: gridView
* - called by derived controllers to create an index listing
*/
function index() {
$names = Inflector::humanize(Inflector::pluralize($this->params['controller']));
$this->gridView('All ' . $names, 'all');
}
function gridView($title, $action = null, $element = null) {
$this->sideMenuEnable('SITE', $this->op_area);
$this->sideMenuAreaActivate('CONTROLLER');
$this->set('title', $title);
// The resulting page will contain a grid, which will
// use ajax to obtain the actual data for this action
@@ -512,6 +575,7 @@ class AppController extends Controller {
$xml = preg_replace("/</", "&lt;", $xml);
$xml = preg_replace("/>/", "&gt;", $xml);
echo ("\n<PRE>\n$xml\n</PRE>\n");
$this->render_empty();
}
}
@@ -1020,10 +1084,9 @@ class AppController extends Controller {
}
function gridDataOutputHeader(&$params, &$model) {
if (!$params['debug']) {
if (!$params['debug'])
header("Content-type: text/xml;charset=utf-8");
}
}
function gridDataOutputXMLHeader(&$params, &$model) {
echo "<?xml version='1.0' encoding='utf-8'?>\n";

View File

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

View File

@@ -10,5 +10,10 @@ class DATABASE_CONFIG {
'database' => 'pmgr_sand',
'prefix' => 'pmgr_',
);
function __construct() {
if (preg_match("%^/[^/]*sand/%", $_SERVER['REQUEST_URI']))
$this->default['database'] = 'pmgr_sand';
}
}
?>

View File

@@ -8,12 +8,31 @@ class AccountsController extends AppController {
/**************************************************************************
**************************************************************************
**************************************************************************
* override: addDefaultSideMenuLinks
* - Adds controller specific default side menu links
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function addDefaultSideMenuLinks() {
parent::addDefaultSideMenuLinks();
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Asset',
array('controller' => 'accounts', 'action' => 'asset'), null,
'CONTROLLER', $this->admin_area);
$this->addSideMenuLink('Liability',
array('controller' => 'accounts', 'action' => 'liability'), null,
'CONTROLLER', $this->admin_area);
$this->addSideMenuLink('Equity',
array('controller' => 'accounts', 'action' => 'equity'), null,
'CONTROLLER', $this->admin_area);
$this->addSideMenuLink('Income',
array('controller' => 'accounts', 'action' => 'income'), null,
'CONTROLLER', $this->admin_area);
$this->addSideMenuLink('Expense',
array('controller' => 'accounts', 'action' => 'expense'), null,
'CONTROLLER', $this->admin_area);
$this->addSideMenuLink('All',
array('controller' => 'accounts', 'action' => 'all'), null,
'CONTROLLER', $this->admin_area);
}
@@ -30,29 +49,7 @@ class AccountsController extends AppController {
function equity() { $this->gridView('Equity Accounts'); }
function income() { $this->gridView('Income Accounts'); }
function expense() { $this->gridView('Expense Accounts'); }
function all() { $this->gridView('All Accounts', 'all'); }
function gridView($title, $action = null, $element = null) {
$this->addSideMenuLink('Asset',
array('controller' => 'accounts', 'action' => 'asset'), null,
'CONTROLLER');
$this->addSideMenuLink('Liability',
array('controller' => 'accounts', 'action' => 'liability'), null,
'CONTROLLER');
$this->addSideMenuLink('Equity',
array('controller' => 'accounts', 'action' => 'equity'), null,
'CONTROLLER');
$this->addSideMenuLink('Income',
array('controller' => 'accounts', 'action' => 'income'), null,
'CONTROLLER');
$this->addSideMenuLink('Expense',
array('controller' => 'accounts', 'action' => 'expense'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'accounts', 'action' => 'all'), null,
'CONTROLLER');
parent::gridView($title, $action, $element);
}
function all() { $this->gridView('All Accounts', 'all'); }
/**************************************************************************
@@ -204,10 +201,10 @@ class AccountsController extends AppController {
$this->addSideMenuLink('New Ledger',
array('action' => 'newledger', $id), null,
'ACTION');
'ACTION', $this->admin_area);
$this->addSideMenuLink('Collected',
array('action' => 'collected', $id), null,
'ACTION');
'ACTION', $this->admin_area);
// Prepare to render
$title = 'Account: ' . $account['Account']['name'];

View File

@@ -23,6 +23,19 @@ class ContactsController extends AppController {
* to jqGrid.
*/
function gridDataFilterTablesConfig(&$params, &$model, $table) {
$config = parent::gridDataFilterTablesConfig($params, $model, $table);
// Special case for Customer; We need the Contact/Customer relationship
if ($table == 'Customer')
$config = array('fields' => array('ContactsCustomer.type',
'ContactsCustomer.active'),
'conditions' => array('ContactsCustomer.active' => true),
);
return $config;
}
function gridDataOrder(&$params, &$model, $index, $direction) {
$order = parent::gridDataOrder($params, $model, $index, $direction);
@@ -37,7 +50,7 @@ class ContactsController extends AppController {
}
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['Contact'] = array('last_name', 'first_name');
$links['Contact'] = array('display_name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}

View File

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

View File

@@ -6,29 +6,13 @@ class LeasesController extends AppController {
/**************************************************************************
**************************************************************************
**************************************************************************
* override: addDefaultSideMenuLinks
* - Adds controller specific default side menu links
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function addDefaultSideMenuLinks() {
parent::addDefaultSideMenuLinks();
}
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
/**************************************************************************
**************************************************************************
**************************************************************************
* action: index / active / closed / all
* - Generate a listing of leases
*/
function index() { $this->all(); }
function active() { $this->gridView('Active Leases'); }
function delinquent() { $this->gridView('Delinquent Leases'); }
function closed() { $this->gridView('Closed Leases'); }
function all() { $this->gridView('All Leases', 'all'); }
function gridView($title, $action = null, $element = null) {
$this->addSideMenuLink('Active',
array('controller' => 'leases', 'action' => 'active'), null,
'CONTROLLER');
@@ -41,10 +25,23 @@ class LeasesController extends AppController {
$this->addSideMenuLink('All',
array('controller' => 'leases', 'action' => 'all'), null,
'CONTROLLER');
parent::gridView($title, $action, $element);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: index / active / closed / all
* - Generate a listing of leases
*/
function index() { $this->active(); }
function active() { $this->gridView('Active Leases', 'active'); }
function delinquent() { $this->gridView('Delinquent Leases'); }
function closed() { $this->gridView('Closed Leases'); }
function all() { $this->gridView('All Leases'); }
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -186,42 +183,43 @@ class LeasesController extends AppController {
$this->data['Lease']['moveout_date']
);
$this->redirect($this->data['redirect']);
$this->redirect(array('controller' => 'leases',
'action' => 'view',
$this->data['Lease']['id']));
}
if (!isset($id))
die("Oh Nooooo!!");
if (isset($id)) {
$lease = $this->Lease->find
('first', array
('contain' => array
(// Models
'Unit' =>
array('order' => array('sort_order'),
'fields' => array('id', 'name'),
),
$lease = $this->Lease->find
('first', array
('contain' => array
(// Models
'Unit' =>
array('order' => array('sort_order'),
'fields' => array('id', 'name'),
),
'Customer' =>
array('fields' => array('id', 'name'),
),
),
'Customer' =>
array('fields' => array('id', 'name'),
),
),
'conditions' => array(array('Lease.id' => $id),
array('Lease.close_date' => null),
),
));
$this->set('customer', $lease['Customer']);
$this->set('unit', $lease['Unit']);
$this->set('lease', $lease['Lease']);
'conditions' => array(array('Lease.id' => $id),
array('Lease.close_date' => null),
),
));
$this->set('customer', $lease['Customer']);
$this->set('unit', $lease['Unit']);
$this->set('lease', $lease['Lease']);
$title = ('Lease #' . $lease['Lease']['number'] . ': ' .
$lease['Unit']['name'] . ': ' .
$lease['Customer']['name'] . ': Move-Out');
}
else {
$title = 'Move-Out';
}
$redirect = array('controller' => 'leases',
'action' => 'view',
$id);
$title = ('Lease #' . $lease['Lease']['number'] . ': ' .
$lease['Unit']['name'] . ': ' .
$lease['Customer']['name'] . ': Prepare Move-Out');
$this->set(compact('title', 'redirect'));
$this->set(compact('title'));
$this->render('/leases/move');
}

View File

@@ -6,12 +6,22 @@ class LedgersController extends AppController {
/**************************************************************************
**************************************************************************
**************************************************************************
* override: addDefaultSideMenuLinks
* - Adds controller specific default side menu links
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function addDefaultSideMenuLinks() {
parent::addDefaultSideMenuLinks();
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Current',
array('controller' => 'ledgers', 'action' => 'current'), null,
'CONTROLLER');
$this->addSideMenuLink('Closed',
array('controller' => 'ledgers', 'action' => 'closed'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'ledgers', 'action' => 'all'), null,
'CONTROLLER');
}
@@ -27,19 +37,6 @@ class LedgersController extends AppController {
function closed() { $this->gridView('Closed Ledgers'); }
function all() { $this->gridView('All Ledgers', 'all'); }
function gridView($title, $action = null, $element = null) {
$this->addSideMenuLink('Current',
array('controller' => 'ledgers', 'action' => 'current'), null,
'CONTROLLER');
$this->addSideMenuLink('Closed',
array('controller' => 'ledgers', 'action' => 'closed'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'ledgers', 'action' => 'all'), null,
'CONTROLLER');
parent::gridView($title, $action, $element);
}
/**************************************************************************
**************************************************************************

View File

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

View File

@@ -150,12 +150,6 @@ class TendersController extends AppController {
));
// Watch out for the special "Closing" entries
if (!empty($tender['TenderType']['id']))
$this->addSideMenuLink('Edit',
array('action' => 'edit', $id), null,
'ACTION');
if (!empty($tender['Tender']['deposit_transaction_id'])
&& empty($tender['Tender']['nsf_transaction_id'])
// Hard to tell what types of items can come back as NSF.
@@ -168,6 +162,13 @@ class TendersController extends AppController {
'ACTION');
}
// Watch out for the special "Closing" entries, which have
// tender_type_id set to NULL. Otherwise, allow editing.
if (!empty($tender['TenderType']['id']))
$this->addSideMenuLink('Edit',
array('action' => 'edit', $id), null,
'ACTION');
// Prepare to render.
$title = "Tender #{$tender['Tender']['id']} : {$tender['Tender']['name']}";
$this->set(compact('tender', 'title'));

View File

@@ -8,12 +8,31 @@ class TransactionsController extends AppController {
/**************************************************************************
**************************************************************************
**************************************************************************
* override: addDefaultSideMenuLinks
* - Adds controller specific default side menu links
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function addDefaultSideMenuLinks() {
parent::addDefaultSideMenuLinks();
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Invoices',
array('controller' => 'transactions', 'action' => 'invoice'), null,
'CONTROLLER');
$this->addSideMenuLink('Receipts',
array('controller' => 'transactions', 'action' => 'receipt'), null,
'CONTROLLER');
$this->addSideMenuLink('Deposits',
array('controller' => 'transactions', 'action' => 'deposit'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'transactions', 'action' => 'all'), null,
'CONTROLLER');
// REVISIT <AP>: 20090824
// Right now, we wish to keep things simple. Don't make these
// links available to non-admin users.
if (empty($this->params['admin']))
$this->sideMenuEnable('CONTROLLER', $this->std_area, false);
}
@@ -29,29 +48,12 @@ class TransactionsController extends AppController {
function invoice() { $this->gridView('Invoices'); }
function receipt() { $this->gridView('Receipts'); }
function deposit() {
if (empty($this->params['admin']))
$this->sideMenuEnable('CONTROLLER', $this->std_area, false);
$this->addSideMenuLink('New Deposit',
array('controller' => 'tenders', 'action' => 'deposit'), null,
'ACTION');
'ACTION', $this->new_area);
$this->gridView('Deposits');
}
function gridView($title, $action = null, $element = null) {
$this->addSideMenuLink('Invoices',
array('controller' => 'transactions', 'action' => 'invoice'), null,
'CONTROLLER');
$this->addSideMenuLink('Receipts',
array('controller' => 'transactions', 'action' => 'receipt'), null,
'CONTROLLER');
$this->addSideMenuLink('Deposits',
array('controller' => 'transactions', 'action' => 'deposit'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'transactions', 'action' => 'all'), null,
'CONTROLLER');
parent::gridView($title, $action, $element);
}
/**************************************************************************
**************************************************************************
@@ -424,14 +426,13 @@ class TransactionsController extends AppController {
array('action' => 'deposit_slip', $id), null,
'ACTION');
if ($this->params['dev'])
$this->addSideMenuLink('Destroy',
array('action' => 'destroy', $id),
array('confirmMessage' =>
"This may leave the database in an unstable state." .
" Do NOT do this unless you know what you're doing." .
" Proceed anyway?"),
'ACTION', $this->dev_area);
$this->addSideMenuLink('Destroy',
array('action' => 'destroy', $id),
array('confirmMessage' =>
"This may leave the database in an unstable state." .
" Do NOT do this unless you know what you're doing." .
" Proceed anyway?"),
'ACTION', $this->dev_area);
// OK, prepare to render.
$title = 'Transaction #' . $transaction['Transaction']['id'];

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -82,6 +82,7 @@ echo $this->element('ledger_entries', array
'exclude' => array('Account', 'Amount', 'Cr/Dr', 'Balance',
empty($account['receipts']) ? 'Tender' : null),
'include' => array('Debit', 'Credit', 'Sub-Total'),
'limit' => 50,
)));
@@ -100,6 +101,7 @@ echo $this->element('ledger_entries', array
'exclude' => array('Account', 'Amount', 'Cr/Dr', 'Balance',
empty($account['receipts']) ? 'Tender' : null),
'include' => array('Debit', 'Credit', 'Sub-Total'),
'limit' => 50,
)));

View File

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

View File

@@ -17,16 +17,17 @@ if (isset($contact['Contact']))
$contact = $contact['Contact'];
$rows = array();
$rows[] = array('First Name', $contact['first_name']);
$rows[] = array('Middle Name', $contact['middle_name']);
$rows[] = array('Last Name', $contact['last_name']);
$rows[] = array('Company', $contact['company_name']);
$rows[] = array('SSN', $contact['id_federal']);
$rows[] = array('ID', ($contact['id_local']
. ($contact['id_local']
? " - ".$contact['id_local_state']
: "")));
$rows[] = array('Comment', $contact['comment']);
$rows[] = array('Display Name', $contact['display_name']);
$rows[] = array('First Name', $contact['first_name']);
$rows[] = array('Middle Name', $contact['middle_name']);
$rows[] = array('Last Name', $contact['last_name']);
$rows[] = array('Company', $contact['company_name']);
$rows[] = array('SSN', $contact['id_federal']);
$rows[] = array('ID', ($contact['id_local']
. ($contact['id_local']
? " - ".$contact['id_local_state']
: "")));
$rows[] = array('Comment', $contact['comment']);
echo $this->element('table',
array('class' => 'item contact detail',
@@ -135,6 +136,7 @@ echo $this->element('customers', array
'config' => array
('caption' => 'Related Customers',
'filter' => array('Contact.id' => $contact['id']),
'include' => array('Relationship'),
)));

View File

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

View File

@@ -111,21 +111,8 @@ function onGridLoadComplete() {
function onRowSelect(grid_id, customer_id) {
// Set the customer id that will be returned with the form
$("#customer-id").val(customer_id);
// Get the item names from the grid
//$("#receipt-customer-id").html($(grid_id).getCell(customer_id, 'Customer-id'));
// REVISIT <AP>: 20090708
// This is not intended as a long term solution,
// but I need a way to enter data and then view
// the results. This link will help.
$("#receipt-customer-id").html('<A HREF="' +
"<?php echo $html->url(array('controller' => 'customers',
'action' => 'view')); ?>"
+ "/" +
$(grid_id).getCell(customer_id, 'Customer-id').replace(/^#/,'') +
'">' +
$(grid_id).getCell(customer_id, 'Customer-id') +
'</A>');
// Set the customer name, so the user knows who the receipt is for
$("#receipt-customer-name").html($(grid_id).getCell(customer_id, 'Customer-name'));
// Hide the "no customer" message and show the current customer
@@ -273,8 +260,7 @@ echo $this->element('customers', array
echo ('<DIV CLASS="receipt grid-selection-text">' .
'<DIV CLASS="customer-selection-valid" style="display:none">' .
'Customer <SPAN id="receipt-customer-id"></SPAN>' .
': <SPAN id="receipt-customer-name"></SPAN>' .
'Customer: <SPAN id="receipt-customer-name"></SPAN>' .
/* '<DIV CLASS="supporting">' . */
/* '<TABLE>' . */
@@ -384,22 +370,12 @@ Configure::write('debug', '0');
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
$("#receipt-customer-id").html("INTERNAL ERROR");
$("#receipt-customer-name").html("INTERNAL ERROR");
$("#receipt-balance").html("INTERNAL ERROR");
$("#receipt-charges-caption").html("Outstanding Charges");
<?php if (isset($customer['id'])): ?>
$("#customer-id").val(<?php echo $customer['id']; ?>);
//$("#receipt-customer-id").html("<?php echo '#'.$customer['id']; ?>");
$("#receipt-customer-id").html('<A HREF="' +
"<?php echo $html->url(array('controller' => 'customers',
'action' => 'view')); ?>"
+ "/" +
"<?php echo $customer['id']; ?>" +
'">#' +
"<?php echo $customer['id']; ?>" +
'</A>');
$("#receipt-customer-name").html("<?php echo $customer['name']; ?>");
$("#receipt-balance").html(fmtCurrency("<?php echo $stats['balance']; ?>"));
onGridState(null, 'hidden');

View File

@@ -61,7 +61,7 @@ echo $this->element('contacts', array
'config' => array
('caption' => 'Customer Contacts',
'filter' => array('Customer.id' => $customer['Customer']['id']),
'include' => array('Type', 'Active'),
'include' => array('Relationship'),
)));

View File

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

View File

@@ -10,11 +10,6 @@ $cols['Leases'] = array('index' => 'current_lease_count', 'formatt
$cols['Balance'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Comment'] = array('index' => 'Customer.comment', 'formatter' => 'comment');
// Certain fields are only valid with a particular context
if (!isset($config['filter']['Contact.id']))
$grid->invalidFields('Relationship');
// Render the grid
$grid
->columns($cols)
@@ -22,4 +17,4 @@ $grid
->defaultFields(array('Name'))
->searchFields(array('Name', 'Last Name', 'First Name'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Comment')));
array_diff(array_keys($cols), array('Relationship', 'Comment')));

View File

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

View File

@@ -121,6 +121,11 @@ foreach ($jqGridColumns AS $header => &$col) {
// No special formatting for number
unset($col['formatter']);
}
elseif ($col['formatter'] === 'percentage') {
$col['formatter'] = array('--special' => 'percentageFormatter');
$default['width'] = 60;
$default['align'] = 'right';
}
elseif ($col['formatter'] === 'currency') {
// Use our custom formatting for currency
$col['formatter'] = array('--special' => 'currencyFormatter');
@@ -259,12 +264,25 @@ $jqGrid_setup = array_merge
<script type="text/javascript"><!--
jQuery(document).ready(function(){
currencyFormatter = function(cellval, opts, rowObject) {
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;

View File

@@ -2,7 +2,6 @@
// Define the table columns
$cols = array();
$cols['LeaseID'] = array('index' => 'Lease.id', 'hidden' => true);
$cols['Lease'] = array('index' => 'Lease.number', 'formatter' => 'id');
$cols['Unit'] = array('index' => 'Unit.name', 'width' => '50', 'align' => 'center');
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
@@ -29,8 +28,8 @@ if (!empty($this->params['action'])) {
// Render the grid
$grid
->columns($cols)
->sortField('LeaseID')
->defaultFields(array('LeaseID', 'Lease'))
->sortField('Lease')
->defaultFields(array('Lease'))
->searchFields(array('Customer', 'Unit'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Signed', 'Status', 'Comment')));

View File

@@ -20,7 +20,6 @@ $cols['Sub-Total'] = array('index' => 'subtotal-balance', 'formatter' =>
// Render the grid
$grid
->limit(50)
->columns($cols)
->sortField('Date', 'DESC')
->defaultFields(array('Entry', 'Date', 'Amount'))

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,12 +6,16 @@ $cols['Sort'] = array('index' => 'Unit.sort_order', 'hidden' => true);
$cols['Walk'] = array('index' => 'Unit.walk_order', 'formatter' => 'number');
$cols['Unit'] = array('index' => 'Unit.name', 'formatter' => 'shortname');
$cols['Size'] = array('index' => 'UnitSize.name', 'formatter' => 'shortname');
$cols['Area'] = array('index' => 'sqft', 'formatter' => 'number');
$cols['Rent'] = array('index' => 'Unit.rent', 'formatter' => 'currency');
$cols['Deposit'] = array('index' => 'Unit.deposit', 'formatter' => 'currency');
$cols['Status'] = array('index' => 'Unit.status', 'formatter' => 'name'); // We have enough real estate
$cols['Balance'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Comment'] = array('index' => 'Unit.comment', 'formatter' => 'comment');
if (in_array($this->params['action'], array('vacant', 'unavailable')))
$grid->invalidFields('Balance');
// Render the grid
$grid
->columns($cols)

View File

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

View File

@@ -99,20 +99,7 @@ function onRowSelect(grid_id, lease_id) {
// Set the item id that will be returned with the form
$("#lease-id").val(lease_id);
// Get the item names from the grid
//$("#invoice-lease").html($(grid_id).getCell(lease_id, 'Lease-number'));
// REVISIT <AP>: 20090708
// This is not intended as a long term solution,
// but I need a way to enter data and then view
// the results. This link will help.
$("#invoice-lease").html('<A HREF="' +
"<?php echo $html->url(array('controller' => 'leases',
'action' => 'view')); ?>"
+ "/" +
$(grid_id).getCell(lease_id, 'Lease-id').replace(/^#/,'') +
'">' +
$(grid_id).getCell(lease_id, 'Lease-number') +
'</A>');
$("#invoice-lease").html($(grid_id).getCell(lease_id, 'Lease-number'));
$("#invoice-unit").html($(grid_id).getCell(lease_id, 'Unit-name'));
$("#invoice-customer").html($(grid_id).getCell(lease_id, 'Customer-name'));
$("#invoice-rent").html($(grid_id).getCell(lease_id, 'Lease-rent'));
@@ -222,6 +209,7 @@ if (empty($movein))
array('gridstate' =>
'onGridState("#"+$(this).attr("id"), gridstate)'),
),
'exclude' => array('Closed'),
'action' => 'active',
'nolinks' => true,
'limit' => 10,
@@ -399,15 +387,7 @@ Configure::write('debug', '0');
<?php if (isset($lease['id'])): ?>
$("#lease-id").val(<?php echo $lease['id']; ?>);
//$("#invoice-lease").html("<?php echo '#'.$lease['number']; ?>");
$("#invoice-lease").html('<A HREF="' +
"<?php echo $html->url(array('controller' => 'leases',
'action' => 'view')); ?>"
+ "/" +
"<?php echo $lease['id']; ?>" +
'">#' +
"<?php echo $lease['number']; ?>" +
'</A>');
$("#invoice-lease").html("<?php echo '#'.$lease['number']; ?>");
$("#invoice-unit").html("<?php echo $unit['name']; ?>");
$("#invoice-customer").html("<?php echo $customer['name']; ?>");
$("#invoice-rent").html("<?php echo FormatHelper::currency($lease['rent']); ?>");

View File

@@ -26,14 +26,20 @@ $move_type = preg_replace("/.*_/", "", $this->action);
// Reset the form
function resetForm() {
$("#customer-id").val(0);
$("#move-customer").html("INTERNAL ERROR");
$("#unit-id").val(0);
$("#lease-id").val(0);
$("#move-customer").html("INTERNAL ERROR");
$("#move-unit").html("INTERNAL ERROR");
$("#move-lease").html("INTERNAL ERROR");
datepickerNow('LeaseMoveDate', false);
}
function onRowSelect(grid_id, item_type, item_id) {
cell_name = item_type.charAt(0).toUpperCase() + item_type.substr(1) + "-name";
cell_name = item_type.charAt(0).toUpperCase() + item_type.substr(1);
if (item_type == 'lease')
cell_name += "-number";
else
cell_name += "-name";
// Set the item id that will be returned with the form
$("#"+item_type+"-id").val(item_id);
@@ -47,6 +53,22 @@ function onRowSelect(grid_id, item_type, item_id) {
$("#LeaseDeposit").val($(grid_id).getCell(item_id, 'Unit-deposit'));
}
// If a unit was selected, update the "Create new customer" link
if (item_type == 'unit') {
$("#customer-selection-new-url").attr
('href',
"<?php echo
$html->url(array('controller' => 'customers',
'action' => 'add')); ?>"
+ '/' + $("#unit-id").val());
}
// If a lease was selected, update the customer and unit
if (item_type == 'lease') {
$("#move-unit").html($(grid_id).getCell(item_id, 'Unit-name'));
$("#move-customer").html($(grid_id).getCell(item_id, 'Customer-name'));
}
// Hide the "no customer" message and show the current customer
$("."+item_type+"-selection-invalid").hide();
$("."+item_type+"-selection-valid").show();
@@ -56,12 +78,12 @@ function onRowSelect(grid_id, item_type, item_id) {
function onGridState(grid_id, item_type, state) {
if (state == 'visible') {
$("."+item_type+"-selection-new").show();
$("."+item_type+"-selection-invalid").hide();
$("."+item_type+"-selection-valid").hide();
}
else {
//if ($(grid_id).getGridParam("selrow"))
//alert("id:" + $("#"+item_type+"-id").val());
$("."+item_type+"-selection-new").hide();
if ($("#"+item_type+"-id").val() > 0) {
$("."+item_type+"-selection-invalid").hide();
$("."+item_type+"-selection-valid").show();
@@ -78,7 +100,42 @@ function onGridState(grid_id, item_type, state) {
<?php
; // align
if ($move_type !== 'out') {
if ($move_type === 'out') {
echo $this->element('leases', array
('config' => array
('grid_div_id' => 'leases-list',
'grid_div_class' => 'text-below',
'caption' => ('<A HREF="#" ONCLICK="$(\'#leases-list .HeaderButton\').click();'.
' return false;">Select Lease</A>'),
'grid_setup' => array('hiddengrid' => isset($lease['id'])),
'grid_events' => array('onSelectRow' =>
array('ids' =>
'if (ids != null){onRowSelect("#"+$(this).attr("id"), "lease", ids);}'),
'onHeaderClick' =>
array('gridstate' =>
'onGridState("#"+$(this).attr("id"), "lease", gridstate)'),
),
'exclude' => array('Closed'),
'action' => 'active',
'nolinks' => true,
'limit' => 10,
)));
echo ('<DIV CLASS="move-inout grid-selection-text">' .
'<DIV CLASS="lease-selection-valid" style="display:none">' .
'Lease <SPAN id="move-lease"></SPAN>' . ' / ' .
'Unit: <SPAN id="move-unit"></SPAN>' . ' / ' .
'Customer: <SPAN id="move-customer"></SPAN>' .
'</DIV>' .
'<DIV CLASS="lease-selection-invalid" style="display:none">' .
'Please select lease' .
'</DIV>' .
'</DIV>' . "\n");
}
else {
echo $this->element('customers', array
('config' => array
('grid_div_id' => 'customers-list',
@@ -96,22 +153,27 @@ if ($move_type !== 'out') {
'nolinks' => true,
'limit' => 10,
)));
}
echo ('<DIV CLASS="move-inout grid-selection-text">' .
echo ('<DIV CLASS="move-inout grid-selection-text">' .
'<DIV CLASS="customer-selection-valid" style="display:none">' .
'Customer: <SPAN id="move-customer"></SPAN>' .
'</DIV>' .
'<DIV CLASS="customer-selection-new" style="display:none">' .
$html->link('Create a new Customer',
array('controller' => 'customers',
'action' => 'add',
(empty($unit['id']) ? null : $unit['id'])),
array('id' => 'customer-selection-new-url')) .
'</DIV>' .
'<DIV CLASS="customer-selection-invalid" style="display:none">' .
'Please select customer' .
'</DIV>' .
'<DIV CLASS="customer-selection-valid" style="display:none">' .
'Customer: <SPAN id="move-customer"></SPAN>' .
'</DIV>' .
'</DIV>' . "\n");
'<DIV CLASS="customer-selection-invalid" style="display:none">' .
'Please select customer' .
'</DIV>' .
'</DIV>' . "\n");
if ($move_type !== 'out') {
echo $this->element('units', array
('config' => array
('grid_div_id' => 'units-list',
@@ -132,39 +194,40 @@ if ($move_type !== 'out') {
'nolinks' => true,
'limit' => 10,
)));
echo ('<DIV CLASS="move-inout grid-selection-text">' .
'<DIV CLASS="unit-selection-valid" style="display:none">' .
'Unit: <SPAN id="move-unit"></SPAN>' .
'</DIV>' .
'<DIV CLASS="unit-selection-invalid" style="display:none">' .
'Please select unit' .
'</DIV>' .
'</DIV>' . "\n");
}
echo ('<DIV CLASS="move-inout grid-selection-text">' .
'<DIV CLASS="unit-selection-valid" style="display:none">' .
'Unit: <SPAN id="move-unit"></SPAN>' .
'</DIV>' .
'<DIV CLASS="unit-selection-invalid" style="display:none">' .
'Please select unit' .
'</DIV>' .
'</DIV>' . "\n");
echo $form->create(null, array('id' => 'move-inout-form',
'url' => array('controller' => 'leases',
'action' => $move_action)));
echo $form->input("Lease.customer_id",
array('id' => 'customer-id',
'type' => 'hidden',
'value' => 0));
echo $form->input("Lease.unit_id",
array('id' => 'unit-id',
'type' => 'hidden',
'value' => 0));
if ($move_type === 'out') {
echo $form->input('Lease.id',
array('type' => 'hidden',
'value' => $lease['id'],
));
array('id' => 'lease-id',
'type' => 'hidden',
'value' => 0));
}
else {
echo $form->input("Lease.customer_id",
array('id' => 'customer-id',
'type' => 'hidden',
'value' => 0));
echo $form->input("Lease.unit_id",
array('id' => 'unit-id',
'type' => 'hidden',
'value' => 0));
}
echo $this->element('form_table',
@@ -228,6 +291,20 @@ echo $form->end('Perform Move ' . ucfirst($move_type));
resetForm();
<?php if ($move_type === 'out') { ?>
<?php if (isset($lease['id'])): ?>
$("#lease-id").val(<?php echo $lease['id']; ?>);
$("#move-lease").html("#<?php echo $lease['number']; ?>");
$("#move-customer").html("<?php echo $customer['name']; ?>");
$("#move-unit").html("<?php echo $unit['name']; ?>");
onGridState(null, 'lease', 'hidden');
<?php else: ?>
onGridState(null, 'lease', 'visible');
<?php endif; ?>
<?php } else { /* end (move_type === 'out') */ ?>
<?php if (isset($customer['id'])): ?>
$("#customer-id").val(<?php echo $customer['id']; ?>);
$("#move-customer").html("<?php echo $customer['name']; ?>");
@@ -243,6 +320,10 @@ echo $form->end('Perform Move ' . ucfirst($move_type));
<?php else: ?>
onGridState(null, 'unit', 'visible');
<?php endif; ?>
<?php } /* end (move_type === 'out') */ ?>
});
--></script>

View File

@@ -72,6 +72,7 @@ echo $this->element('ledger_entries', array
'Amount', 'Cr/Dr', 'Balance',
empty($account['receipts']) ? 'Tender' : null),
'include' => array('Debit', 'Credit', 'Sub-Total'),
'limit' => 50,
)));

View File

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

View File

@@ -19,7 +19,10 @@ if (isset($unit['Unit']))
$rows = array();
$rows[] = array('Name', $unit['name']);
$rows[] = array('Status', $unit['status']);
$rows[] = array('Size', $unit_size['name']);
$rows[] = array('Size', $html->link($unit_size['name'],
array('controller' => 'unit_sizes',
'action' => 'view',
$unit_size['id'])));
$rows[] = array('Deposit', FormatHelper::currency($unit['deposit']));
$rows[] = array('Rent', FormatHelper::currency($unit['rent']));
$rows[] = array('Comment', $unit['comment']);

View File

@@ -15,6 +15,7 @@ table#layout { width: 100% }
td#sidecolumn ,
td#pagecolumn { vertical-align: top; }
td#pagecolumn { padding-left: 4mm; }
td#sidecolumn { width: 1% }
/************************************************************
@@ -46,7 +47,7 @@ span.fmt-age.delinquent { color: #f00; }
table.item th ,
table.item td { padding: 0.1em 0.4em 0.1em 0.4em; }
table.item td { white-space: nowrap; }
table.item td.name { white-space: nowrap; }
/* table.item { border-spacing: 0 0; /\*IE*\/border-collapse: collapse; empty-cells: show } */
table.item { border-spacing: 0 0; empty-cells: show }
table.item { border:1px solid #ccc;
@@ -122,6 +123,11 @@ div.detail.supporting { clear : both;
.edit table.detail { width : 80%;
float : none;
}
table.item td { vertical-align: top; }
.edit .item td.field .required { color: #33f }
.edit .item td.field .recommended { color: #35d }
.edit .item td.field .recommended.empty { color: #f5d }
.edit .item td.field .required.empty { color: #f33 }
/************************************************************

View File

@@ -3,8 +3,7 @@
* Side Menu Layout
*/
td#sidecolumn { width: 12em; text-align: left; }
#sidemenu { height: 20em; }
#sidemenu-container { width: 12em; height: 20em; }
/************************************************************

View File

@@ -0,0 +1,57 @@
/* ******************************************************************************
* hoverintent
*
* Works like mouseover, but instead of firing immediately when an object
* is mouseover'ed, it tries to determine when the user actually _intends_
* to have the pointer hover over the object. In other words, it's a lot
* like mouseover with a delay before firing, and if the pointer moves
* before hoverintent can fire, it doesn't fire at all.
*
* Found from jQuery UI Ticket #3614
* http://dev.jqueryui.com/ticket/3614
*/
var cfg = ($.hoverintent = {
sensitivity: 7,
interval: 100
});
$.event.special.hoverintent = {
setup: function() {
$(this).bind("mouseover", jQuery.event.special.hoverintent.handler);
},
teardown: function() {
$(this).unbind("mouseover", jQuery.event.special.hoverintent.handler);
},
handler: function(event) {
event.type = "hoverintent";
var self = this,
args = arguments,
target = $(event.target),
cX, cY, pX, pY;
function track(event) {
cX = event.pageX;
cY = event.pageY;
};
pX = event.pageX;
pY = event.pageY;
function clear() {
target.unbind("mousemove", track).unbind("mouseout", arguments.callee);
clearTimeout(timeout);
}
function handler() {
if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
clear();
jQuery.event.handle.apply(self, args);
} else {
pX = cX; pY = cY;
timeout = setTimeout(handler, cfg.interval);
}
}
var timeout = setTimeout(handler, cfg.interval);
target.mousemove(track).mouseout(clear);
return true;
}
};

View File

@@ -1,7 +1,3 @@
Fix ACH deposits into bank. Make it happen automatically,
perhaps after 3 days. Without this, we cannot NSF an ACH
transaction.
Add NSF Fee to the NSF entry page (It's hardcoded right now
in Transaction to $35).
@@ -13,9 +9,6 @@ was in early (VERY early) implementations. At that time, I
had to a use temporary variable to keep a running total. It
worked, but was MySQL specific.
Unit Size has no controller. Either remove the link from the
units grid, or implement the controller.
Add a move-out charges field to the move-out page.
Otherwise, if the balance is zero, the lease will automatically
be closed and no more charges are possible. The other option
@@ -36,22 +29,14 @@ Get Petty Cash working. We'll need to add one or more expense
accounts. We'll also need to implement purchase order
functionality, or at least simple an expense page.
Update unit status between OCCUPIED / LATE / LOCKED depending
on the current situation.
Have a report indicating Needs-to-be-Locked. Allow manager
to go through this list and check off the units actually
locked (which will update the unit status). Perhaps we
should add a needs-locked status.
locked (which will update the unit status).
Same as above, except needs-to-be-unlocked.
Make the default (initial) jqGrid sort order for balance be DESC.
Change the menu structure to be $menu['section']['item'], so that
items don't have to be added in order of section. Perhaps even
array(array(name, priority, items => array(name, priority, link)))
Change menu to be
'Reports' (or 'Overview', or 'Summary')
'Activities'
@@ -59,12 +44,6 @@ Change menu to be
- New Customer
- Move-in
Change New Customer form to have contact 'New' radio pre-checked
Add explanatory information on the New Customer page
- Customer name can be omitted and will come from primary tenant.
- Phone numbers, etc can be added later directly to the contact
Add dynamic check to see if customer already exists before being
created. Ideally, check +/- a few characters to check for
alternate spellings. Same for contact.
@@ -196,4 +175,21 @@ Automatic assessment of late fees, or at least for now, one
click manual mechanism to assess late fees correctly for all
tenants.
Fix ACH deposits into bank. Make it happen automatically,
perhaps after 3 days. Without this, we cannot NSF an ACH
transaction.
Change the menu structure to be $menu['section']['item'], so that
items don't have to be added in order of section. Perhaps even
array(array(name, priority, items => array(name, priority, link)))
Change New Customer form to have contact 'New' radio pre-checked
Add explanatory information on the New Customer page
- Customer name can be omitted and will come from primary tenant.
- Phone numbers, etc can be added later directly to the contact
Unit Size has no controller. Either remove the link from the
units grid, or implement the controller.