Compare commits

...

883 Commits

Author SHA1 Message Date
abijah
cbb8fdd7c3 Attempt to disable debugging, only turning it on if needed. I did this change earlier, so I don't completely recall, but I believe this doesn't working, because it turns on debugging too late.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_php5.3_support@1008 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-03-12 22:44:31 +00:00
abijah
e8a62f98fc Removed the deprecated assign by reference from the new operator
git-svn-id: file:///svn-source/pmgr/branches/v0.3_php5.3_support@1007 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-03-12 22:43:15 +00:00
abijah
5a9dd5252c Branched to do PHP 5.3 work
git-svn-id: file:///svn-source/pmgr/branches/v0.3_php5.3_support@1006 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-03-12 22:41:55 +00:00
abijah
7992b5413a Branched to do PHP 5.3 work
git-svn-id: file:///svn-source/pmgr/branches/v0.3_php5.3_support@1004 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-03-12 22:41:09 +00:00
abijah
c4f6f76edb Fixed a bug with 2 digit years
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1003 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-01-08 01:26:04 +00:00
abijah
10f74d90ba Fixed a bug with 2 digit years
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@1003 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-01-08 01:26:04 +00:00
abijah
d95045cb15 Modified the grid search to support standard date formats, with a bit of a kludge by applying it to fields that end with _date or stamp.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1002 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-01-08 00:56:15 +00:00
abijah
381d14a6f6 Modified the grid search to support standard date formats, with a bit of a kludge by applying it to fields that end with _date or stamp.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@1002 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-01-08 00:56:15 +00:00
abijah
0c95431128 Changed lease status to LATE after the customer is actually late, instead of when late charges start to apply.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1001 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-01-08 00:53:40 +00:00
abijah
5b911c856b Changed lease status to LATE after the customer is actually late, instead of when late charges start to apply.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@1001 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-01-08 00:53:40 +00:00
abijah
c76ba261d8 Fixed a bug with customer merge. Common contacts were being deleted when selected as a source contact to keep.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1000 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-12 21:48:42 +00:00
abijah
74eb6d29e1 Fixed a bug with customer merge. Common contacts were being deleted when selected as a source contact to keep.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@1000 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-12 21:48:42 +00:00
abijah
954f0d7968 Removed the debug aid of sub-totaling statement entries. I'll add the right solution someday...
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@998 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 22:19:55 +00:00
abijah
d8dfa0ca25 Removed the debug aid of sub-totaling statement entries. I'll add the right solution someday...
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@998 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 22:19:55 +00:00
abijah
920dba3a4d Modified a couple reports to have url control over the period
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@997 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 22:05:24 +00:00
abijah
fccaed681d Modified a couple reports to have url control over the period
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@997 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 22:05:24 +00:00
abijah
fff2e84fb1 Updated to include total leases / past leases
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@996 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 21:43:34 +00:00
abijah
3495a3d760 Updated to include total leases / past leases
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@996 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 21:43:34 +00:00
abijah
11aacd5803 Modified customer merge functionality to leave everything from the destination customer in-tact, and simply add on contacts from the source customer, if requested. This simplifies things significantly, and also the paradigm shift of starting the operation from the destination customer allows us to merge multiple customers into one with ease (no need to dig around for each source customer before clicking merge)
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@995 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 20:52:00 +00:00
abijah
cbdbbdf394 Modified customer merge functionality to leave everything from the destination customer in-tact, and simply add on contacts from the source customer, if requested. This simplifies things significantly, and also the paradigm shift of starting the operation from the destination customer allows us to merge multiple customers into one with ease (no need to dig around for each source customer before clicking merge)
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@995 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 20:52:00 +00:00
abijah
34844760e8 Added the front end code to perform a customer merge. Seems to work, although I don't fully trust it yet. Now that implementation is done, I realize I don't care for the interface. Really, the destination customer should keep its primary contact and all other contacts. The user should only be given the choice of adding zero to all contacts from the source customer. A change in primary contact could always be handled after the merge.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@994 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 19:36:39 +00:00
abijah
d83b72b2a3 Added the front end code to perform a customer merge. Seems to work, although I don't fully trust it yet. Now that implementation is done, I realize I don't care for the interface. Really, the destination customer should keep its primary contact and all other contacts. The user should only be given the choice of adding zero to all contacts from the source customer. A change in primary contact could always be handled after the merge.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@994 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 19:36:39 +00:00
abijah
b1113e826f First pass at a customer merge function. Preliminary tests seem to be successful.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@993 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 16:29:06 +00:00
abijah
2e3f168036 First pass at a customer merge function. Preliminary tests seem to be successful.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@993 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 16:29:06 +00:00
abijah
112a128492 Minor change to the display and sort order of unit sizes
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@992 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 13:38:38 +00:00
abijah
465d9c0c5f Minor change to the display and sort order of unit sizes
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@992 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 13:38:38 +00:00
abijah
d96145530c Minor update to support the 'IN' search type, avoid wrapping floating point in CDATA, and to support the grid request for multiple pages.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@991 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 13:27:35 +00:00
abijah
9bc572c590 Minor update to support the 'IN' search type, avoid wrapping floating point in CDATA, and to support the grid request for multiple pages.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@991 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-07-02 13:27:35 +00:00
abijah
a602fce3ab Added override function for counting the results. This is needed because the 'Unpaid Charges' report was returning a crazy large number of entries. Although I know this quick and dirty hack works for that report, I haven't checked or tested to see if this might cause issues in other areas.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@985 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-04-14 04:24:13 +00:00
abijah
59e23794c0 Added override function for counting the results. This is needed because the 'Unpaid Charges' report was returning a crazy large number of entries. Although I know this quick and dirty hack works for that report, I haven't checked or tested to see if this might cause issues in other areas.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@985 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-04-14 04:24:13 +00:00
abijah
6849c2caae Added possible fix for this problem with sandbox/devbox themes that use a font size so large, it creates usability issues.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@984 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-04-14 03:34:01 +00:00
abijah
fbaf23e7df Added possible fix for this problem with sandbox/devbox themes that use a font size so large, it creates usability issues.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@984 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-04-14 03:34:01 +00:00
abijah
b83c870eed Merge in bugfix from v0.2_work
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@982 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-04-02 13:08:41 +00:00
abijah
8d8ac0a60b Merge in bugfix from v0.2_work
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@982 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-04-02 13:08:41 +00:00
abijah
11b54588ff Changed the invoice page to redirect back to the customer view, which is typically more of interest than the lease view
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@980 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-04-02 12:24:34 +00:00
abijah
65b6d582d9 Changed the invoice page to redirect back to the customer view, which is typically more of interest than the lease view
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@980 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-04-02 12:24:34 +00:00
abijah
214aa4d348 Yet another bug from haste... let's hope this one fixes it.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@979 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-31 20:10:21 +00:00
abijah
45ed9bd7a3 Yet another bug from haste... let's hope this one fixes it.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@979 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-31 20:10:21 +00:00
abijah
f281295084 Fixed copy/paste bug introduced at the last minute on the prior checkin.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@978 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-31 20:07:29 +00:00
abijah
9adb37a8e2 Fixed copy/paste bug introduced at the last minute on the prior checkin.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@978 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-31 20:07:29 +00:00
abijah
68cbca5e28 Added outstanding charges and outstanding credits to the customer page, and reorded fields in order of presumed importance. Removed items from Unit/Lease which really shouldn't have been there. They were added for convenience, but the redundancy was confusing. Added a couple report links to make it easy to see outstanding charges and collected rents.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@977 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-31 19:49:56 +00:00
abijah
078497cca8 Added outstanding charges and outstanding credits to the customer page, and reorded fields in order of presumed importance. Removed items from Unit/Lease which really shouldn't have been there. They were added for convenience, but the redundancy was confusing. Added a couple report links to make it easy to see outstanding charges and collected rents.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@977 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-31 19:49:56 +00:00
abijah
4892143c0c On move-out, redirecting back to the customer instead of the closed lease
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@976 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-31 19:45:45 +00:00
abijah
c688586fcb On move-out, redirecting back to the customer instead of the closed lease
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@976 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-31 19:45:45 +00:00
abijah
1be8df7a75 Fixed a sorting issue (depending on point of view). When sorting by date, or effective date, I find it useful to have the next order of sort be entry ID, so they can be viewed in the order actually entered. Ideally, we'll get to a 4 date system: charge-from date, charge-to date, effective date (whatever date the user feels is the right date for the transaction), and _actual_ date, which is the true and correct entry date/time and _not_ user settable. The names of each may need to be different, but that's where we need to head, in which case, we would sort on actual date instead of entry-id.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@975 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-30 16:02:43 +00:00
abijah
b032dbd137 Fixed a sorting issue (depending on point of view). When sorting by date, or effective date, I find it useful to have the next order of sort be entry ID, so they can be viewed in the order actually entered. Ideally, we'll get to a 4 date system: charge-from date, charge-to date, effective date (whatever date the user feels is the right date for the transaction), and _actual_ date, which is the true and correct entry date/time and _not_ user settable. The names of each may need to be different, but that's where we need to head, in which case, we would sort on actual date instead of entry-id.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@975 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-30 16:02:43 +00:00
abijah
285c682b1e Added ability to see the customer when listing transactions
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@974 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-30 15:57:54 +00:00
abijah
e813849c86 Added ability to see the customer when listing transactions
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@974 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-30 15:57:54 +00:00
abijah
3acdec1458 Merge in from v0.2.3, a housekeeping release
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@970 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 04:38:59 +00:00
abijah
3e68839706 Merge in from v0.2.3, a housekeeping release
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@970 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 04:38:59 +00:00
abijah
e0b41ca4f7 Trivial release for housekeeping only
git-svn-id: file:///svn-source/pmgr/tags/v0.2.3@968 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 04:27:12 +00:00
abijah
780c614c78 Brought all notes to a top level directory, and got rid of the VSS database sql file. It has moved to its own repository: /svn/vss
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@967 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 04:24:38 +00:00
abijah
f49a23b2fd Brought all notes to a top level directory, and got rid of the VSS database sql file. It has moved to its own repository: /svn/vss
git-svn-id: file:///svn-source/pmgr/branches/v0.2_work@967 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 04:24:38 +00:00
abijah
1b940d2adf Merge in v0.2.2 fixes
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@966 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 04:05:00 +00:00
abijah
07461f4419 Merge in v0.2.2 fixes
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@966 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 04:05:00 +00:00
abijah
48631cffee Fixed a bug that was causing some lease charge_through_date fields to be NULL, which in turn caused additional charges to be added in error when assessing charges. The problem was that we were looking for statement entry charges that were not followed by other statement entries the next month. The intention was to locate rent charges that were not matched by a rent charge the following month, but we were looking for any type of statement entry. The presently visible problem was with a disbursement the next month on Lease #21, leaving NO last charge, not even just the wrong date. However, the issue could even be as simple as a Cleaning charge the next month, so we now filter not only for charges, but rent charges.
git-svn-id: file:///svn-source/pmgr/branches/v0.2_work@963 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 03:48:03 +00:00
abijah
69224ef661 Fixed the monthly charges report to only reflect income accounts (not things like security deposits). Also, by restricting to charges, the report was neglecting things like reversals, leaving the totals skewed. Thefore, the 'CHARGES' restriction was removed and replaced with the much more appropriate chargeDisbursementFields() function, which dumps fields that tabulate correctly.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@962 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 02:21:57 +00:00
abijah
68e6dc2d20 Fixed the monthly charges report to only reflect income accounts (not things like security deposits). Also, by restricting to charges, the report was neglecting things like reversals, leaving the totals skewed. Thefore, the 'CHARGES' restriction was removed and replaced with the much more appropriate chargeDisbursementFields() function, which dumps fields that tabulate correctly.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@962 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 02:21:57 +00:00
abijah
eea66c6932 Changed the monthly charge report to limit itself to 11 months (plus the current month), and to sort in reverse order, keeping the most relevant month at the top.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@961 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 02:02:42 +00:00
abijah
2f2a4642fb Changed the monthly charge report to limit itself to 11 months (plus the current month), and to sort in reverse order, keeping the most relevant month at the top.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@961 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 02:02:42 +00:00
abijah
df367d8316 Added a lease up report
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@960 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 01:51:32 +00:00
abijah
2602a6fa7c Added a lease up report
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@960 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 01:51:32 +00:00
abijah
9848a2919e Forgot to add the report views for the last two checkins :-/
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@959 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 01:31:05 +00:00
abijah
2489b67542 Forgot to add the report views for the last two checkins :-/
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@959 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 01:31:05 +00:00
abijah
63511709a8 Added Monthly Charges report. Also, added a new area to the menu specifically for reports.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@958 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 00:38:34 +00:00
abijah
821ffc4726 Added Monthly Charges report. Also, added a new area to the menu specifically for reports.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@958 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-12 00:38:34 +00:00
abijah
1f831551a1 Added a Unit overview action. It's a bit quick and dirty, but it's intended for admins only.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@957 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-11 23:40:47 +00:00
abijah
7770f13bf3 Added a Unit overview action. It's a bit quick and dirty, but it's intended for admins only.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@957 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-11 23:40:47 +00:00
abijah
0a594bb5a9 Merge in db changes from the v0.2.0 release
git-svn-id: file:///svn-source/pmgr/branches/v0.2_work@947 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 18:44:56 +00:00
abijah
b3d43d754b Fixed a bug with customer lease counts after editing the customer.
git-svn-id: file:///svn-source/pmgr/branches/v0.2_work@946 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 18:35:09 +00:00
abijah
a47d5d54b4 Fixed bug which was kicking us out of the dev/sandbox when editing a customer. Actually, seems like more of a workaround for a CakePHP bug, but it's not certain.
git-svn-id: file:///svn-source/pmgr/branches/v0.2_work@945 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 18:05:37 +00:00
abijah
f89ca2ab93 Renamed the work branch, since it will be used for bugfix revs as well.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work/site@944 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 18:04:47 +00:00
abijah
b6e2b781ef Renamed the work branch, since it will be used for bugfix revs as well.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@944 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 18:04:47 +00:00
abijah
8f5c3031fc Renamed the work branch, since it will be used for bugfix revs as well.
git-svn-id: file:///svn-source/pmgr/branches/v0.2_work@943 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 18:03:11 +00:00
abijah
f01e62fc6e Extra notes and scratch SQL statements added during the 0.2.0 work, but added only now.
git-svn-id: file:///svn-source/pmgr/branches/v0.3.0_work@942 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 03:37:13 +00:00
abijah
4562bc8314 Branching for 0.3.0 work
git-svn-id: file:///svn-source/pmgr/branches/v0.3.0_work/site@941 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 03:30:17 +00:00
abijah
9952673655 Branching for 0.3.0 work
git-svn-id: file:///svn-source/pmgr/branches/v0.3.0_work@941 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 03:30:17 +00:00
abijah
cf9be800e5 Merge in the v0.2.0 work
git-svn-id: file:///svn-source/pmgr/trunk/site@938 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 03:25:52 +00:00
abijah
ccd1af6154 Merge in the v0.2.0 work
git-svn-id: file:///svn-source/pmgr/trunk@938 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 03:25:52 +00:00
abijah
ce633d816a Added bookkeeping notes, apparently on 1/14/10
git-svn-id: file:///svn-source/pmgr/trunk@937 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 03:16:34 +00:00
abijah
83bfb8d32d As the database has grown, the statement entry page query has finally ground to a halt. The query was kludged as simple as possible, and it now operates much quicker. A cleaner solution would be nice...
git-svn-id: file:///svn-source/pmgr/branches/v0.2.0_work@936 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-03-02 03:10:54 +00:00
abijah
28817cea38 Removed buttons from the print media
git-svn-id: file:///svn-source/pmgr/branches/v0.2.0_work@914 97e9348a-65ac-dc4b-aefc-98561f571b83
2010-01-15 01:27:44 +00:00
abijah
3dca204ac6 Added the Deposit row to all tenders, not just those that have been deposited. This helps avoid confusion when looking at a non-deposited tender, since one may be trying to figure out whether or not it has been deposited and yet not remember if this is the appropriate screen.
git-svn-id: file:///svn-source/pmgr/branches/v0.2.0_work@900 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-12-09 18:02:00 +00:00
abijah
2fb2e6f5aa Update todo to reflect newly implemented features.
git-svn-id: file:///svn-source/pmgr/branches/v0.2.0_work@875 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-09 23:53:39 +00:00
abijah
44def81c81 Merge in from v0.1.0
git-svn-id: file:///svn-source/pmgr/branches/v0.2.0_work@874 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-09 23:51:45 +00:00
abijah
03da3afb98 More things to do based on how it's been going at VSS
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@873 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-09 23:46:18 +00:00
abijah
3b885e2686 Fixed the problem of client side lease selection breaking the automated rent invoicing tools.
git-svn-id: file:///svn-source/pmgr/branches/v0.2.0_work@872 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-09 23:17:46 +00:00
abijah
e162d35d56 Added a more automated mechanism for adding multiple rent charges to an invoice. Also included is a proration tool. This needs more work though, since it relies on server side data from the lease. Selecting a new lease on the client side will cause this change to fail, and so we'll need to add a column for charged-through. Finally, error messages for invoice and receipt were improved slightly to better explain the error.
git-svn-id: file:///svn-source/pmgr/branches/v0.2.0_work@871 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-09 22:48:37 +00:00
abijah
3b3ed7a264 Branch to add minor enhancements to v0.1.0
git-svn-id: file:///svn-source/pmgr/branches/v0.2.0_work@870 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-09 19:58:50 +00:00
cron
3b5aa78a47 property_manager database backup as of 2009_10_09_0113
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@869 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-09 08:13:46 +00:00
cron
721faa129b property_manager database backup as of 2009_10_08_0117
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@868 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-08 08:18:30 +00:00
cron
78806de606 property_manager database backup as of 2009_10_06_0124
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@867 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-06 08:24:25 +00:00
cron
d4ea5eea1f property_manager database backup as of 2009_10_03_0123
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@866 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-03 08:24:03 +00:00
cron
9213c1c21d property_manager database backup as of 2009_10_02_0905
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@865 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-02 16:06:14 +00:00
abijah
9312f8d49c Merge in from the v0.1.0 tag, which is a bit of a botch. The intention was to make the change to trunk, then re-label as v0.1.1. However, due to a mixup, this was put directly as the v0.1.0 tag. It isn't good, but the change is small enough we'll live with it this time.
git-svn-id: file:///svn-source/pmgr/trunk/site@864 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-02 15:54:00 +00:00
abijah
9674812e78 Merge in from the v0.1.0 tag, which is a bit of a botch. The intention was to make the change to trunk, then re-label as v0.1.1. However, due to a mixup, this was put directly as the v0.1.0 tag. It isn't good, but the change is small enough we'll live with it this time.
git-svn-id: file:///svn-source/pmgr/trunk@864 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-02 15:54:00 +00:00
abijah
8bda7c2cb0 Added the updateLeaseCount call to the customer update function. Most of the time it will not be necessary, but the purpose of update() is to ensure the customer info is current, so we're obligated to call it.
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@863 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-02 15:40:54 +00:00
cron
375d63485c property_manager database backup as of 2009_10_02_0116
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@862 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-02 08:16:34 +00:00
cron
26045a3db7 property_manager database backup as of 2009_10_01_0103
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@861 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-10-01 08:03:28 +00:00
cron
04ac012754 property_manager database backup as of 2009_09_29_0120
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@860 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-29 08:20:23 +00:00
cron
e6f662f0a1 property_manager database backup as of 2009_09_26_0113
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@859 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-26 08:13:58 +00:00
cron
04b3c06cda property_manager database backup as of 2009_09_25_0129
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@858 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-25 08:30:15 +00:00
cron
24da6d75b5 property_manager database backup as of 2009_09_24_0120
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@857 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-24 08:20:57 +00:00
cron
542ae17afd property_manager database backup as of 2009_09_23_0114
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@856 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-23 08:14:54 +00:00
cron
97fffaa610 property_manager database backup as of 2009_09_20_0118
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@855 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-20 08:18:46 +00:00
cron
3eb5139b62 property_manager database backup as of 2009_09_19_0125
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@854 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-19 08:26:07 +00:00
cron
5245393a04 property_manager database backup as of 2009_09_18_0104
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@853 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-18 08:04:33 +00:00
cron
e59df1dffb property_manager database backup as of 2009_09_16_0122
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@852 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-16 08:23:11 +00:00
cron
61da97974b property_manager database backup as of 2009_09_15_0112
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@851 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-15 08:12:24 +00:00
cron
6482cfd4cc property_manager database backup as of 2009_09_14_1953
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@850 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-15 02:53:36 +00:00
abijah
c3e51a7a6b Tagging first official release: v0.1.0
git-svn-id: file:///svn-source/pmgr/tags/v0.1.0@849 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-15 02:47:55 +00:00
abijah
de069ef186 Updated the todo items
git-svn-id: file:///svn-source/pmgr/trunk@848 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-15 02:42:32 +00:00
abijah
cc12d5ff93 Merge in from pre_0.1 branch
git-svn-id: file:///svn-source/pmgr/trunk/site@847 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-15 02:38:28 +00:00
abijah
5047abba6a Merge in from pre_0.1 branch
git-svn-id: file:///svn-source/pmgr/trunk@847 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-15 02:38:28 +00:00
abijah
4e8426fd79 Move the Charge Assessment link to the operations area, and updated the Transaction Destroy link to the admin menu and gave it a reasonable redirect instead of the view not found message (since it's no longer a dev function
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@846 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-15 02:32:56 +00:00
abijah
6630cdfcd6 Part of the final effort to bring the information current, ready to be live.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@845 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-15 02:30:20 +00:00
abijah
48d332f40f Part of the final effort to bring the information current, ready to be live.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@844 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-15 02:30:05 +00:00
abijah
3ede96dad9 Fixed the map titles on IE.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@843 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-14 17:03:56 +00:00
abijah
3e3dff31a8 I believe the bug Shirley has been seeing is finally fixed. The problem is that an extra comma at the end of a javascript object literal blows up in IE7. FF and IE8 both handle it fine, which is why we hadn't noticed. Hopefully, this change includes all areas which had the extra comma.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@842 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-07 17:04:34 +00:00
abijah
3642724b5e ajax logging is not working on site. The log message is now added as part of the post. However, it is added by using jQuery, so it may not work. Consequently, there is a default value to help narrow down the problem.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@841 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-07 05:30:08 +00:00
abijah
0ad68f4d6a Added util function to allow us to capture client side logging, and utilize it in the invoice view to find out why the app is not working on site. Also, since everything depends so heavily on jQuery, added an internal error if jQuery fails to load.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@840 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-06 15:32:41 +00:00
abijah
2628edfbdd Merge in single site support for both the sandbox and a development box as well.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@839 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-06 04:32:55 +00:00
abijah
740bcbedc0 Integrated sandbox functionality directly into the application so that there is no need for two independent applications for both the normal and sandbox version.
git-svn-id: file:///svn-source/pmgr/branches/single_site_sandbox_20090905@838 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-06 04:28:29 +00:00
abijah
2f3046294d Missed the transaction controller change as part of r835. Also, added check to see that customer/unit have been selected at movein.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@837 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-06 04:25:27 +00:00
abijah
7a2034aea0 D:\bin\svnbranch.pl: Branch from /branches/pre_0.1_work_20090819 to /branches/single_site_sandbox_20090905
git-svn-id: file:///svn-source/pmgr/branches/single_site_sandbox_20090905@836 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-06 04:16:52 +00:00
abijah
bb4046e1da Changes to allow invoices and receipts to work without ajax, since it may be the ajaxForm that is creating problems for Shirley on-site. Added debug prints to the invoice page as well, to get feedback on what exactly is breaking.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@835 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-05 15:15:24 +00:00
abijah
f717713842 Moved out Cathy Conway
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@834 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-03 18:20:51 +00:00
abijah
5008452089 Added separation to request logging
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@833 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-01 04:48:38 +00:00
abijah
68a1397ad6 Added request log mechanism
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@832 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-09-01 04:43:24 +00:00
abijah
ef64644536 Added move in/out selection verification before submit
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@831 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-31 15:10:45 +00:00
abijah
72ea84ad88 Modified the internal error to capture to the log.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@830 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-31 14:43:03 +00:00
abijah
0f3aa42f57 Last tweak for now to size reduction.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@829 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-30 15:28:13 +00:00
abijah
fb23b7ffaa Another minor tweak, so the formatter functions don't fall directly into the first grid area (but just above).
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@828 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-30 15:23:12 +00:00
abijah
b731ee6165 Reduced the amount of data sent to the client.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@827 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-30 15:19:39 +00:00
abijah
34dcbd8b43 Made all grids the same width, which is much more pleasing than when they were variable. This width is a bit too large for 800x600, but has been tested at 1024x768 with no problem. It works great on the Acer netbook.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@826 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-29 21:29:23 +00:00
abijah
87a2ea5cd6 Decided the Creation menu isn't worth it at the moment, and moved New Deposit back into the Actions menu. Removed Add Customer, since this can and probably will happen directly from the Move-In page. Created an entirely separate Sandbox menu area, since it is of particular interest to the customer.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@825 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-29 20:59:29 +00:00
abijah
6492cd8b22 Removed the Add Deposit link from the actions menu. It is easy to find after Navigating to Deposits.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@824 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-29 20:46:33 +00:00
abijah
f6a18cbb6c Thought margin would be picked up from the previous ui-jqgrid-title rules, but apparently not.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@823 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-29 20:31:44 +00:00
abijah
7198d7e6f4 Changes to have the software function without the presence of jquery-ui (which may not be complete). Also, brought the jquery libraries to the server, instead of using them as hosted from google. Some browser configurations may have an issue with what they deem to be cross site scripting.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@822 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-29 20:27:12 +00:00
abijah
d79077e279 Removed the debug prints, and got back to the original r5 of hoverintent, except for my change to handle mouseenter and mouseleave
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@821 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-29 18:43:48 +00:00
abijah
cea9332ac6 Using version r5 of hoverIntent. It doesn't work as an event like the original code did, so I had to doctor it up a bit. It works OK with firefox, but not with IE. I have a possible patch to apply after I check this in.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@820 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-29 18:14:18 +00:00
abijah
bf8aaea041 Modified the dump function, and fixed several places that needed to declare variables using var. Changed the pmgr.jquery.js file to jquery.hoverIntent.js. Fixed a bug causing no ordered lists, since padding and margin were set to 0 for all elements.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@819 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-29 17:24:06 +00:00
abijah
63704682fa Keeping actions for now
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@818 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 22:19:07 +00:00
abijah
63de5641a0 Temporary fix for last minute bug
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@817 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 22:11:18 +00:00
abijah
5f6a9ed53f Fixed the http/https problem
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@816 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 21:44:39 +00:00
abijah
328d0f8f51 Modified the rebuild_sandbox action to redirect instead of dumping debug output.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@815 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 21:38:23 +00:00
abijah
aee6832374 Fixed the sandbox/unsandbox URLs. I'd like to make this a route... I'll look into it.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@814 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 21:22:50 +00:00
abijah
63e22ec9bf Added more sandbox functionality, including a script to generate the sandbox on the fly from the absolute latest data.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@813 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 21:06:20 +00:00
abijah
fde8923814 Added a utility controller, for calling actions that really aren't related to any other controller (we've been using accounts up to this point).
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@809 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 20:46:10 +00:00
abijah
696017a82a Fixed cut/paste bug
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@808 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 20:45:11 +00:00
abijah
7bcee943a5 Theme work, and a sandbox function for a consistent point to check whether we're sandboxed or not.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@807 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 19:57:30 +00:00
abijah
0c9b945f7b Added pre-submit data verification for invoice and receipt. The checking is pretty thin, but it's a start. I don't want to do more, as I'm sure there are lots of data validation tools out there and would prefer to go that route.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@806 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 18:22:13 +00:00
abijah
5b5707df5e Fixed a bug with deposit, which prevented update to the deposited tenders. Added INTERNAL_ERROR when an error occurs. Since the module and callers make no effort to roll back changes when an error occurs, it's probably best to just halt. We may need to remove some of these checks, especially in the verifyTransaction function, which is intended to catch errors before they create a problem in the database.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@805 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 16:41:17 +00:00
abijah
c21cdcd9a2 Added server request vars, mostly to include the referer. Added timestamps and tweaked formatting slightly.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@804 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 16:34:01 +00:00
abijah
a79adbce2d Moved the creation actions into the CONTROLLER menu. Minor cleanup of deposit_slip. Minor tweaking to views.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@803 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 16:32:21 +00:00
abijah
a3b376544c Replaced the hardcoded 'level' checks, and incorporated (as a first pass) the new permission mechanism
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@802 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 07:11:14 +00:00
abijah
43c957baa2 Added users and groups and a couple basic options (dev & admin) for testing. Since dev/admin is now a database option, the special routing mechanism has been removed.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@801 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 04:47:33 +00:00
abijah
a66024c889 Fixed the build script; updated users schema to no longer hold password information and to not require contact information; added a set of users and groups for VSS
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@800 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 04:25:53 +00:00
abijah
aed090fbe2 Added rollup sql code to bring the current database up to speed with the option / permission changes.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@799 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 04:03:19 +00:00
abijah
7904372dff Added support for permissions. Next is to implement some.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@798 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 03:32:07 +00:00
abijah
1d4dcbd2b0 Made changes to the database and added models to support options. Next is permissions
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@797 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-28 01:42:29 +00:00
abijah
f5f09421c1 Changed submenu ordering
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@795 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-27 17:27:07 +00:00
abijah
4d525f6ac9 Moved the list of account types into the admin area
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@793 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-26 20:21:59 +00:00
abijah
0b773cfc35 Removed the Balance column from vacant and unavailable grids, since they should always be zero.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@792 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-26 20:16:11 +00:00
abijah
387e08da06 Changed the default sort order for Transaction to be DESC, like with StatementEntry and LedgerEntry
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@791 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-26 20:15:28 +00:00
abijah
5ef877f64b Removed the legacy (and unused) field current_lease_id from the units table
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@790 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-26 20:08:19 +00:00
abijah
c889e4f4e1 Changed the default Leases view to be current leases instead of all
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@789 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-26 20:04:39 +00:00
abijah
b938b5f028 The previous checkin was _supposed_ to be just the jqGrid.ctp file, but an accidental keystroke checked in the work that was intended for this checkin. This would have been the addition of unit counts, as well as occupancy and vacancy, to the unit_sizes grid. Since that has already been checked in, this is just the cleanup.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@788 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-26 19:58:46 +00:00
abijah
1e34cc1de8 Added a percentage formatting type to jqGrid.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@787 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-26 19:51:06 +00:00
abijah
80fe5ca4de Added changes to allow for being hosted on a secure server, as well as a sandboxed version.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@786 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-26 18:55:41 +00:00
abijah
fbd716634a Added password protection for any access other than localhost or local subnet. I'll remove the domain checks at some point, as we always want an authenticated user for at least determining user settings, if nothing else.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@785 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-26 18:18:31 +00:00
abijah
046cf5fe63 Added the ability to list unit sizes appropriate for a specific need. Since some of the code was taken from Account, I tidied up that model just a bit as well.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@784 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 17:07:28 +00:00
abijah
2fd2dc603c Modified the unit types to have boolean flags to indicate their properties
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@783 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 16:26:28 +00:00
abijah
439e9a3de6 Implemented the UnitSize controller and view. I would like to add controller navigation links for 1bd, 2bd, 3bd, and so on. Also, we need to make the number of available units part of the grid. It will require breaking a separate CountTables function, since we'll need to join with Units, but it shouldn't be a big deal. Whether or not we include occupancy percentage, or leave that to a report is undecided.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@782 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 15:56:42 +00:00
abijah
caee1c90a1 Removed the unecessary code, now that it has been checked in.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@781 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 06:26:53 +00:00
abijah
08486fc101 Work to try and ensure that the most useful menu is shown by default on each page.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@780 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 06:25:37 +00:00
abijah
0758865aae Changed to ensure that the grid view menu items do not show up at all, unless the user is an admin
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@779 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 06:24:27 +00:00
abijah
85b189a50e Updated status of a few units.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@778 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 06:18:27 +00:00
abijah
3ff5967415 Moved all controllers to the new addGridViewSideMenuLinks virtual function.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@777 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 02:37:01 +00:00
abijah
b2a85a5197 Added lock/unlock links directly on the unit page. Also, found the grid view links seem to be needed even when not already navigating a grid. Without them, the user must go first through the top level navigation link, then to the specific grid subset. It's a bit painful, and so I decided to add them back in. To facilitate this, instead of repeatedly changing each controller whenever we change our minds, I added a new virtual function to that app. I'll change the remaining controllers on the next checkin.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@776 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 02:29:29 +00:00
abijah
f8cdea8872 Renamed the Operations menu area to Actions
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@775 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 01:26:52 +00:00
abijah
c3ad1b0ea1 Fixed problems with the sizing of the sidemenu, as well as the animation problem (an issue caused by the lack of clear parent container sizing, since the parent was just a table cell). This is actually much cleaner, allowing us to ignore #sidecolumn in the sidemenu.css file, and simplifies jQuery accordion work as well (thus no jitter). Added a mechanism to dump javascript in a consistent place, when generated from elements included by the layout (namely, our sidemenu element). Finally, added a new event called hoverintent, since the mouseover feature works very poorly with the accordion module when animation is in use.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@774 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 01:24:23 +00:00
abijah
56bec8d05c Fixed a problem where the operations menu was showing up at inappropriate times (a problem we already solved, but accidentally left commented out on an earlier checkin). Also, since the sitemap is a top level operation that is not based on gridView, enabled the site operations menu explicitly from within the maps controller.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@773 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 01:18:53 +00:00
abijah
b89750a4ef Moved Edit as the final menu item of each set, when present.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@772 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 01:14:34 +00:00
abijah
20309fba39 Modified move_out to present a grid of leases, so the user can make a selection just as with move-in, invoices, receipts, etc.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@771 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 01:09:47 +00:00
abijah
241028603b Changed the default grid size for ledger_entries
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@770 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-25 01:06:57 +00:00
abijah
8663c25806 Added some lease operations to the customer menu. If there is only one current lease, this works great, and if there are multiple, it works as if it were performed from the top level, ignoring the fact that the user clicked the operation from the customer page.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@769 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 21:49:40 +00:00
abijah
03d947a069 Added top level operations into the sidemenu
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@768 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 21:48:09 +00:00
abijah
294aabbb29 Removed the lease/customer link from invoice/receipt
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@767 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 20:25:09 +00:00
abijah
94188e3f92 Fixed bug caused by removal of the ID column from the grid.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@766 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 20:12:20 +00:00
abijah
c261735197 Added automated disabling of admin and development menu items (at least the ones that are explicitly added to those sections of the menu).
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@765 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 20:03:05 +00:00
abijah
63c95da9f3 Changed the cookie name from the default of CAKEPHP.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@764 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 19:38:30 +00:00
abijah
ae1dccfb14 Updated help messages to reflect the requirements around first/last/company_name and display_name. Actually, the messages don't make any mention of company_name, but it can be used for display_name as well.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@763 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 19:37:19 +00:00
abijah
9bc699bf51 Modified contact grids to use display_name, and the contact model to take company name into account if no other fields will work for display name.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@762 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 19:17:55 +00:00
abijah
7a1aa536fa Modified display_name to be required, and gave a display name to a couple anonymous contacts.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@761 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 18:49:15 +00:00
abijah
de9a4acd5d Added ability to create a new customer directly from the move in operation.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@760 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 18:44:30 +00:00
abijah
bd4610abb3 Added unit area to the grid display; removed the hyperlink to unit size (which is not yet implemented), and added an overlocked report.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@759 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 08:20:28 +00:00
abijah
60ec105fca Removed old experimental code
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@758 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 08:01:00 +00:00
abijah
67a0c07bc6 Marked off some completed todo items.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@757 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 07:57:37 +00:00
abijah
fc332bef0e Changed wording slightly to fit on one line.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@756 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 07:44:03 +00:00
abijah
92668bcca1 Removed all the test data for Abijah as a contact.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@755 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 07:43:36 +00:00
abijah
73eeba04fe As with last checkin for customer, we now have special coloration for required fields, as well as blank required fields.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@754 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-24 06:53:51 +00:00
abijah
a1bab966ed Added descriptive text to the customer entry page, as well as work to associate labels with the inputs and set their class dynamically, to flag missing required fields.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@753 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 23:12:04 +00:00
abijah
ee9ff354b2 Added functionality to pre-activate a specific area/subarea of the menu.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@752 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 20:23:44 +00:00
abijah
a9410b1351 Moved 'New Deposit' to the correct menu section
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@751 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 20:23:13 +00:00
abijah
5ad28c809b Fixed the relationship field for customer and contact grids.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@750 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 19:23:49 +00:00
abijah
89d7f22e4a Small tweak to prevent the render error when looking at a debug grid query.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@749 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 19:23:12 +00:00
abijah
11be0ff9cb Modified the menu to use the accordion widget, which is slick and allows it to match the current theme.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@745 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 18:30:17 +00:00
abijah
65c3f28484 Removed the sitelink script, which is of no use since the database now contains additional data. Modified the build script to rebuild the database from the last saved data set.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@743 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 14:39:15 +00:00
abijah
4e1ffd14b4 Fixed the links and sorting for the contacts grid
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@741 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 04:16:43 +00:00
abijah
2d3b962fe1 Removing, or at least phasing out the ledger name field. Account name is always needed and nearby, so ledger name is just confusing.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@740 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 01:08:30 +00:00
abijah
1d921358a8 Changed statement/ledger entries to defaultly sort by date in descending order. For small lists, ascending order is more logical, but for larger lists, this buries the most relevant items at the very back.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@739 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 01:02:28 +00:00
abijah
9a819c72a8 Tidied up where we show transaction ids vs. statement/ledger entry ids
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@738 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 00:54:22 +00:00
abijah
24e208bf17 More cleanup to hide ID from the user except where ID is intended to be the externally visible identification method (like transactions and ledger/statement entries).
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@737 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 00:38:18 +00:00
abijah
86b0c14eda Eliminated the ID field from the grids, wherever feasible.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@736 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 00:16:04 +00:00
abijah
da88975fed More work on tidying up the menu items for usability.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@735 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-23 00:02:53 +00:00
abijah
f545502162 Changed how sidemenu links work, so that order of execution doesn't have to control ordering of the list.
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@734 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-22 22:47:41 +00:00
abijah
513182a6d5 Trunk is now very close to our initial v0.1 offering. Branching to add some final changes before releasing
git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@733 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-20 04:08:06 +00:00
abijah
7b3707ef89 Pseudo merge-in, which is a wholesale copy from the branch directly to trunk. This is fine since trunk has always been empty up to this point.
git-svn-id: file:///svn-source/pmgr/trunk/site@732 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 21:09:19 +00:00
abijah
7b76fd8f0a Pseudo merge-in, which is a wholesale copy from the branch directly to trunk. This is fine since trunk has always been empty up to this point.
git-svn-id: file:///svn-source/pmgr/trunk@732 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 21:09:19 +00:00
abijah
63bb788fdf Apparently these directories were not branched, just created separately on trunk and branch. trunk was entirely empty anyway, so its no problem to just obliterate these.
git-svn-id: file:///svn-source/pmgr/trunk@730 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:56:52 +00:00
abijah
d8760cf2b6 Updated property_manager.sql with property_manager_2009_08_19_1330.sql
Created:  Wed Aug 19 13:43:16 2009
	Modified: Wed Aug 19 13:30:11 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@729 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:54 +00:00
abijah
feb15cac49 Updated property_manager.sql with property_manager_2009_08_19_1326.sql
Created:  Wed Aug 19 13:43:16 2009
	Modified: Wed Aug 19 13:26:45 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@728 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:51 +00:00
abijah
40047d89d8 Updated property_manager.sql with property_manager_2009_08_19_1253.sql
Created:  Wed Aug 19 13:43:16 2009
	Modified: Wed Aug 19 12:53:49 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@727 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:48 +00:00
abijah
94cc553723 Updated property_manager.sql with property_manager_2009_08_19_1250.sql
Created:  Wed Aug 19 13:43:16 2009
	Modified: Wed Aug 19 12:50:23 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@726 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:45 +00:00
abijah
166a4f44d9 Updated property_manager.sql with property_manager_2009_08_19_1232_removed_orphaned_double_entries.sql
Created:  Wed Aug 19 13:43:16 2009
	Modified: Wed Aug 19 12:32:25 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@725 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:42 +00:00
abijah
633a019fc5 Updated property_manager.sql with property_manager_2009_08_18_0037_most_stable_as_of_200908180943.needs_check_fix.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Tue Aug 18 00:37:50 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@724 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:39 +00:00
abijah
bddcca8d9e Updated property_manager.sql with property_manager_2009_08_17_2245.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 22:45:57 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@723 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:36 +00:00
abijah
6e6f7f4f43 Updated property_manager.sql with property_manager_2009_08_17_2229.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 22:29:09 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@722 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:33 +00:00
abijah
64ce95e404 Updated property_manager.sql with property_manager_2009_08_17_2220.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 22:20:46 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@721 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:30 +00:00
abijah
55bcdca935 Updated property_manager.sql with property_manager_2009_08_17_2200.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 22:00:22 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@720 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:27 +00:00
abijah
6f035c2052 Updated property_manager.sql with property_manager_2009_08_17_2152.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 21:52:25 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@719 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:23 +00:00
abijah
538c8077d2 Updated property_manager.sql with property_manager_2009_08_17_2131.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 21:31:55 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@718 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:20 +00:00
abijah
e37e40f355 Updated property_manager.sql with property_manager_2009_08_17_2100.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 21:00:55 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@717 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:17 +00:00
abijah
9fca2e7d4f Updated property_manager.sql with property_manager_2009_08_17_2042.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 20:42:08 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@716 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:14 +00:00
abijah
5c7df5f2eb Updated property_manager.sql with property_manager_2009_08_17_2036.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 20:36:42 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@715 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:11 +00:00
abijah
e0e7fcfc51 Updated property_manager.sql with property_manager_2009_08_17_1921.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 19:21:47 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@714 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:08 +00:00
abijah
8ce654d22d Updated property_manager.sql with property_manager_2009_08_17_1917.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 19:17:59 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@713 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:05 +00:00
abijah
6cd45236d9 Updated property_manager.sql with property_manager_2009_08_17_1847.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 18:47:43 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@712 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:49:02 +00:00
abijah
009503bf7b Updated property_manager.sql with property_manager_2009_08_17_1844.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 18:44:58 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@711 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:59 +00:00
abijah
4f652eb9a1 Updated property_manager.sql with property_manager_2009_08_17_1815.sql
Created:  Wed Aug 19 13:43:07 2009
	Modified: Mon Aug 17 18:15:21 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@710 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:56 +00:00
abijah
0b9061794e Updated property_manager.sql with property_manager_2009_08_17_1648.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 16:48:02 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@709 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:53 +00:00
abijah
1055a00476 Updated property_manager.sql with property_manager_2009_08_17_1646_auto_deposit_ach.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 16:46:13 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@708 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:50 +00:00
abijah
4f758b5480 Updated property_manager.sql with property_manager_2009_08_17_1536_deposit_ledger_entry_id.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 15:36:28 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@707 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:47 +00:00
abijah
ec2ea2a60e Updated property_manager.sql with property_manager_2009_08_17_1320_tender_type_update.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 13:20:56 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@706 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:44 +00:00
abijah
196a7ae6e6 Updated property_manager.sql with property_manager_2009_08_17_0954.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 09:54:04 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@705 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:41 +00:00
abijah
24ad1ef49c Updated property_manager.sql with property_manager_2009_08_17_0229.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 02:29:46 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@704 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:38 +00:00
abijah
019b59fdbc Updated property_manager.sql with property_manager_2009_08_17_0146.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 01:46:46 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@703 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:35 +00:00
abijah
8892583db4 Updated property_manager.sql with property_manager_2009_08_17_0141.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 01:41:10 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@702 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:31 +00:00
abijah
ab840075c2 Updated property_manager.sql with property_manager_2009_08_17_0133.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 01:33:39 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@701 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:28 +00:00
abijah
10fe7bf230 Updated property_manager.sql with property_manager_2009_08_17_0131.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 01:31:32 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@700 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:25 +00:00
abijah
5bcd424055 Updated property_manager.sql with property_manager_2009_08_17_0124.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 01:24:03 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@699 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:22 +00:00
abijah
7cb0381060 Updated property_manager.sql with property_manager_2009_08_17_0117.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 01:17:59 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@698 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:19 +00:00
abijah
935920a38a Updated property_manager.sql with property_manager_2009_08_17_0108.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 01:08:27 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@697 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:16 +00:00
abijah
df3bbb698e Updated property_manager.sql with property_manager_2009_08_17_0106.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 01:06:16 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@696 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:13 +00:00
abijah
a2c1779454 Updated property_manager.sql with property_manager_2009_08_17_0023.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 00:23:12 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@695 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:10 +00:00
abijah
7a50d02a44 Updated property_manager.sql with property_manager_2009_08_17_0022.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Mon Aug 17 00:22:31 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@694 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:07 +00:00
abijah
22edc5a524 Updated property_manager.sql with property_manager_2009_08_16_2357.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 23:57:42 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@693 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:04 +00:00
abijah
bc33f3cb2c Updated property_manager.sql with property_manager_2009_08_16_2351.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 23:51:53 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@692 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:48:01 +00:00
abijah
e3a606ebf0 Updated property_manager.sql with property_manager_2009_08_16_2349.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 23:49:52 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@691 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:58 +00:00
abijah
8e91eadf53 Updated property_manager.sql with property_manager_2009_08_16_2325.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 23:25:27 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@690 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:55 +00:00
abijah
7e665af8be Updated property_manager.sql with property_manager_2009_08_16_2316.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 23:16:28 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@689 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:51 +00:00
abijah
2727812144 Updated property_manager.sql with property_manager_2009_08_16_2256.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 22:56:34 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@688 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:48 +00:00
abijah
dd7135df49 Updated property_manager.sql with property_manager_2009_08_16_2155_harmon_moveout_and_credit.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 21:55:45 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@687 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:45 +00:00
abijah
0297266a34 Updated property_manager.sql with property_manager_2009_08_16_2126_hawk_reversal_and_moveout.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 21:26:59 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@686 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:42 +00:00
abijah
3b1e06bade Updated property_manager.sql with property_manager_2009_08_16_2057.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 20:57:52 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@685 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:39 +00:00
abijah
ce54ed2341 Updated property_manager.sql with property_manager_2009_08_16_2050.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 20:50:10 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@684 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:36 +00:00
abijah
b4097850dd Updated property_manager.sql with property_manager_2009_08_16_2023_small-movein-date-fix.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 20:23:24 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@683 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:33 +00:00
abijah
ac23a1be18 Updated property_manager.sql with property_manager_2009_08_16_2015.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 20:15:27 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@682 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:30 +00:00
abijah
88d468d20c Updated property_manager.sql with property_manager_2009_08_16_2009.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 20:09:42 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@681 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:27 +00:00
abijah
bb9ce64657 Updated property_manager.sql with property_manager_2009_08_16_1820_brandner_credit_note.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 18:20:31 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@680 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:24 +00:00
abijah
77a01a16c4 Updated property_manager.sql with property_manager_2009_08_16_1811.sql
Created:  Wed Aug 19 13:42:58 2009
	Modified: Sun Aug 16 18:11:31 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@679 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:21 +00:00
abijah
d26b6e99bd Updated property_manager.sql with property_manager_2009_08_15_0945_refund.sql
Created:  Wed Aug 19 13:42:21 2009
	Modified: Sat Aug 15 09:45:41 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@678 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:18 +00:00
abijah
3096759738 Updated property_manager.sql with property_manager_2009_08_14_2223_datefix.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Fri Aug 14 22:23:05 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@677 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:15 +00:00
abijah
011481be2d Updated property_manager.sql with property_manager_2009_08_14_2221_brandner_restart.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Fri Aug 14 22:21:16 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@676 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:12 +00:00
abijah
21e11298eb Updated property_manager.sql with property_manager_2009_08_14_2200_brandner_pre-move.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Fri Aug 14 22:00:24 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@675 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:09 +00:00
abijah
8b93f6ad91 Updated property_manager.sql with property_manager_2009_08_14_2154_brander_fix.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Fri Aug 14 21:56:59 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@674 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:06 +00:00
abijah
9b9c6d8f29 Updated property_manager.sql with property_manager_2009_08_14_2153.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Fri Aug 14 21:53:01 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@673 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:03 +00:00
abijah
44cda10211 Updated property_manager.sql with property_manager_2009_08_14_2145_brander_fix.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Fri Aug 14 21:47:50 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@672 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:47:00 +00:00
abijah
0a62c8a816 Updated property_manager.sql with property_manager_2009_08_14_2140.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Fri Aug 14 21:40:23 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@671 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:57 +00:00
abijah
c23d4c6209 Updated property_manager.sql with property_manager_2009_08_14_2125.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Fri Aug 14 21:25:29 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@670 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:53 +00:00
abijah
9923ccc6c3 Updated property_manager.sql with property_manager_2009_08_14_2122.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Fri Aug 14 21:22:50 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@669 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:50 +00:00
abijah
c4d4c3c989 Updated property_manager.sql with property_manager_2009_08_13_1526.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Thu Aug 13 15:26:32 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@668 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:47 +00:00
abijah
b94c8e56b4 Updated property_manager.sql with property_manager_2009_08_12_1702.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 17:02:49 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@667 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:44 +00:00
abijah
bde335f68c Updated property_manager.sql with property_manager_2009_08_12_1648.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 16:48:04 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@666 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:41 +00:00
abijah
515046efd6 Updated property_manager.sql with property_manager_2009_08_12_0555.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 05:55:27 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@665 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:38 +00:00
abijah
8c334f236d Updated property_manager.sql with property_manager_2009_08_12_0534.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 05:34:42 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@664 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:35 +00:00
abijah
18848db6b1 Updated property_manager.sql with property_manager_2009_08_12_0513.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 05:13:57 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@663 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:32 +00:00
abijah
e4d20cc849 Updated property_manager.sql with property_manager_2009_08_12_0509.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 05:09:47 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@662 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:29 +00:00
abijah
355af40ed5 Updated property_manager.sql with property_manager_2009_08_12_0456.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 04:56:51 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@661 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:26 +00:00
abijah
9f1a6b8087 Updated property_manager.sql with property_manager_2009_08_12_0441.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 04:41:30 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@660 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:23 +00:00
abijah
77de94df54 Updated property_manager.sql with property_manager_2009_08_12_0414.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 04:14:51 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@659 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:20 +00:00
abijah
00a306355a Updated property_manager.sql with property_manager_2009_08_12_0408.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 04:08:30 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@658 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:17 +00:00
abijah
f7c2493f99 Updated property_manager.sql with property_manager_2009_08_12_0405.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 04:05:08 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@657 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:14 +00:00
abijah
2bc2fb951b Updated property_manager.sql with property_manager_2009_08_12_0347.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 03:47:04 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@656 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:11 +00:00
abijah
cc86bb99c1 Updated property_manager.sql with property_manager_2009_08_12_0340.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 03:40:58 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@655 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:08 +00:00
abijah
eebb7c7c94 Updated property_manager.sql with property_manager_2009_08_12_0309.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 03:09:33 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@654 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:05 +00:00
abijah
88a1a62087 Updated property_manager.sql with property_manager_2009_08_12_0246.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 02:46:26 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@653 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:46:02 +00:00
abijah
29c157475b Updated property_manager.sql with property_manager_2009_08_12_0220.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 02:20:16 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@652 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:59 +00:00
abijah
237e744002 Updated property_manager.sql with property_manager_2009_08_12_0157.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 01:57:49 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@651 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:56 +00:00
abijah
6c38b08700 Updated property_manager.sql with property_manager_2009_08_12_0029.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 00:29:39 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@650 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:52 +00:00
abijah
29bb08adca Updated property_manager.sql with property_manager_2009_08_12_0009.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Wed Aug 12 00:09:20 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@649 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:49 +00:00
abijah
ca69698693 Updated property_manager.sql with property_manager_2009_08_11_2337.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Tue Aug 11 23:37:48 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@648 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:46 +00:00
abijah
9274bb9b0c Updated property_manager.sql with property_manager_2009_08_11_2127.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Tue Aug 11 21:27:09 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@647 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:43 +00:00
abijah
32ea8734e1 Updated property_manager.sql with property_manager_2009_08_11_1644.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Tue Aug 11 16:44:30 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@646 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:40 +00:00
abijah
5bb240708f Updated property_manager.sql with property_manager_2009_08_11_1634.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Tue Aug 11 16:34:10 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@645 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:37 +00:00
abijah
3e366d3dad Updated property_manager.sql with property_manager_2009_08_11_1625.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Tue Aug 11 16:25:27 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@644 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:34 +00:00
abijah
0de2931f66 Updated property_manager.sql with property_manager_2009_08_11_1557.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Tue Aug 11 15:57:23 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@643 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:31 +00:00
abijah
966dc495e2 Updated property_manager.sql with property_manager_2009_08_11_1548.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Tue Aug 11 15:48:12 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@642 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:28 +00:00
abijah
df869ef70a Updated property_manager.sql with property_manager_2009_08_11_1541.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Tue Aug 11 15:41:30 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@641 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:25 +00:00
abijah
8dcf5956fe Updated property_manager.sql with property_manager_2009_08_11_1528.sql
Created:  Wed Aug 19 13:42:23 2009
	Modified: Tue Aug 11 15:28:37 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@640 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:22 +00:00
abijah
654e79803f Updated property_manager.sql with property_manager_2009_08_11_1518.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 15:18:42 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@639 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:19 +00:00
abijah
dcbff5a956 Updated property_manager.sql with property_manager_2009_08_11_1503.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 15:04:00 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@638 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:16 +00:00
abijah
b1fb5e29db Updated property_manager.sql with property_manager_2009_08_11_1459.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 14:59:38 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@637 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:13 +00:00
abijah
a6c3b612ba Updated property_manager.sql with property_manager_2009_08_11_1456.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 14:56:54 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@636 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:09 +00:00
abijah
ee9ae2079c Updated property_manager.sql with property_manager_2009_08_11_1400.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 14:00:14 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@635 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:06 +00:00
abijah
58495d5607 Updated property_manager.sql with property_manager_2009_08_11_1341.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 13:41:07 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@634 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:03 +00:00
abijah
ebcc494e36 Updated property_manager.sql with property_manager_2009_08_11_1336.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 13:36:50 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@633 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:45:00 +00:00
abijah
835853c51c Updated property_manager.sql with property_manager_2009_08_11_1304.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 13:04:49 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@632 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:44:57 +00:00
abijah
622eca3f1a Updated property_manager.sql with property_manager_2009_08_11_1302.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 13:02:09 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@631 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:44:54 +00:00
abijah
65b132ac8e Updated property_manager.sql with property_manager_2009_08_11_1250.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 12:50:46 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@630 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:44:51 +00:00
abijah
410e588e97 Updated property_manager.sql with property_manager_2009_08_11_1244.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 12:44:27 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@629 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:44:48 +00:00
abijah
9aba878ee6 Updated property_manager.sql with property_manager_2009_08_11_1216.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 12:16:56 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@628 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:44:44 +00:00
abijah
bd90424080 Updated property_manager.sql with property_manager_2009_08_11_1203.sql
Created:  Wed Aug 19 13:42:22 2009
	Modified: Tue Aug 11 12:03:51 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@627 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:44:41 +00:00
abijah
a939b0839b Updated property_manager.sql with property_manager_2009_08_11_1154.sql
Created:  Wed Aug 19 13:42:21 2009
	Modified: Tue Aug 11 11:54:28 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@626 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:44:38 +00:00
abijah
2d8c536f33 Updated property_manager.sql with property_manager_2009_08_11_1153.sql
Created:  Wed Aug 19 13:42:21 2009
	Modified: Tue Aug 11 11:53:39 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@625 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:44:35 +00:00
abijah
2d51340a56 Updated property_manager.sql with property_manager_2009_08_11_1145.sql
Created:  Wed Aug 19 13:38:12 2009
	Modified: Tue Aug 11 11:45:48 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@624 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:39:56 +00:00
abijah
98c4a66f2f Updated property_manager.sql with property_manager_2009_08_11_1138.sql
Created:  Wed Aug 19 13:38:12 2009
	Modified: Tue Aug 11 11:38:29 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@623 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:39:52 +00:00
abijah
29b829d3af Updated property_manager.sql with property_manager_2009_08_11_1127.sql
Created:  Wed Aug 19 13:38:12 2009
	Modified: Tue Aug 11 11:27:31 2009


git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@622 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:39:48 +00:00
abijah
d0aa3799fa Added some more development sql commands.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@621 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-19 20:33:39 +00:00
abijah
4d615d8028 More cleanup of lingering jqgrid remnants
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@620 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 15:48:59 +00:00
abijah
5e78d32ec4 More cleanup of lingering jqgrid remnants
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@620 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 15:48:59 +00:00
abijah
04dc17409e Upgraded to jqGrid 3.5.2, which has a couple bugfixes. Fixed a bug in our code preventing the grid query from being shown when in development mode.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@619 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 15:33:45 +00:00
abijah
a76421c858 Upgraded to jqGrid 3.5.2, which has a couple bugfixes. Fixed a bug in our code preventing the grid query from being shown when in development mode.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@619 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 15:33:45 +00:00
abijah
eb39495fa4 Removed the development function for fixing the ACH deposit items.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@618 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 07:17:21 +00:00
abijah
28086651e5 Removed the development function for fixing the ACH deposit items.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@618 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 07:17:21 +00:00
abijah
da80c3623e Added another todo item
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@617 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 07:16:04 +00:00
abijah
2a28adaca7 Added tooltips to the sitemap. At some point, we hope to incorporate a jquery plugin for nicer presentation, but this gets the basics.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@616 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 06:41:49 +00:00
abijah
309512dde0 Added tooltips to the sitemap. At some point, we hope to incorporate a jquery plugin for nicer presentation, but this gets the basics.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@616 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 06:41:49 +00:00
abijah
2866145e66 disabled logging when assessing late charges
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@615 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 04:00:17 +00:00
abijah
8b1d3c9830 disabled logging when assessing late charges
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@615 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 04:00:17 +00:00
abijah
7049542e59 Modified the grid such that the account is right next to the dollar amount. It was too distracting for the eyes to have to span columns putting charges and amounts together.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@614 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 03:59:51 +00:00
abijah
31265104e1 Modified the grid such that the account is right next to the dollar amount. It was too distracting for the eyes to have to span columns putting charges and amounts together.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@614 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 03:59:51 +00:00
abijah
3488774481 Fixed special routing to support a top level url.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@613 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 03:58:24 +00:00
abijah
c719d11df2 Fixed special routing to support a top level url.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@613 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 03:58:24 +00:00
abijah
480170b944 Fixed bug in the age() function that was preventing the ' ago' text. Of course, there are places it may not be desired, so I added a param to control the suffix.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@612 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 01:33:38 +00:00
abijah
e6d65a5212 Fixed bug in the age() function that was preventing the ' ago' text. Of course, there are places it may not be desired, so I added a param to control the suffix.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@612 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 01:33:38 +00:00
abijah
3a86a0f689 Added comment field back in (not sure when/why/how it went missing).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@611 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 01:32:28 +00:00
abijah
e21233954a Added comment field back in (not sure when/why/how it went missing).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@611 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 01:32:28 +00:00
abijah
4ca6c8bf6c Disabled logging again
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@610 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 01:32:09 +00:00
abijah
d36cfd9653 Disabled logging again
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@610 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-18 01:32:09 +00:00
abijah
2b8fa33f06 Added a column to Tender that identifies the exact ledger entry which was used to deposit the tender. It was necessary due to the kludgy way that I've set ACH items to auto-deposit, which uses a ledger entry that has nothing to do with the transaction account. This would probably allow us to eliminate the deposit_transaction_id, but I'd like to break as little as possible at the moment. I'll come back and clean this up in the future. Also, fixed a stupid bug that was causing major database thrash whenever a transaction was entered without a customer id. I could have fixed the Customer::update() function, but it was designed to accept null so that we could update all the customers, something definitely useful while developing.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@609 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 23:55:51 +00:00
abijah
d141f61055 Added a column to Tender that identifies the exact ledger entry which was used to deposit the tender. It was necessary due to the kludgy way that I've set ACH items to auto-deposit, which uses a ledger entry that has nothing to do with the transaction account. This would probably allow us to eliminate the deposit_transaction_id, but I'd like to break as little as possible at the moment. I'll come back and clean this up in the future. Also, fixed a stupid bug that was causing major database thrash whenever a transaction was entered without a customer id. I could have fixed the Customer::update() function, but it was designed to accept null so that we could update all the customers, something definitely useful while developing.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@609 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 23:55:51 +00:00
abijah
8167cc6a6a Added an assert whenever we lookup an account that doesn't exist.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@608 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 23:51:09 +00:00
abijah
4b8dc3da02 Added an assert whenever we lookup an account that doesn't exist.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@608 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 23:51:09 +00:00
abijah
1c82d55c1c First pass at making ACH items auto-deposit. Things are really set up for a separate deposit transaction though, and I should just bite the bullet and do that instead. I don't want them to show up as Deposits though, but perhaps it would be easiest just to make a new type 'AUTO_DEPOSIT' or something.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@607 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 21:16:16 +00:00
abijah
709689b15b First pass at making ACH items auto-deposit. Things are really set up for a separate deposit transaction though, and I should just bite the bullet and do that instead. I don't want them to show up as Deposits though, but perhaps it would be easiest just to make a new type 'AUTO_DEPOSIT' or something.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@607 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 21:16:16 +00:00
abijah
ff37597b81 Added a grid load error indication, since it was lost when we disabled the debug output.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@606 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 18:41:17 +00:00
abijah
3eb989e03c Added a grid load error indication, since it was lost when we disabled the debug output.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@606 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 18:41:17 +00:00
abijah
3ba1e8b97a Fixed a bug when transitioning to a move-in receipt, and changed the invoice/receipt grids to only contain current customers / active leases. A non-current customer or closed lease can still have a receipt/invoice, the user will just have to go directly to the customer / lease first. OK, so I just checked and that's not true. Perhaps it should be...
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@605 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 17:23:50 +00:00
abijah
eb019dd9e5 Fixed a bug when transitioning to a move-in receipt, and changed the invoice/receipt grids to only contain current customers / active leases. A non-current customer or closed lease can still have a receipt/invoice, the user will just have to go directly to the customer / lease first. OK, so I just checked and that's not true. Perhaps it should be...
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@605 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 17:23:50 +00:00
abijah
719373e534 Captured a couple more todo items
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@604 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 17:07:24 +00:00
abijah
5abe0770b3 Modified the customer update() function to update all customers if passed null. This would not be a typcial scenario, but it useful at the moment during development.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@603 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 06:32:32 +00:00
abijah
1c5d97f06d Modified the customer update() function to update all customers if passed null. This would not be a typcial scenario, but it useful at the moment during development.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@603 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 06:32:32 +00:00
abijah
287d9f8f11 Fixed a bug with charge through / paid through, which was not taking into account reversed charges. I fear there are other conditions not being accounted for, not only here but throughout. One at a time for now...
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@602 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 06:31:42 +00:00
abijah
589168440c Fixed a bug with charge through / paid through, which was not taking into account reversed charges. I fear there are other conditions not being accounted for, not only here but throughout. One at a time for now...
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@602 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 06:31:42 +00:00
abijah
d3d5b54b39 Eliminated (at least temporarily) the single ledger entry view, redirecting to the double entry view instead.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@601 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 06:30:01 +00:00
abijah
73c5a20158 Eliminated (at least temporarily) the single ledger entry view, redirecting to the double entry view instead.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@601 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 06:30:01 +00:00
abijah
4f6f478a9a Hopeful fix for the bug affecting customer security deposit balance. It was introduced when we added the Customer Credit account, since Security Deposit no longer _directly_ pays charges like it used to. Now, it's converted to customer credit, and _that_ account is the one that pays. The security deposit situation is a bit shaky, but seems to be working again.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@600 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 05:48:54 +00:00
abijah
a44654ec01 Hopeful fix for the bug affecting customer security deposit balance. It was introduced when we added the Customer Credit account, since Security Deposit no longer _directly_ pays charges like it used to. Now, it's converted to customer credit, and _that_ account is the one that pays. The security deposit situation is a bit shaky, but seems to be working again.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@600 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 05:48:54 +00:00
abijah
b8d0e18014 Fixed bug when fetching data for editing a customer (the details function was deleted sometime back and might be worth putting back in). Also, added a tiny helper feature to update cached items while things are still somewhat unstable. Any time customer edit is clicked, the customer (and associated leases) will all be updated. This should allow an easy customer workaround in case there is a bug in the field.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@599 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 05:43:01 +00:00
abijah
7a331d5f4f Fixed bug when fetching data for editing a customer (the details function was deleted sometime back and might be worth putting back in). Also, added a tiny helper feature to update cached items while things are still somewhat unstable. Any time customer edit is clicked, the customer (and associated leases) will all be updated. This should allow an easy customer workaround in case there is a bug in the field.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@599 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 05:43:01 +00:00
abijah
4c44794212 Added confirmation page, and more importantly date and comment settings, when reversing a charge.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@598 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 05:37:29 +00:00
abijah
daf9fe9391 Added confirmation page, and more importantly date and comment settings, when reversing a charge.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@598 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 05:37:29 +00:00
abijah
a167b8a885 Added code to make jqGrid development aware
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@597 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 03:44:09 +00:00
abijah
d8767cfb73 Added code to make jqGrid development aware
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@597 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 03:44:09 +00:00
abijah
18d384ecb3 Merge in support for jqGrid 3.5 (plus a change to layout.css after the merge).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@596 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 03:39:29 +00:00
abijah
64792e6fe2 Merge in support for jqGrid 3.5 (plus a change to layout.css after the merge).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@596 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 03:39:29 +00:00
abijah
77db0c2ed9 Fixed the test for delinquency from 15 days (used while debugging) to 10 days
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@595 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 03:38:07 +00:00
abijah
424276eeb4 Fixed the test for delinquency from 15 days (used while debugging) to 10 days
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@595 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 03:38:07 +00:00
abijah
ebd80a8313 Turned off debugging code that was left on.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@594 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 02:52:47 +00:00
abijah
377a4cc88c Turned off debugging code that was left on.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@594 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 02:52:47 +00:00
abijah
23cdd0e497 Merge in from surplus_account_20090815 r592
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@593 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 02:22:54 +00:00
abijah
170f660528 Merge in from surplus_account_20090815 r592
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@593 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-17 02:22:54 +00:00
abijah
893fc74c0a A couple bugfixes and some more tweaks to how reversals are handled.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@566 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-15 16:47:55 +00:00
abijah
e76ad897a4 Getting closer on the reversal issue. There is definitely more testing to do, and some tweaks as well, but this may be approximately what we will finally settle on.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@565 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-15 03:11:16 +00:00
abijah
e9d92494c6 Fixed negative numbers
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@564 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-15 01:22:16 +00:00
abijah
d40f43c617 Cleaned up several places regarding redirect and rendering during development for debug purposes. Also, added a link to the intended redirect target when we've rendered instead. These changes haven't been tested, hopefully they are benign.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@563 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 21:49:42 +00:00
abijah
ac6a830d27 Change to how reversals are handled. In the process, I've tried to solidify _exactly_ what addTransaction will do, since it was becoming a house of cards of sorts. It was using special logic to decide things like whether to add ledger entries, statement entries, or both, whether to assignCredits afterwards, whether the generated receipt was to be considered a credit, and so on. Consequently, modifications to any calling function (addInvoice, addWaiver, etc) would often require addTransaction modifications, which would turn around and break all of the other calling functions. So, that embedded logic has been removed from addTransaction, and the rules of what addTransaction should do are now defined by the callers. This change is DEFINTELY not complete, as it probably has several bugs, and it DOES NOT YET WORK for reversals. I need a clean baseline to move forward from though, and this checkin approximates where we need to go.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@562 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 21:31:56 +00:00
abijah
83e552211f Moved the INTERNAL_ERROR calls to use the class function instead of the global one.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@561 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 21:21:21 +00:00
abijah
fe1b0626c2 Modified INTERNAL_ERROR to support inclusion of the blank layout, since all the javascript is lost otherwise. This should only matter for development. Also, fixed a bug with rendering when redirect is called but headers have already been output.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@560 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 21:10:16 +00:00
abijah
68df688f12 Minor tweak to grid caption and display of the entry id instead of the transaction id.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@559 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 21:07:50 +00:00
abijah
61a00f475a Allow the dollar sign in the input box, since it will get stripped off later anyway.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@558 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 21:07:02 +00:00
abijah
0c3f4c3e18 Fixed the currency function to always return in dollar amounts, and never in just cents, as the core currency function does.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@557 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 21:06:17 +00:00
abijah
90bf9bac0a Fixed url generation since it was not propogating the admin/dev routing items. Also modified the invoice at move in to exclude the customer list, and to transition directly to the receipt page afterwards.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@556 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 21:05:36 +00:00
abijah
4472a124f5 Dropped the security level for viewing statement and ledger entries
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@555 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 21:01:25 +00:00
abijah
09e44995f3 Fixed bug with statement entry counts when statement_entry_id is set
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@554 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 21:00:21 +00:00
abijah
e42c83c585 Added support for deleting (destroying) a transaction. This is strictly development/super-admin type functionality.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@553 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 20:58:50 +00:00
abijah
c31c3a3cdc Added the http request to the internal error box, since it will be necessary to help track down any reported errors.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@552 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 18:13:12 +00:00
abijah
469962dd40 Fixed a couple URL problems, including redirect, which was previously entirely unable to utilize our AppHelper for the url generation. Added a couple menu items into the Admin section. Changed debug to be OFF for any route other than the 'dev' one.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@551 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-14 18:11:33 +00:00
abijah
4d0108c6f8 Fixed the datetime bug
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@550 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-13 22:23:45 +00:00
abijah
f1d852aea6 Moved paid-through from the detail box, which is semi-static information, to the info box, which holds data that changes with time (i.e. the so called pertinent information).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@549 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-13 22:09:27 +00:00
abijah
8f6dd40b9a Modified the formatted date/age results to be span encapsulated for later css formatting.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@548 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-13 22:08:43 +00:00
abijah
1fee7646b6 Got rid of LATE as a unit status, as it did not represent an physical condition. The logic was moved to Lease, where it is a much better fit. The sitemap still presents LATE units, as it is a useful view, but the underlying logic is driven from Lease, not Unit. This checkin also includes a small feature change to how late charges are assessed, as well as a menu item to kick off the charge assessments (both accidentally wedged in to this changeset).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@547 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-13 20:55:19 +00:00
abijah
97d16bd712 Changed the default of the debug flag when generating grid data. The original intention was to have it debug by default, so that debugging would be on if the url were manually typed in. That has never been needed though, and this change not only results in cleaner logic, it makes sure we have no issues with routing.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@546 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-13 20:07:49 +00:00
abijah
9d716532bb Changed the custom route variables, so that the dev route could set the admin flag and not screw up the routing. The AppController now checks the routing params to set the dev/admin flags.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@545 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-13 16:43:07 +00:00
abijah
4be4224742 Added admin and development routes, which should help while in transition to user security.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@544 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-13 16:09:45 +00:00
abijah
b741bb6b01 Added cached fields for charged_through and paid_through dates of a lease. Also, added the ability to dynamically determine whether a unit is late or not. In reality, we really need this to be part of the lease, not one of the status types for unit. The sitemap, however, is driven from unit information, so it's not clear whether we should move that information or not.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@543 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-13 02:37:37 +00:00
abijah
af935ffd39 Changed naming to match that on the lease page
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@542 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-12 23:16:36 +00:00
abijah
a15466df50 Fixed bug causing a $0.00 security deposit charge on the move-in invoice
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@541 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-12 23:16:17 +00:00
abijah
f9ff27cad4 Many bug fixes, found while entering real facility data. Most are quite minor, although there was a functionality change to assignCredits, to support concessions without assigning them to anything other than rent. I've found that there is a glaring problem with charge reversals, which don't work correctly with the collected report. Of course, we're deleting prior disbursements, which obviously needs to be rectified.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@540 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-12 09:37:49 +00:00
abijah
e33741f579 Made viewing the deposit slip the default action when viewing the list of deposit transactions.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@539 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 18:25:40 +00:00
abijah
6b3266f022 Implemented very crude attempt at security privleges. This is not really intended to be security, just a quick and dirty mechanism to avoid prying eyes. More robust security is left to future implementation.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@538 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 18:22:21 +00:00
abijah
b1dfe5bd50 Added ability to customize the action on grid links
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@537 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 17:30:12 +00:00
abijah
3696aa011c Removed the Signed column from the leases grid unless requested
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@536 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 17:04:21 +00:00
abijah
6e03664f28 More tweaking with grids that need to be reloaded immediately after page load. Fixed a bug with the statement_entry balance field, as there were two of them.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@534 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 15:56:40 +00:00
abijah
1b0d752a55 Modified the statement entries grid, as well as the underlying controller, to support a couple new fields, 'applied' and 'balance'.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@532 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 07:27:56 +00:00
abijah
9cac7f481e Finally have a (slightly kludgy) fix for keeping the 'collected' grid from being rendered before ready.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@531 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 07:24:52 +00:00
abijah
9fe55bd782 Fixed bug with display on the bank deposit page, caused by reusing a class name in the edit tender page.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@530 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 07:21:34 +00:00
abijah
f8cb1e2ef7 Added ability to rename columns on a case by case basis
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@529 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 07:15:04 +00:00
abijah
cbdce4f166 Added the gridview parameter, since we're not doing anything too complicated with grids. Updated the jqGrid css, some of which is just not longer needed, and some of which is broken by the move to jqGrid 3.5
git-svn-id: file:///svn-source/pmgr/branches/jqgrid_3.5@528 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 07:08:54 +00:00
abijah
e9b9bdc420 Preliminary move to jqGrid 3.5.1. It has proven troublesome to change over, although really, I've only found one compatibility break so far. The real problem has been the elimination of the jqGrid loader code. We now have to build the jqGrid package through a selection form on the jqGrid download page, and the errors made it difficult to determine that the package configuration was the problem (such as destroying the entire page content). It's working alright at the moment.
git-svn-id: file:///svn-source/pmgr/branches/jqgrid_3.5@527 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 04:43:33 +00:00
abijah
704412727d Branch to roll up to the 3.5 version of jqGrid
git-svn-id: file:///svn-source/pmgr/branches/jqgrid_3.5@526 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 04:11:45 +00:00
abijah
baa737e628 Changed invoice generation to match the receipt changes in r521 (no more debug, transition to the lease after entry, etc).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@525 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 01:08:39 +00:00
abijah
aa307150c8 Whitespace only change
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@524 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 01:07:20 +00:00
abijah
0727d5f091 Fixed problem when effective_date is an empty string, as opposed to completely missing.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@523 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 01:07:01 +00:00
abijah
aa65c18c39 Renamed the menu items for invoice and receipt creation.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@522 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-11 01:06:28 +00:00
abijah
666df07a7c Removed the debug portions of receipt entry, and added a checkbox to allow the user to either keep entering receipts, or have the page automatically transition to the customer page.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@521 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 23:57:20 +00:00
abijah
452deb981f Missed adding this file on the last checkin (r519)
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@520 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 22:24:23 +00:00
abijah
29f6d1a717 Added the ability to edit a tender. I've locked this down to just editing the data1-4 fields at the moment, since there are accounting ramifications if we were to change the tender type.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@519 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 22:23:47 +00:00
abijah
025c3a555a Added automatic grid reload, since the default grid load is inconsistent with the displayed settings. The solution here sucks, but at least it avoids the inconsistency.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@518 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 22:22:56 +00:00
abijah
467387a581 Removed the two dangerous links from the Debug menu, as we're preparing to enter new data and don't want to zap it.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@517 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 19:20:29 +00:00
abijah
acb8fb44be Added the ability to accept payments (or a write-off) on a closed lease, if there is a balance owing. Added the ability to do write off bad debt at the customer level, since some charges may not be on a lease, like the NSF fee.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@516 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 19:01:20 +00:00
abijah
fea21b3ea0 Added the close date to the leases grid, to make it clear which customer leases are still open. Perhaps we should exclude the field by default, and just add it into the customer view page.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@515 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 19:00:02 +00:00
abijah
3a248fc1b4 Added Bad Debt as one of the accounts for the collected report
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@514 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 18:58:41 +00:00
abijah
d49201211b Added confirmation to the NSF functionality, as well as a timestamp field instead of forcing time=now.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@513 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 05:49:43 +00:00
abijah
4358732878 Changed the Deposits menu item to be at the top level, instead of underneath the Accounts menu.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@512 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 05:48:49 +00:00
abijah
fdcdc94bec Modified NSF to use positive amounts for the ledger entries (swapping credit/debit, of course). The statement entries remain using negative amounts, as they are negative disbursements.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@511 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 04:46:54 +00:00
abijah
9a3a24ca0c Preventing moved-out leases in sitelink data from being closed, since the security deposit hasn't been released. Added a temporary function to release the deposit, so I can manually release and close the few leases needed.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@510 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 01:27:12 +00:00
abijah
35f17ed1de Added customer since/until fields. Changed the ledger entry grid on the customers page into a receipts grid, and added it to the lease page as well, even though it is for the customer in general, and may include receipts for leases other than the one being viewed. I may put more effort into this later, but for now it solves the problem of getting the receipt tenders visible when viewing the lease.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@509 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-10 00:56:41 +00:00
abijah
bc95b31521 Added transaction model writeOff function, and a new statement_entry WRITEOFF type. Not a big deal, but it makes presentation a bit more straightforward.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@508 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-09 15:11:51 +00:00
abijah
bd26ec7218 Added mechanism to automatically assess late fees. This uses hardcoded assumptions, since our late fee table has not yet been implemented.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@507 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-08 16:37:12 +00:00
abijah
8df94e9c5f Implemented a single function to assess rent across all leases.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@506 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-08 16:09:49 +00:00
abijah
6f62d84818 Implemented mechanism for automatic assessment of monthly rent
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@505 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-08 15:44:52 +00:00
abijah
b02a504abb Add refund capability to the customer, and in fact only the customer, as we've revoked refund capability from the lease. This is to help work through various issues surrounding use of security deposits and general refund functionality. For example, a customer who has overpayed (customer surplus, with zero balance on lease), and then moves out. Where that security deposit surplus goes has been a bit of a thorn. Hopefully, this resolves the issue, although there may still be some bugs to flush out.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@504 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-08 04:27:02 +00:00
abijah
bba3af8163 Some of the finer detail work, mostly around pre-populating the move-in invoice with useful and correct data, and allowing the lease rent and deposit to be set at movein.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@503 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-07 22:52:01 +00:00
abijah
16f7de421f Minor tweaks, a shame for checkin r500 :-(
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@500 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-07 03:55:01 +00:00
abijah
c3e60a65c1 More work with security deposits, reversals, and balances. I've tried to work many different corner cases, but know that not everything has been tested. I think the next steps for testing will be to put in some real data.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@499 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-07 00:10:28 +00:00
abijah
f900853163 Added in internal error function, since the die() statements were hard to spot, and certainly not user friendly for the end user.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@498 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 20:17:02 +00:00
abijah
0de0c7d5d7 Fixed the button text for new customers
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@497 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 18:08:55 +00:00
abijah
a2aa612a5e Fixed the customer selection update for receipts, and added a mechanism to automatically update the oustanding charges grid after entering the receipt.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@496 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 18:08:21 +00:00
abijah
b900e49f54 Added mechanism to do a full replacement of specified post parameters, instead of just merging.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@495 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 18:06:57 +00:00
abijah
ad4e194bf9 Added ability to edit a unit, except for sort/walk order. To handle those things we'll need to: save unit's old sort/walk position; adjust down (by one) all unit positions greater than the old position; adjust up (by one) all unit positions greater than or equal to the new unit position; update the unit's position. I'm not going to worry about it right now.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@494 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 09:27:09 +00:00
abijah
a5e7366cac Implemented refund, at least for the most part. Minor testing, but looks promising. Because of this change the customer account entries grid appears odd, with a refunds showing up as a 'Charge'. So, I'm toying with the idea of having entries show up as customer 'Debits' and 'Credits'. I don't know if this will cause user confusion, but we'll play with it for a while and see. It actually reminds me a bit (coming full circle) of the earliest implementations, which kept track of a lease on its own account/ledger, in which credit/debit would be the exact correct terms.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@493 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 05:11:58 +00:00
abijah
bd85ce9f51 Added ability to format currency without a dollar sign (i.e. in raw numerical format).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@492 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 05:04:34 +00:00
abijah
c58183c965 More work on refund. I'm going to skip the whole voucher/credit_note bit and simply present a page that lets the user enter a date, an account, and the amount to refund, recording 1 payment transaction.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@491 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 02:52:45 +00:00
abijah
adc901b7e7 Several changes in an effort to support charge reversals. I can't imagine this is all working flawlessly, as I'm not quite sure how it even _should_ work.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@490 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-05 07:54:57 +00:00
abijah
a84655bcb7 Modified to use toggle for 'this' debug pr block, instead of independent show/hide
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@489 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-05 02:59:09 +00:00
abijah
6a7a784cb6 Discovered that the use of the term 'Payment' has been a misnomer. A company uses the term payment to indicate the monies it pays to _others_. Changing this leaves us without a good replacement term, but disbursement really seems to fit the bill. As comfortable as the term payment was, it was odd in many respects and disbursement does seem more appropriate. I'm sure there are several lingering bugs from this massive search/replace exercise, but this is a decent baseline for the change.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@488 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-05 01:00:09 +00:00
abijah
7c9637ae35 Added a more descriptive fieldname for statement entry views. Instead of Transaction, it will be Receipt, Invoice, Deposit, etc.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@487 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-05 00:06:46 +00:00
abijah
5d934f756f Brought the bad debt write-off functionality up to date. I'm not entirely convinced that calling it a receipt is such a good idea, but bad debt is certainly a non-normal case, and we can work on this later if need be.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@486 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 23:25:31 +00:00
abijah
6904320e4e Modified lease and customer views to have the statement & ledger entries sorted in descending date order by default. May not prefer this in the end, but we'll give it a go for a while.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@485 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 22:12:32 +00:00
abijah
17297beb65 Undid the change from r401, since it wasn't being used and was interferring with the specification of sort_column. If we really want that functionality, we can add it in when needed and come up with a more general solution for view specific sorting as well.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@484 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 22:09:18 +00:00
abijah
e0ea50d142 Fixed bug when marking NSF of a tender that has only been used as a surplus and never applied to any charges. Modified the applyCredits algorithm to try and distinguish between surplus credits of a lease and general customer surplus. I don't know if it works completely, but I do know it creates an issue since a lease surplus can now never be utilized without additional lease charges, a refund (no yet implemented), or moving the surplus to the customer level (not intended to be implemented).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@483 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 21:19:20 +00:00
abijah
81b5bfed26 Made the link clearer that we'll only be waiving the balance of a charge, not the entire charge.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@482 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 20:26:33 +00:00
abijah
2ddcdf9419 Even with all the effort put into getting the counts right on the customers grid, it still didn't work right. The root of the problem is the join to CurrentLease, which can result in multiple rows for the same customer. I can revisit this in the future to put some clever solution back in, but in the meantime, it was easiest just to add fields to the customers table, and simply update it whenever the customer lease situation changes. I don't like it... but it just made life much simpler.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@481 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 19:25:39 +00:00
abijah
e0d15b7396 More work cleaning up and testing the use of charge waivers, as well as security deposit utilizations. Much of this was just around the concept of determining balances, which wasn't / isn't very straightforward. It's not hard to calculate a balance for a particular sitation, but it is difficult to generalize. I think it's reasonable as it now stands, but the StatementEntry::stats algorithm is certainly subject to change. Also, I didn't double check every case which called the stats() function, so I highly suspect we'll find cases where the code is not expecting the new return values, either symantically or logically.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@480 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 03:12:09 +00:00
abijah
aa846de284 Continued waiver progress. At the moment, it works ok, but I don't like the way that security deposit balances work. It's probably a general issue, not just security deposits, but it's not clear whether stats from StatementEntry should be subtracting waiver totals from the overall charge reconciliation total. It should in some cases, and not in others. I'll tweak on it in later checkins.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@479 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 21:50:21 +00:00
abijah
09e650d841 Fixed minor bug that was causing the string 'undefined' to be used as the payment index.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@478 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 21:47:24 +00:00
abijah
61e9dad364 Fixed cut/paste error causing invalid customer security deposit balance.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@477 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 21:44:36 +00:00
abijah
91f5ad7660 Added HR to keep the boundary between two pr blocks clear even when the output is collapsed and the stack trace is not.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@476 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 20:17:14 +00:00
abijah
14d896d1b3 Added ability to log items without showing the output. I doubt the mechanism works perfectly in all cases, but it works enough for now and I can tweak it as needed.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@475 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 20:13:48 +00:00
abijah
d2795e8201 Added the ability to suppress logging at display time. I'd like to add an additional log level, the first which passes or suppresses the print, and the second which defaultly displays or hides the output. Perhaps next checkin.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@474 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 19:41:49 +00:00
abijah
df91125e96 Added stack tracing to each model::pr print
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@473 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 18:38:35 +00:00
abijah
7fda78f820 Added ability to waive a partial charge.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@472 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 04:14:44 +00:00
abijah
a59d93ebee First pass at a charge waiver implementation. It hasn't been tested but for a tiny bit.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@471 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 03:46:58 +00:00
abijah
fe66241ca1 Work around for the fact that our implementation has issues with receipts of more than one tender. See the branch statement_ledger_entry_tie_20090802 for more information.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@470 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 03:45:51 +00:00
abijah
4c8e3b380e Left r466 with syntax error... fixed that
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@469 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 02:30:29 +00:00
abijah
6b357fc285 Added a new statement entry type, 'WAIVE', and added the beginnings of a function to add a new waiver transaction. Haven't even started the work yet though...
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@466 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-02 22:44:55 +00:00
abijah
a9ef3a75ae Added a check to ensure we're not adding a close with no accounts. This check should probably be in the model, but that can be done later.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@465 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-01 01:48:07 +00:00
abijah
267357a0f7 Combined the addNsf and addTransaction functions, which was always intended. There is more that could be done, but not all bugs are flushed out yet. Its close enough though, that I want to capture it as is to help work through the subtle issues.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@464 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-01 01:47:11 +00:00
abijah
1c2c2b457c More work on handling security deposit utilizations. This is headed in the right direction, but unfortunately, there is a problem if the security deposits have not been paid. I could just ignore it, because it's a low priority problem, but I think the solution might be to just provide a waiver on the unpaid charges. Since I need to implement fee waivers anyway, I'll just move onto that next, and then finish out the security deposit work.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@463 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 21:11:00 +00:00
abijah
b00944a412 Changed the reconciledSet to provide an option for returning partially reconciled results. This keeps the same behavior so as not to break anything (although I can only think of paid rents that might suffer).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@462 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 21:07:00 +00:00
abijah
4ef09080be Left a syntax error on the last checkin :-/
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@461 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 19:23:19 +00:00
abijah
b41ce38526 Fixed a couple small bugs with assignCredits, one of which was causing charges to get paid out of order.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@460 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 19:20:35 +00:00
abijah
f210388f6c Added logging
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@459 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 18:35:39 +00:00
abijah
645a3a4797 Removed the ability to NSF items like Cash
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@458 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 18:19:20 +00:00
abijah
8f79f0401f Added a way to associate the meaningful part of NSF with the corresponding tender.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@456 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 18:10:48 +00:00
abijah
e40778ddbd Doh! So someone actually _was_ using the gridDataFilterConditionsStatement function. Guess it would have been worth grepping for...
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@455 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 17:57:30 +00:00
abijah
6b7ce60ae3 Changed the default log level to 5, since we're using rather high levels anyway.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@454 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 17:43:51 +00:00
abijah
2b09f4054f Added some comments, and changed the nsf action to redirect to viewing the tender after creation.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@453 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 17:15:17 +00:00
abijah
33a677431f Some cleanup from the last checkin
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@452 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 16:48:27 +00:00
abijah
9bd37ba282 Added the ability to perform partial deposits. After this checkin, I'll clean up some of the commented out sections of things that we're attempted to get this all working.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@451 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 16:41:56 +00:00
abijah
53a8d8fc60 Fixed a bug where the condition is of the form array('field' => null). That's a valid condition, but was being treated the same as array('field'). This resolves it, although it will break anyone using the gridDataFilterConditionsStatement virtual function. I don't think anyone is at the moment, although I didn't check.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@450 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 03:46:59 +00:00
abijah
4c7e3d1f58 Removed the comment block, since it's not longer needed and has now been saved.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@448 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 03:29:17 +00:00
abijah
5dc5f087ba Added an automatic $35 nsf charge when marking an item as nsf. This required removing the lease_id requirement when adding a transaction, since the charge is not associated with a lease, just a customer. The requirement was artificial anyway; imagine selling POS items to folks that don't even lease from us...
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@447 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 03:07:34 +00:00
abijah
46744a24d3 Modified to use the logging mechanism
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@446 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 02:09:45 +00:00
abijah
b553dbb9c3 Modified to use the logging mechanism
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@445 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:45:57 +00:00
abijah
3c390d940f Modified how NSF customer surplus items are handled. Instead of creating a negative surplus (which was dumb, but a decent first pass), we just void out the surplus. This drops the surplus off the radar, and in fact may cause confusion since the transaction no longer has enough statement entries to total up correctly. However, it doesn't appear too confusing, especially as tender item names are now decorated with strikethrough when they're NSF (the previous checkin).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@444 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:40:16 +00:00
abijah
777a47a27b Added strikethrough over the tender name in grids when the tender is NSF. This helps really call out the situation with NSF items.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@443 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:38:53 +00:00
abijah
237b0a901f Shrunk the comment column in half, since it's usually empty. All we really need is an easy way to spot that there is a comment, and the user can hover or widen the column as needed.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@442 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:35:45 +00:00
abijah
393d9c9d77 Removed the Tender column from grids where the account does not support payments and so the ledger entries should never have a Tender anyway (except for our special case Closing account, which is fine to ignore).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@441 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:34:45 +00:00
abijah
17cd00c90e Renamed prExit to prReturn, to be consitent with the return statement where it should be used. Also, modified the chargePaymentFields to be more explicit on the balance, in anticipation of the new type VOID
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@440 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:31:45 +00:00
abijah
066acd14f0 Changed prints to use the new logging system
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@439 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:23:27 +00:00
abijah
87db010dc1 Discovered that an earlier implementation of Model::pr is now being overridden by the AppModel. This is probably a good thing, but it does mean that we're getting a ton of Model prints that we don't want. I added a class logging mechanism to allow individual classes to be turned up or down, and set the default for Model to be very low
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@438 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 00:00:10 +00:00
abijah
9360ebe661 Added the debug file/line output directly into the AppModel::_pr function, as the builtin pr function simply logs the same file line for every call.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@437 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 23:32:10 +00:00
abijah
32c81b7367 Finally added a logging mechanism. Only one file has been converted at the moment. I'll go in pieces, as debugging goes on.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@436 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 23:20:47 +00:00
abijah
0b8d8fe1ac Changed the StatementEntry type enum from CREDIT to SURPLUS. I never liked using the term CREDIT, since its use is confusing along side DEBIT/CREDIT. I couldn't think of another name earlier, which is why I used CREDIT, but I decided anything other than CREDIT is good, so I chose SURPLUS.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@435 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 21:40:38 +00:00
abijah
0cb961925d The conditions were clamped down too tight, as they prevented something like 'Table.field !='
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@433 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 21:34:03 +00:00
abijah
fbfc973dad Included a possible mechanism for including the nsf ledger entries when viewing a tender
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@432 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 21:06:02 +00:00
abijah
24f245c3c8 Tweaked filtering to allow for non-trivial conditions
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@431 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 20:59:33 +00:00
abijah
e7e3dbc559 Modified the filtering behavior; A filter specified as 'Table.field' results in the obvious split (Table, field); 'Table' results in (Table, id); 'field' results in (ModelTable, field). Fixed a bug in the app controller which was allowing 'fields' to leak into the top level of 'link'
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@430 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 19:45:19 +00:00
abijah
de0cf6467a Moved the filtering split to a virtual function.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@429 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 19:07:21 +00:00
abijah
48fb7383de Added effective date to each NSF entry, and fixed the account bug with receipts/payments. There is still a bug/question on how to handle nsf credits. It would be nice to simply delete the credit, since the check bounced, but then the original transaction will not add up. Either we decide that it doesn't need to add up, figure out a different type for the credit, or add a void flag to each statement entry and just void out nsf items. Or instead of a void flag, have an nsf_statement_entry_id which will also tie the payment/credit to the nsf payment/credit.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@428 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 18:23:37 +00:00
abijah
94c0efa881 This is probably what we really want for NSF... two transactions. One for backing out the bank deposit, and the other for adjusting A/R and all the associated statement entries. This is working reasonably well, even seemingly fine for the collected rents report. I do see that there is another bug though, that is causing statement entries to have the opposite account_id than intended (A/R instead of Cash) when entering new receipts. Not sure when I broke that, but it must have been when working on deposits.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@427 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 07:30:50 +00:00
abijah
7450d2a98e Preliminary work on NSF. It's far from working, but we're headed in the right direction.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@426 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 06:29:41 +00:00
abijah
3e715bae9f In the cleanup of r423, some code accidentally got squashed. This checkin undoes that problem
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@425 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 06:09:05 +00:00
abijah
347aa20622 Fixed problem when trying to calculate transaction stats. The current solution is a bit dodgy, but by limiting the queries to LedgerEntry and StatementEntry, it works without too much extra effort.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@424 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 02:47:43 +00:00
abijah
510ca489ec Cleanup of old lingering functions and some comment blocks
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@423 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 02:39:09 +00:00
abijah
e4426cde55 Fixed the problem with zero dollar balance forward entries when closing a ledger.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@422 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 02:17:49 +00:00
abijah
25e3c87213 Got the ledger closings to work again. This seems to work ok, although I notice closing the ledger after deposit results in a balance forward entry of $0.00 . I'll work on it next
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@421 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 01:59:10 +00:00
abijah
eb209a455b Disabled submission of tender types that have no items
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@420 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 23:25:26 +00:00
abijah
ccf7a5fccd This is the remainder of the previous, invalid, partial checkin.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@419 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 23:25:03 +00:00
abijah
a8862ea3fd Moved deposit creation to the transactions controller. Added the ability to view prior deposit slips.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@418 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 23:17:00 +00:00
abijah
f6a93af27d Added a minimum age feature to the date formatting. It's not really a perfect solution, but it's working for our needs at the moment.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@417 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 23:16:26 +00:00
abijah
362226183e Changed the deposit to use a grouped double entry instead of individual ones for each tender deposited
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@414 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 10:10:11 +00:00
abijah
438610bdf9 Added customer association to each tender
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@413 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 09:33:29 +00:00
abijah
cdf6ce86e3 Re-implemented the deposit functionality. This is mostly working, although I'd like to get customer added to the tenders table, and probably change to a single deposit ledger entry for each tender type. A single entry would require that all tender types have been recorded to the same account, something that isn't mandated at the present, but is likely to be true most of the time. Perhaps they could just be grouped by account id, which should work in all cases and yet align with tender type 99% of the time. I'll have to think about it.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@412 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 08:55:09 +00:00
abijah
3128880c4d Fixed problem with grid display when part of a form
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@411 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 08:50:44 +00:00
abijah
e23413b4d8 Cleaned up some of the old code concerning the deposit action. It's not done, as I'll next be experimenting with having the tenders controller handle deposits.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@410 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 02:43:30 +00:00
abijah
3a6964c4bf Added more information to the tender grid, and a new query to return depositable types
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@409 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 02:41:50 +00:00
abijah
95f43f07bf Fixed the pluralization of cash
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@408 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 02:39:31 +00:00
abijah
bfa71375e8 Started work on handling NSF, but will deal with deposits first, since we can't get an NSF without a deposit first.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@407 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 01:51:34 +00:00
abijah
48123c98b8 Minor change to the default accounts on the collected screen. Probably will be tweaked again later.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@406 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 01:50:33 +00:00
abijah
9d35ed1aa9 Added the debug class to the debug grid query link, so that it doesn't show on print media.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@405 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 01:43:08 +00:00
abijah
ae35d637ac Increased font size for the page number input at the bottom of each jqGrid
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@404 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 01:42:16 +00:00
abijah
6cd0a1378d Added a print media CSS file, and fixed the jqGrid print problem of truncating the table to a single page. Also, used the opportunity to disable printing of the side menu and the debug toolkit, as well as some more jqGrid cleanup.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@403 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 01:41:34 +00:00
abijah
1d6c7436d4 Got the collected reports working again. NSF hasn't been tested yet, because NSF entry is not yet working.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@402 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 16:08:15 +00:00
abijah
aa0a60ea2b Modified the grid helper to allow a view to directly specify custom post data without wiping out any custom post data set by the element. It's not been used or tested.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@401 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 16:07:34 +00:00
abijah
d8fe7f9264 Suppressed all the debug print statements from transaction insertion.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@398 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 02:40:42 +00:00
abijah
1372bb68e4 Half-kludgy fix to a filtering bug when a table is already specified using the simple notation, e.g. array('Table'), instead of the more complete form array('Table' => array(...))
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@397 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 02:39:44 +00:00
abijah
cb5b017c7e Bug fixes to get lease security deposit and balance information working.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@396 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 01:18:02 +00:00
abijah
8e720dbfec Added a rent column to the units list
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@395 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 01:17:09 +00:00
abijah
24ccb56e50 Further tweaked the code to add new transactions, primarily by creating separate verification and addition functions in each underlying model. There are logic changes as well, such as adding in the other half of the missing double entry (as well as the double entry itself). This checkin also introduces the creation of CREDIT statement entries, when the customer has overpayed. It's working fairly well, although undoubtedly will need more tweaking.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@394 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 01:16:42 +00:00
abijah
4adf0dd2fc Added a debug dump function to print out a model without getting stuck on the recursive inclusion of other models.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@393 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 01:11:27 +00:00
abijah
24bca2c8e9 Implemented a mechanism to track customer overpayments (credits). Also implemented a reconciling algorithm, matching payments to charges. Preliminary testing seems to show that it works well. More thorough testing required.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@392 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-27 04:18:38 +00:00
abijah
2cc58255c3 Playing with different means for determining stats. Nothing decided yet.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@391 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-26 23:23:19 +00:00
abijah
36f439ff38 Added ability to toggle between one big closing ledger entry, and one per house
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@390 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-25 08:08:47 +00:00
abijah
7a42bee8ef Added transaction stats. Added (possibly unwanted) columns.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@389 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-25 08:06:50 +00:00
abijah
0170dbc310 Fixed yet another bug in the merging of actions & options
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@388 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-25 07:57:56 +00:00
abijah
b820929ddc Made progress adapting the receipt code onto the latest db changes.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@387 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 07:43:42 +00:00
abijah
743ff52e59 Made changes to get field alignment on receipt entry. I can get the text on the left by floating the label, but actually, I think I prefer the boxes on the left.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@386 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 05:01:29 +00:00
abijah
efb4655786 Reverted back to r383.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@385 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 04:16:33 +00:00
abijah
7c34c7faff I tried using a table for the receipt entry, which seems like it should work, but really doesn't. I'll check it in for future reference, but I'll be reverting just afterwards
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@384 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 04:15:39 +00:00
abijah
e448519a1e I accidentally tried to cehck in tender.php instead of the intended tender_type.php
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@383 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 03:58:57 +00:00
abijah
a4dff8a6ed Begin the move from having receipts generated based on 'collectable' account, to being based on what the database considers to be a form of tender. This has the excellent benefit of removing all those hardcoded data1/2 fields for each different tender type. That's all database driven now. There is more to do, but this is a good step forward.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@382 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 03:58:12 +00:00
abijah
2db0fc12d3 Forgot this file on the last checkin, since it was using the trackable field
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@381 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 03:55:54 +00:00
abijah
991d4d717e Modified the application to reflect the changed field names in the accounts table. For example, payable is now payments.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@380 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 03:22:56 +00:00
abijah
446ba0ce28 Added a much more user friendly way to present the data1-4 labels for each type, now that we have a tender_types table. Still not a perfect solution, but definitely good enough for now. Modified the application to recognize the new tender_types table. There may be other modifications necessary, but this gets the most obvious spot.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@378 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 02:07:43 +00:00
abijah
4cab2c09c1 Fixed some minor display issues and tweaks to compensate for the new stats() algorithm. More are necessary, I'm sure.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@375 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 23:54:40 +00:00
abijah
127f7f3eb9 Finally resolved the StatementEntries::stats() query issue. It has been lingering in an incomplete state because it wasn't clear what it was supposed to really do. I think it is now performing the task expected of it.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@374 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 23:52:59 +00:00
abijah
ce23bf5abd Fixed a bug with idlist caused when we moved all the post data into the 'post' field
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@373 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 23:45:04 +00:00
abijah
5cf40147d9 First pass implementation at generating an invoice, which seems to be working. Largely untested, but worth checking in. Next is to get receipts using the same algorithm, and after that will be to work on a reconciling mechanism, creating payments, and matching them to charges. This checkin includes an additional customer_id fields as part of the transactions table. I think it was an oversight not to be there, as we need some way to keep track of monies which have been paid by a customer, yet not applied. If there is a different way to do it (short of actually having each ledger entry hold customer_id), it escapes me at the moment.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@372 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 21:24:49 +00:00
abijah
4a94fc3798 More tweaking to all of the grid displays. This was mostly visual, but includes some bug fixes as well (such as a manual filter override in the ledger_entries controller).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@371 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 16:53:33 +00:00
abijah
3c22378498 Modified Filtering to have a separate virtual function for Tables and Conditions. This was prompted because a derived controller could override the function to return null to prevent adding a filtering table (such as if the table was already added as a non top-level table), and although the app controller would correctly prevent adding the filter table to the set, it would also prevent adding the filter condition as well. So, making two virtual functions, one for table name when defining filter tables, and one for table name when defining filter conditions, allows the derived controller to stop a table from being added to the set, yet still let the condition through (without having to override the entire filter condition logic).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@370 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 16:51:32 +00:00
abijah
43b4ef8890 Yet another tweak to Linkable for merging fields and conditions of the options and associations variables.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@369 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 16:35:53 +00:00
abijah
25bc1607cc Many, many changes, and yet still much to do. Many things are working, but certainly nothing beyond simply data retrieval (no editing or adding of any data). Also, some work is still required to ensure the grids have the right columns; we can strip out certain columns for some views (such as removing customer from the leases grid of the customer view... completely redundant). And of course, there are still many bugs and lots to clean up.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@368 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 01:49:46 +00:00
abijah
85edb1c658 Changed the default table configuration to be link instead of contain. contain was never really desired, it just got thrown in there since it wasn't clear how link would behave, and we needed the essential effect of recursive=-1.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@367 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 01:11:30 +00:00
abijah
368b730744 Added automagic filtering capability to the app controller. Also, lumped all items needing serialization into a single 'post' item, instead of continuing to piecemeal each added post item. There will be some changes required to some controllers, since custom post data has changed location, but it should be minor. To make use of the new filtering methods, each view will have to set the 'filter' parameter at the time of grid setup.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@365 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 23:31:41 +00:00
abijah
8db607ffc5 Of course, the last fix didn't work... I don't know why it looked like it was working. This fix should resolve the issue.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@364 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 23:12:04 +00:00
abijah
030617713d Attempted fix for a missing conditions/fields bug. The fix would probably have just been to use empty instead of isset, since apparently the defaults for these items are an empty string instead of null (yuck). However, I already had done a bit of minor logic change and prefer the new form, so that's why more than just the isset call was modified.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@363 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 22:54:02 +00:00
abijah
1e359f816c Fixed the Linkable behavior from polluting the query fields when performing a count query.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@362 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 22:27:55 +00:00
abijah
b641dc98ec Renamed jqGridData functions to be just gridData. Restructured the virtual function calls with an anticipated need for gridDataCount to be overridden as a whole, instead of just overriding the individual pieces.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@361 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 17:06:44 +00:00
abijah
f52fba96c1 Making progress. Much still to do, but there are hints of functionality finally returning so I'm snapshotting.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@360 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-21 10:23:52 +00:00
abijah
5a16e497ad Customers is working somewhat. I want to see if the grid query logic can be simplified, so I'm checking in first
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@359 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-21 09:40:51 +00:00
abijah
d5bcd9a496 Another snapshot
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@356 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-20 23:35:11 +00:00
abijah
bfbf119aca Modified Linkable to be recursive, which is needed to support certain queries that have models joined based on prior joined models. The old way went breadth first, which prevented such a join from working
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@355 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-20 20:22:06 +00:00
abijah
7181bc7f9b Minor logic and formatting changes. Considering making Linkable operate recursively.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@354 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-20 19:00:54 +00:00
abijah
7304a0e889 Another snapshot. I think I'll be taking the CREDIT/DEBIT reconcile functionality out.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@353 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-20 02:17:54 +00:00
abijah
3d262fd4db This rework is nowhere near complete, but there are certain things that are falling in place, and worth capturing. I started a branch for just this purpose of being able to check in intermediate work.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@352 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-19 23:35:25 +00:00
abijah
af0c10f6a6 D:\bin\svnbranch.pl: Branch from /branches/invoice_receipt_20090629 to /branches/yafr_20090716
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716/site@351 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-16 18:52:28 +00:00
abijah
115c82cd21 Still trying to figure out what issuing a refund should look like. I switched the entry to be negative, which may (should) make reporting easier.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@350 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-16 07:27:18 +00:00
abijah
331e235e77 Added debugging to the serialize function. I don't really want to keep it, but I don't want to lose it either. At least one check in before I clean it up again (if I do).
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@349 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-16 07:12:18 +00:00
abijah
d0dfd8657c Added some starter code to figure out how we handle refunds. This is NOT working, just a snapshot of progress.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@348 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 18:37:51 +00:00
abijah
4d4bebc3d3 Added a couple helper functions to Ledger.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@347 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 18:33:30 +00:00
abijah
ae04aafaca Eliminated the LedgerEntry::nsf code, which was replaced with MonetarySource::nsf.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@346 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 18:32:14 +00:00
abijah
fcb23d12a5 minor cleanup of the paid through function
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@344 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 09:22:19 +00:00
abijah
dd7da1489d Added a paid-through field for leases. Now I just need to add it to the grid query, although it's a change that can wait.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@343 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 09:18:56 +00:00
abijah
85cc6d7c6a Changed the default collected results to be those collected into any account, not just payable ones.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@342 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 08:01:56 +00:00
abijah
e457f87c42 Fixed bug preventing customer links from working
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@341 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 07:55:40 +00:00
abijah
e8d12882cc Fixed the total amount collected to reflect the _actual_ total, not just the page total. Now the grid no longer needs to be 500 rows long.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@340 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 07:47:13 +00:00
abijah
8f2b43239d Added a 'Calculating...' message before the grid has rendered.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@339 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 07:45:23 +00:00
abijah
51d786ab8b Added generic mechanism to add userdata to the grid results. A 'userdata' callout function would be nice, but in practice, userdata may get added anywhere along the line, which is much easier than trying to figure out when to call such a callout and what parameters it would need to be passed.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@338 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 07:44:51 +00:00
abijah
6f4519fe56 Layout manipulation to the collected page.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@337 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 07:13:41 +00:00
abijah
69adfd900c Standardized the grid events interface, to ease the burden on the views and ensure that the load functions could be used by the application without wiping out the debug functionality that was built into jqGrid.ctp
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@336 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 06:21:55 +00:00
abijah
33ba912a7e Fixed the balance summary of the collected report, and marked off NSF and collected report requirements.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@335 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 05:42:10 +00:00
abijah
c4942b922b Finally, a working NSF implementation. Ledger Entry tracking stops at the Bank account, since we switch from positive to negative ledger entries. However, we're not going to reconcile debits to credits in the bank account anyway, so I just disabled tracking on the account.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@334 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 03:06:59 +00:00
abijah
2588fd6a91 A final attempt to reconcile the cash in the bank account. It just wasn't designed this way, so I'll strip it out on the next checkin.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@333 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 01:33:06 +00:00
abijah
3baa199fda Multiple e6 entries now ensure that NSF reconciles appropriately to e1 such that the lease is correctly taken into account.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@332 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 01:05:44 +00:00
abijah
68a10e783b getting closer to a workable NSF solution. I don't like it, but it might allow us to move forward in the short term. This solution required a stupid kludge to get CakePHP to work with the necessary query, which sucks but is not too cumbersome. What isn't working at the moment, is for the NSF to show up on the lease account, which is what I'll try to work out next. Also, the monies deposited are not trackable, since I'm not reconciling them (due to the sign flip). Not sure if there is an easily workable solution. Also, to get the collected rent report to show this negative income, it requires the bank account be part of the query, which I accomplish in the short term by setting the 'payable' flag. I may need to fix/kludge this by running the NSF through the receipt account and adding the NSF account to the list on the collected page.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@331 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 00:21:23 +00:00
abijah
34e3251240 Just updated the comments, and added e2a and e1 into the query. No functional change yet.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@330 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-14 21:44:19 +00:00
abijah
01aa2d1697 The NSF functionality is working good from a strictly general ledger point of view. However, as it's implemented, it's leaving us unable to observe that we've actually experienced negative collected rent. This is a big problem, but I've put a couple notes in place on how I might try to proceed on this next, and am checking in this semi-working version.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@329 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-14 20:48:16 +00:00
abijah
69b3cf3ed3 Implementing NSF in MonetarySourcesController. It's nowhere near done, but it seems we're headed in the right direction.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@328 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-13 10:14:38 +00:00
abijah
3551ad0603 Added a ledger entry listing on the monetary source view page.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@327 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-13 09:54:49 +00:00
abijah
f960349e0f Definitely not yet what we need for reversing charges, but at least the recursive nature seems to be in the right direction.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@326 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-13 04:41:18 +00:00
abijah
4ad4033e4f Fix to the sub-total column, which wasn't working for ledgers that have both debits and credits (and thus need a sub-total of balance, not amount
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@325 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-13 04:40:21 +00:00
abijah
00cff7bb3a A working version of the collected report for accounts. There is still some error checking to do, since we don't want this report for just any account. Also, we may wish to do away with the form to prevent accidental submittal. Finally, it would be nice to do away with the button, and automatically update on date changes.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@324 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-13 02:24:31 +00:00
abijah
3ffa3c81bb Fixed the last bug... I had just forgotten to use ReceiptTransaction for the dates in question. Also, I elminated the collected element, and just added a minor tweak to ledger_entries to make it work. I'll work on added user entered dates & accounts soon (perhaps next).
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@323 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 21:00:38 +00:00
abijah
886a63773e Experiment with converting the 'collected' grid results to be a query of the rent ledger entries that resolve out to payments, instead of payment entries that resolve rent entries. It's a subtle difference, but gives a couple benefits. First, rent looks like rent, meaning that if someone paid $30 in rent over 6 days at $5 per day, the collected rent entry shows $30, not 6 entries of $5. Depending on your perspective, that can be a good or bad thing. Since we're looking at collected entries of an account, I think each account entry should only get one line, so this seems like it's a logical fit. The second thing is that I might be able to do away with a collected page altogether, and simply add a 'collected' column to each account/ledger. Not sure on that, especially since we'll be wanting a date range, and probably a selection of which accounts consititute payment (such that the user could simply see rent collected in cash or similar). In any event, this is NOT working at the moment, I seem to be getting invalid data. To figure this out, I'm going to check in now, revert back, and print the results for reference, since it was working before this change, back at r320
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@322 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 20:23:46 +00:00
abijah
dc79667dca New generic mechanism for subtotaling columns. This is NOT an ideal solution, as it only subtotals for the current grid page. Hopefully we can get something better into the app controller at some point
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@321 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 20:15:56 +00:00
abijah
8039495e18 Added a couple more virtual functions for more controller flexibility.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@319 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 18:34:24 +00:00
abijah
46417de2b8 Implemented a list that checks for collected rents. There is AccountsController::collected, which I'm keeping at the moment, but I decided to move the logic into ledger_entries, since ultimately that's what we want a list of and it doesn't make sense to add a bunch of LedgerEntry logic into the jqGrid query of AccountsController. Of course, right now there is hardcoded calendar functions, and hardcoded exclusion of the Concession Account. I will probably offer up two calendars to provide a range, and a list of checkboxes of each payable account.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@318 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 18:01:01 +00:00
abijah
14ab0975ac Eliminated the unnecessary $A Account variable in the actual Account model (duh)
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@316 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 16:50:13 +00:00
abijah
06bf383707 Added a file with some javascript date/time routines. I don't think we want it, but at the same time, I can't bring myself to toss it. May as well capture a revision and I can delete it later.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@314 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 15:54:44 +00:00
abijah
e29c2ba927 Added flag to allow ledger entry reversals, regardless of the reconciled status. I'm not sure how we really want to handle reversals.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@312 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 15:50:48 +00:00
abijah
cec4fb4fdd Added debug link to create all new ledgers
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@311 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 15:37:52 +00:00
abijah
d5c80a65b3 Forgot to check in the model as part of the last change set. Guess that's what happens when you're tired.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@310 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 15:37:17 +00:00
abijah
0c0033d1f5 Added mechanism to reverse a ledger entry. For now I've restricted it to those ledger entries that have not already been reconciled in some way. More thought will have to go into this, especially with respect to tenants who have pre-paid and then move out early.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@309 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 09:06:36 +00:00
abijah
d683895413 Eliminated the need for the Invoice Account. I'm having a bit of a hard time believing that it works, since it sure seems like we needed the Invoice account for some reason. However, it's entirely possible that we really just had it for symmetry with Receipt (another account which we'd love to delete). It needs more testing, but it works good enough to check in.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@308 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 08:23:55 +00:00
abijah
f7b81ec615 Not terribly happy with the solution to the extra transactions problem noted on the last checkin (however, it does seem to be working). I simply keep a record of the split transaction id, pass it back to the caller, and expect it to be passed back in. Works for now, even if it isn't terribly elegant.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@307 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 08:10:23 +00:00
abijah
aa36213698 Moved invoice/receipt code into Account. It appears to be broken in that the receipt ledger_entries are all getting a uniqe transaction. I'll have to look at this tomorrow.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@306 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 07:26:17 +00:00
abijah
ad3d1c92bf Fixed stupid syntax error
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@305 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 07:24:14 +00:00
abijah
fa17e319e0 Fixed a bug causing leder_entry lists to only list one item from each transaction (although the numbers were right, the other ledger_entry fields were not). This was due to the changes I made to ledger_entries.ctp when moving everything to the Grid Helper. Prior to that, the default was to group by transactions, unless notxgroup was defined. Since it was experimental, it was hardcoded to false in the ledger_entries element, so there was no problem. After Grid Helper, it was inadvertantly deleted, hence the bug. I changed the default to be NOT to group by transaction, and also invalidate the ledger_entry fields when we do group that way. So, this bug should be put mostly to rest, although I don't like converting the ledger_entry list into a simple transaction list (we do have another element for that after all). Oh well, works for now.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@304 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 01:52:32 +00:00
abijah
b96a8f01da Fixed the bank deposit, which was not reconciling the income received with the actual deposit. Thus, there was no way to determine when a particular check, for example, was actually deposited in the bank... the trail was broken. This seems to work. I would like to move some of the logic in Transaction to simply use the Account::postLedgerEntry function, but I'll not do it just yet... other fish and all.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@303 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 01:44:46 +00:00
abijah
62b27ec255 clean up lingering comments.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@302 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 00:46:31 +00:00
abijah
30292bb4f5 Final tweaks (for now) to ledger entry view. Hopefully didn't break other summary boxes.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@301 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 00:45:17 +00:00
abijah
0d3403032c More changes to the ledger_entry view
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@300 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 00:34:43 +00:00
abijah
42dda55643 No real visible changes, but started work on making ledger entries more clear. I'll do more in a moment, just capturing a snapshot.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@299 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 21:21:49 +00:00
abijah
b9a67fa8e1 Fixed bug with undefined Lease.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@298 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 10:51:57 +00:00
abijah
6c89536073 Changed security deposits to be returned regardless of where second half of the ledger entry is
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@297 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 10:49:19 +00:00
abijah
43382f4ab1 Implemented bad debt write-off. This was tested about as well as the last checkin for security deposit utilization. Also, both of these need a redirect. I'm thinking redirect will have to be controlled dynamically, since we probably want to have them in a sequence of pages daisy changed at move out. Of course, we also will allow them each to be run on their own individually.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@295 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 10:06:56 +00:00
abijah
b79df98d36 Forgot to add apply_deposit.ctp to the last checkin.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@294 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 09:35:50 +00:00
abijah
99904f22bb Stripped security deposits out of the Receipt page (and bad debt too). Added a dedicated security deposit utilization page. Works, I think, but my eyes are closing and it really needs fresh eyes again in the morning.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@293 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 09:28:29 +00:00
abijah
bcbe3767e3 Check in the near completed implementation of security deposit utilization. It was on it's way to working well (although it only works for existing payment divs and there is not an obviously easy way for new payment divs to have the security deposit info as well). It feels like we've really gone overboard on the payment screen, pushing too much together. I'm going to strip some of this out on the next checkin, and create a dedicated security deposit utilization screen, perhaps just as part of move-out, or perhaps part of move-out and as an independent operation as well.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@292 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 07:25:55 +00:00
abijah
ba82eabcbc Fixed a bug created with each form table when that element was modified to ignore fields set to null. The original intention was that null simply meant 'no special configuration'. However, we needed a way to programatically enable/disable fields, so null was an obvious choice to use. Now that I'm about to check in, I think I should have just made a minor change to use false to skip a field, which would have been backwards compatible (except for the one place using null to exclude the field). However, it's done now, so what the heck.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@290 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 16:07:19 +00:00
abijah
e15f053c5c Changed the list of payment types to be dynamically generated. This works OK, but the list is longer than is probably useful, and more importantly, some of these types need to be associated with a lease, such as a security deposit. Not sure how I'll handle that.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@289 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 09:20:04 +00:00
abijah
0c8035b402 Removed monetary_source_type. It was redundant, and it's entirely unclear what purpose it ultimately would or could serve. Our use of different accounts for Check, Cash, etc likely obsoleted any intention we might have had for monetary_source_type
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@288 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 08:28:34 +00:00
abijah
55413590a2 Shouldn't check this garbage in, but I can't bring my self to revert it
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@287 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 07:50:44 +00:00
abijah
99a787bba6 Initial work to determine whether or not a lease has charge gaps, and when the lease has been charged through.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@286 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 07:22:38 +00:00
abijah
fb29380ac5 Added ACH and Concession entry. Like everything else, I haven't tested too robustly, but it does seem to work. I might want to change the monetary source id for Concession. Right now each concession gets its own monetary source, but we could probably use a common one without issue.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@284 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 06:10:00 +00:00
abijah
37beb8b436 Since adding the MODEL_ALIAS condition to LedgerEntry (which only works for the Linkable Behavior), the read() ails when it tries to link models together. Setting recursive to -1 solves the problem (or at least, the symptom).
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@283 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 06:08:31 +00:00
abijah
0e1b0c111e Fixed problem when nameToID returns no results.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@282 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 05:27:13 +00:00
abijah
7483f6ed2c Implemented more around lease closings.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@278 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 02:57:43 +00:00
abijah
a45fd6879d Removed the comment from lease move-out, and tweaked the form_table to support it
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@277 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 02:57:29 +00:00
abijah
09090d1b3c Consolidated the move out/in pages. I'm really not happy with this checkin, as it has actually reduced functionality. We used to be able to click move-out on a customer and be presented with a list of units to move out of. This was the intention, but I've gotten frustrated with the fact that I'm working on non-MUST functionality. Things are working good enough at the moment, so I'm checking in and will have to come back to this later.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@276 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 02:19:14 +00:00
abijah
dbd914ff78 Changed move_out to use datepicker in the same way as move_in. I'll probably be wiping this out later to have move_out behave more like move_in and present customer and unit selection boxes.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@273 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 00:40:24 +00:00
abijah
222758b20f Modified the datepickerNow() function to return results without the time (just date). Updated the move_in datepicker to use it and added a link for the user.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@272 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 00:31:56 +00:00
abijah
233b08df59 Made the same layout changes from H2 to CSS with the move_in page
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@271 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 00:21:48 +00:00
abijah
849077bb9a Made layout changes to invoices and receipts to use CSS instead of simple H2/H3 tags. Also, as a temporary measure, I make the lease/customer numbers hyperlink to the view page. At some point we'll figure out what should happen after entering a receipt or invoice, and this hack should go away.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@270 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 00:00:29 +00:00
abijah
c01c67161e Fixed bug for receipt linking to lease ID instead of customer ID
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@269 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 23:55:22 +00:00
abijah
75c44d1b3a Removed the pages controller and view, as well as the default route. I can't believe I let it linger for so long...
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@268 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 23:30:13 +00:00
abijah
2aeb069297 Fixed bug where the customer list would display 'Current Tenants', but the list would reflect all customers.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@267 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 21:53:30 +00:00
abijah
21534c28d8 More work to make the db scripts general
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@266 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 21:49:00 +00:00
abijah
5f0c2463e3 Removed the hardcoded script location, and added some extra debug information
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@265 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 21:33:52 +00:00
abijah
7e0d8a9da2 Modified which columns are displayed for ledger entries
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@263 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 20:57:11 +00:00
abijah
4d123b63f0 Moved all grid elements onto the grid helper. Basic testing done, but more testing needs to be done.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@262 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 20:40:44 +00:00
abijah
a88f5829ce Moved the leases element onto the new grid helper.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@261 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 19:22:22 +00:00
abijah
5c29200428 Minor tweak to allow more size selections in the drop down list.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@260 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 19:19:42 +00:00
abijah
33fa8e732c The grid helper now functions. We may need to tweak it when looking at some of the more complicated elements like ledger_entries.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@259 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 19:19:05 +00:00
abijah
6c62d66068 Actually, we need to get away from calling things jqGrid except at the lowest point. We don't want to switch vendors and have all these items continuing to be called jqGrid. Just Grid will work.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@258 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 17:35:36 +00:00
abijah
4e2b073110 Added a helper to jqGrid, since duplicated code is getting spread through each element. The implementation is nowhere near complete, but the basic idea is there.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@257 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 17:33:43 +00:00
abijah
abd166cb98 Modified effective dates to be part of the ledger entry, not the transaction. This is the logically correct way, as a transaction is simply a collection of entries which might be anywhere from completely aligned to totally disjoint from one another (more likely the former). As a practical example, consider a move-in invoice, with security deposit (effective immediately with no end date), a prorated rent (effective move-in day through the end of the first month), and first full months rent (effective beginning of next month through the end of next month). There is certainly more work to be done on this, and testing was minimal. It does seem to be functioning though, so I'm checking in.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@256 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 16:04:53 +00:00
abijah
cb627b8ec7 Fixed a cut/paste error when moving code from the Transaction model into the App model.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@255 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 14:48:34 +00:00
abijah
c455b383f5 Updated the balance algorithm for units and customers as was done for leases.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@253 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 00:34:03 +00:00
abijah
ba36729485 Fixed a couple sort order issues, and modified the balance results to always return a number (zero) instead of null. A Lease should always have a balance, unlike Units where it's appropriate to have an null balance on a vacant unit.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@252 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 00:32:22 +00:00
abijah
011c05d098 Implemented the balance field of Leases as part of a single query. This not only reduces the number of queries required, it also allows balance to be a sortable column, so that we can determine which customers are overdue.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@251 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 16:08:56 +00:00
abijah
aa2e647199 Added mechanism for user to know the rent amount on the invoice screen.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@250 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 09:00:54 +00:00
abijah
472d2d7166 Modified the page redirects to flow 'new customer' => 'move-in' => 'invoice'. What's missing here is the addition of contacts, but I'll ignore for now.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@249 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 08:09:51 +00:00
abijah
9ea397ff8f Removed lingering debug prints
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@248 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 08:08:36 +00:00
abijah
9c65d408fa Added a flag to accounts, indicating whether they can be used for charges and/or payments. Invoice has already switch to this mechanism, but we're keeping receipt the same for now since I have bigger fish to fry.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@247 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 07:52:41 +00:00
abijah
ae85ed7907 Experiment to provide a fieldset around the transaction details. I didn't care too much for the looks of it, so I commented it out for the moment. Ultimately though, there is going to be confusion over having two comment fields, so if we intend to keep them both, we'll need to clearly distinguish the purpose of each.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@246 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 07:21:22 +00:00
abijah
019b97fe53 Modified to dynamically determine eligible charge accounts, instead of the two that were hardcoded.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@244 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 07:14:18 +00:00
abijah
ae442db01f First pass at having invoice support multiple charges, just like receipt/payment. It works well, but I know we still need a better solution for income accounts, and it hasn't been robustly tested yet.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@243 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 04:37:04 +00:00
abijah
65e3c99ae9 Fixed invoice reconciliation. This was original modified from the receipt code, but we know that receipts and invoices are not mirror images in our current implementation. So, no surprise then that this was broken.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@242 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 04:34:18 +00:00
abijah
d4ceca3aeb The only functional change was to start payment numbers at 1 instead of zero. All other changes are just white space and code movement.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@241 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 04:33:06 +00:00
abijah
4ea8f1ae42 Took some of the new learnings from invoice generation and put into receipt generations. Also moved some shared functions to pmgr.js, and renamed things for consistency.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@239 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 02:55:55 +00:00
abijah
c1b402bd72 Moved the Invoice/Receipt logic into the transactions model. Adding an invoice will likely need to be tweaked to expect customer credits, and apply either automatically, or with user discretion.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@238 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 01:29:03 +00:00
abijah
ca0ddcbc29 Fixed late charge cut/paste error
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@237 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 01:28:03 +00:00
abijah
5f8ae73049 Charge/Invoice assessment is working fairly well. Still need to accept multiple charges on a single invoice, have client side validation, and post through ajax to allow posting repeated invoices.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@236 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 00:43:41 +00:00
abijah
66e2647c05 Moved the debug grid query link into the caption bar to minimize layout distractions.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@234 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 23:17:53 +00:00
abijah
81e415e5bd Moved date formatting fully into the AppModel, automatically determining the necessary fields from the schema.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@233 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 22:23:40 +00:00
abijah
85756975ae Modified the form table to support a variety of extra texts and/or columns
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@232 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 19:22:27 +00:00
abijah
58d3cbf66b First pass at entering charges for a lease. This works, but does not have the ability to add multiple charges, and does not mirror the payment method, which is ajax based.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@231 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 18:34:44 +00:00
abijah
850d15eb50 Moved the contact save logic into the model and out of the controller.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@230 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 17:25:05 +00:00
abijah
280c5dae55 Fixed comment block
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@229 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 16:59:13 +00:00
abijah
50e7f58d35 Changed the logic a little bit in the customer model saveCustomer function, such that we can provide a default customer name if otherwise unspecified. Changed the page titles to reflect Customer vs Contact, since they can easily have the same names.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@228 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 16:57:23 +00:00
abijah
47104919f2 Moved the customer save logic into the model
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@227 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 15:45:49 +00:00
abijah
4dac7a7f0c Added empty view for debugging.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@226 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 15:40:32 +00:00
abijah
d51c29bc91 Added a datepicker to the move-out view and put the input fields of both move-in and move-out into a table to tidy things up a bit.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@225 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 04:32:14 +00:00
abijah
8237ca1f9d Changed leases element to understand some common fields
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@224 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 04:30:03 +00:00
abijah
87f0d3217a Changed the lease 'payment' action to just point to the customer payment instead. Makes my life easier at the moment...
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@223 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 03:35:09 +00:00
abijah
fbd43fbbb2 Cleaned up and got rid of the word Tenant in most places. The original thought was to minimize confusion in our specific case (since we don't sell POS items) by simply refering to customers as tenants. However, I don't think customers is a very confusing term and so I decided to clear up the inconsistency. I did leave it in a couple places, where the customers in questions are clearly tenants
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@222 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 03:34:33 +00:00
abijah
826874b2a5 Changed layout to enlarge the detail table on the edit page. Changed edit action to redirect to the view page.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@221 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 03:09:54 +00:00
abijah
eab49091ae Implemented ability to add a customer, and fixed the problem with flagging of the primary contact.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@220 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 03:01:28 +00:00
abijah
e150237fd8 Implemented edit functionality for customer. Like with contacts, the interface leaves much to be desired, since it's limited in functionality. Namely, you can add a contact, but you can't add contact methods (phone/mail/email). Also, it doesn't use jqGrid to present the selection choices, and so the user is stuck with the fields we've chosen to display, as well as the sort order we've chosen. Enhancement is possible someday, but for now, it gets the job done.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@219 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 02:06:23 +00:00
abijah
207808d6d5 Added ability to add a new contact, which also fixes the glaring omission of saving changes to contact details on the edit page (previously we were only saving contact methods, not any contact details.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@218 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 00:42:57 +00:00
abijah
dc787bd9e7 Finished implementation of contact edit. This is now saving everything to the database. I hope to now leverage it for a new contact. This checkin includes a bit of code in the sitelink2pmgr script that sets the customer display name. It should have been checked in several revisions ago.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@217 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 23:43:35 +00:00
abijah
61af7693cd Changed order to Phone/Address/Email to be consistent with other areas
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@216 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 23:33:47 +00:00
abijah
24245e24f1 Added logic to prevent the empty string from entering the database, using NULL instead
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@215 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 23:33:07 +00:00
abijah
ae276d310a Moved the customer edit page to include address and email fields. This is largely all the work on the presentation side, now I just need to take the data and update the database.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@214 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 20:01:06 +00:00
abijah
0f9bafab31 Changed the addition of a dynamic div to slide into place instead of just popping into place.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@213 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 20:00:02 +00:00
abijah
41aa3f81a8 Got the existing contact phone numbers to populate correctly. I've chosen to disallow editing of these numbers, since a) it's tricky to do this in place, and b) it will be too confusing at the moment to handle this on a separate page, and c) I don't want to implement a modal ajax box at the moment, and d) doing so would probably be a user error liability, since folks would choose to edit a shared number instead of adding a new one when the situation would warrant the latter.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@212 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 18:32:54 +00:00
abijah
bb78a85d1b Changed the dynamic div generation to occur under PHP instead of directly under Javascript. This allows us to create a div on the server side making it directly part of the page (which is how we'll populate it with existing values).
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@211 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 17:30:59 +00:00
abijah
90604bf672 Doh! That's what happens when you make a seemingly innocuous change right before checkin...
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@210 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 15:04:09 +00:00
abijah
bb5c44f19f First shot at an actual working form to enter contact information. It only handles phone numbers at the moment, and it does NOT handle existing ones. It's a decent start though, and worth checking in. Next I'll have to handle existing phone numbers, and then addresses and emails. Of course, after that, I'll have to actually save everything to the database.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@209 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 15:01:18 +00:00
abijah
6c656b07c3 Nowhere near complete, but a quick checkin to the contacts edit view so I can clean up some of the commented code that's getting intrusive.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@208 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 02:48:23 +00:00
abijah
5f82404a4f Changed the relationship between grid visibility and text of the selected item.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@207 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-04 17:38:22 +00:00
abijah
9bb957aff4 Got rid of the temporary function to determine unit status enums, and switched over to actually querying the database. Eliminated a legend entry for DELETED since no one should ever see a unit like that given that it should be, well, deleted. Modified the legend algorithm slightly to fix the number of rows instead of columns, since the placement algorithm works through the rows before moving to the next column.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@206 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-04 04:42:11 +00:00
abijah
b335378edb Moved menu items unintended for long term into a 'Debug' section of the sidemenu bar
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@205 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-04 04:13:09 +00:00
abijah
3a1fb00527 Added ability to move an existing customer into a vacant unit. Changed out all of the 'amount' fields with 'rent', since it's much more self-explanatory. We still need the ability to add customers and contacts. I'll consider doing this by using the insert row ability of jqGrid.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@204 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-03 06:53:41 +00:00
abijah
6adf7e2358 Added some revisit comments for move-out.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@203 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 20:05:56 +00:00
abijah
99504c6de5 Finished basic functionality for Move-Out. This still needs some work to handle the security deposit.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@202 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 20:00:50 +00:00
abijah
e060c16252 Fixed a bug when viewing ledgers (related to the Close change), removed some debug code, added titles to the deposit pages, and fixed a bug with creating new transactions and/or balance transfers for a deposit when there is nothing to deposit.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@201 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 09:33:42 +00:00
abijah
ed673de22f Added a closes table to the schema, so that we can keep track of daily closes, deposits, etc. Moved into the model an operation to close a set of ledgers and make a deposit.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@200 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 09:19:33 +00:00
abijah
dfe61cbc2a Added ability for callers to control the jqGrid sort order
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@199 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 09:16:42 +00:00
abijah
b5d7ecc269 Got the bank deposit working well.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@198 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 07:41:18 +00:00
abijah
5fa166e881 Added link to quickly reset the site data. This will help external testers as they won't have to worry about screwing up the data. Obviously, this is for debug purposes only and will need to be removed before going live.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@197 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 01:40:32 +00:00
abijah
ea1ad4764f Implemented a bank deposit routine, to transfer funds out of the till and into the bank.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@196 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-01 11:10:57 +00:00
abijah
dfe20e7ef9 Finally, finally... a working version for payment entry. The current schema is working well, and seems to handle our technical needs. However, it does seem to be very confusing with the extra accounts. Nonetheless, it does work and so I'll keep going down this path. This checkin also includes a mechanism to close the books on an account (by closing the underlying ledger) and start a new ledger. One of the decisions worth revisiting is separating out ledger entries that are really part of the same transaction. Without this change, inspecting a transaction results in the transaction total being off by a factor of two, since all money movement is in their twice (once for the expected reason, and again to hit the invoice/receipt ledger).
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@195 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-01 08:17:31 +00:00
abijah
3550bf775c Merge in the bug fixes made to Linkable, as well as the better logging mechanism.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@194 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 18:11:40 +00:00
abijah
5558079dcc Merge in some desired changes from the statements_20090623 branch
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@193 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 18:09:17 +00:00
abijah
18e1f4986a Since Lease.number is a VARCHAR, it doesn't sort well. So I added a hidden column for Lease.id, which sorts better.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@192 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 17:56:32 +00:00
abijah
4b6da6cffa I quickly bailed on regressing back to charge/payment, as I don't see it solving the fundamental issues I'm having. In fact, I've decided to push forward with Invoice/Credit accounts, something I'm not fond of, but that at least was working. This checking is just a branch rename to reflect that fact.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@191 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 17:54:54 +00:00
abijah
9fea9c79f3 Moving back to the Invoice/Receipt mechanism. Seems to work fairly well, even if it's non-standard.
git-svn-id: file:///svn-source/pmgr/branches/charge_credit_20090629/site@189 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 04:47:18 +00:00
abijah
10f71a1fe3 Branch to revert way way back and get down to simple items, even if it's not extensible.
git-svn-id: file:///svn-source/pmgr/branches/charge_credit_20090629/site@188 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 01:06:33 +00:00
abijah
73eacdbcf2 More changes. I just can't seem to come up with a solution that works that I like. The problem now, without invoice/receipt, is that one check cannot cleanly pay for two units.
git-svn-id: file:///svn-source/pmgr/branches/single_AR_20090622/site@182 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-24 00:33:39 +00:00
abijah
009ea6b44d Nowhere near done yet, but checking in a snapshot of semi-working code. There is some simultaneous support for both with and without use of the Invoice/Receipt account. I want to do away with them completely, but will need to change how sitelink payments are mapped (right now, they split a payment into multiple parts to match the charge).
git-svn-id: file:///svn-source/pmgr/branches/single_AR_20090622/site@181 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-23 19:04:41 +00:00
abijah
7ea002850a Moving to the standard accounting method of a single Account Receiveable.
git-svn-id: file:///svn-source/pmgr/branches/single_AR_20090622/site@180 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 23:46:03 +00:00
abijah
eee3d45c5d Prevent grouping of ledger entries by transaction, at least for now.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@178 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 23:40:53 +00:00
abijah
de93c7545b Experiment to group ledger entries by their transaction ID instead of their entry ID.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@177 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 19:03:08 +00:00
abijah
e00e10bbb5 Added a balance column to customer. Like lease, since it's based on additional queries for stats, it's not sortable.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@176 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 17:58:13 +00:00
abijah
3953e1dbf3 Added stats summary to the top level for lease. For consistency, I want all stats to be summarized at the top.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@175 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 17:55:32 +00:00
abijah
788cbde710 Due to the way we're adding in stats for each lease as a separate query, there isn't presently a way to sort by balance. Therefore I've disabled sorting on that column, which can be revisited if we reduce the grid down to a single SQL query.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@174 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 17:46:49 +00:00
abijah
4a064df594 Fixed problem with sorting by entries/debits/credits/balance
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@173 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 17:43:24 +00:00
abijah
c048d44972 Checking in completely non-working code, as I'm just trying to get a full checkin before the weekend. I cannot yet seem to get the Reconcilation entries to save.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@172 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-19 16:22:28 +00:00
abijah
f6d6659d2a Got rid of the custom paging functions, since it's no longer used, and added a function to convert dates into SQL format. Added a beforeSave callout to Transaction to convert the date before saving.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@171 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-19 16:21:16 +00:00
abijah
19cee7290f Fixed a bug that was leaving unreconciled entries in the list of reconciled entries.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@170 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-19 16:19:18 +00:00
abijah
3c067f6586 While working on payments, commented out the form reset stuff so I don't have to keep reentering the data with every post. Also, changed the customer ID to be passed outside of 'Customer', which appears to cake as a model that needs to be updated. Finally, added a bogus parameter, until I can figure out why the Model::set() function fails to recognize model fields if the first item in the model array is another Model. This bogus field just ensures Model::set uses all the fields, and bogus is ultimately ignored since it's not a member of LedgerEntry.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@169 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-19 16:17:14 +00:00
abijah
f7bcfef665 Added a ledger listing to the Lease view page, which was otherwise quite empty.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@168 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 04:19:17 +00:00
abijah
d06f34de9a Modified Transaction view to use jqGrid for entries. Also fixed a bug in the ledger entries element, since there is no way for credit/debit to be populated without a ledger_id, it makes sense to base the column displays on the presence of ledger_id.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@167 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 04:07:52 +00:00
abijah
d5388e7767 Although I'm not too happy with the modifications, I do have a working version that minimizes the columns need to display ledger entries. The logic feels screwy to me, but I've beat my head on it long enough. I'll move on to something else and come back to it when my head clears.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@166 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 03:57:43 +00:00
abijah
5a88f29600 Modified to prevent stepping on the user's action if already set.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@165 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 03:45:43 +00:00
abijah
8dd64f60bc Fixed a confusion over the usage of the 'opposite' function, which was converting, for example, from 'ASSET' to 'credit'. However, it seemed like it could be used to convert from 'debit' to 'credit', but it didn't work that way. So, I modified it to do so, and made things a bit more robust by making the comparisons case insensitive.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@164 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 03:43:05 +00:00
abijah
de2319e93d Further progress on payment entries. There is an outstanding charges grid, but it doesn't have amounts due to the way I designed the ledger_entries element. I'll do a bit of rework on that next.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@163 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 00:49:40 +00:00
abijah
1fbc452581 Changed the unreconciled transaction list to always include 'debit' or 'credit', even if the user specifically requests one or the other. Handling it as a special case everywhere was bothering me.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@162 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 19:12:22 +00:00
abijah
65acd0e181 Added routines to reconcile a new ledger entry against unreconciled entries. I haven't tested it robustly, but it seems to work on the surface at least.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@161 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 18:40:39 +00:00
abijah
f5bb9bac83 Stopped the debug output when dynamically adding a div
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@160 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 18:39:12 +00:00
abijah
45ae013e99 Removed remnants of the Containable behavior (which we've already put into the application model. Modified the account model to look for all unreconciled transactions, not just those from the current ledger. Added a mechanism to find unreconciled transactions up the chain, including lease and customer.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@159 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 09:00:38 +00:00
abijah
16126b7b6e Fairly decent first pass at determining which ledger entries have not yet been reconciled for an account. I'm using the current ledger only, which I'm sure is not what we want. Since it works though, it's worth checking in.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@158 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 08:32:53 +00:00
abijah
fdd3fe2641 Getting the receipt/payment data in order, getting ready to save (or at least experiment with save.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@157 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 07:38:39 +00:00
abijah
c340c25eee Fixed bug converting PHP strings to javascript when they contain the single quote (') character
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@156 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 07:37:45 +00:00
abijah
b8de98917a More progress on posting payments. Customer selection now works as well as the date picker. At this point, we need to figure out how to insert this data into the database. Of course, significant cleanup is still required, as is beautification.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@155 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 05:17:59 +00:00
abijah
d6c7fbb735 Added a refresh button to every jqGrid. I added a search button too, but I feel like the modal dialog needs to be tweaked to be useful. Oh well, good enough for the moment since it comes for free
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@154 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:55:41 +00:00
abijah
5dd3efa12f Added initial support for ledger entry reconciliation (e.g. matching payments to charges).
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@152 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:40:46 +00:00
abijah
cb02b9e1e0 Further tweaking to the linkable behavior, first by fixing the $efields addition from the last checkin of this file, and second by fixing a problem with linking onto a HABTM relationship, since the alias was coming out screwy (although this issue was hacked by using 'table' to determine the class and alias).
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@151 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:39:27 +00:00
abijah
212c982851 Removed the lengthy and overly verbose URL from the debug output, since it can be easily determined from clicking on the provided link.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@150 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:37:15 +00:00
abijah
0aa94b8fe5 Added a virtual callout for grouping
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@149 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:36:19 +00:00
abijah
76e9b7590f Working version of the Linkable behavior that allows for a HABTM joining table to have an alias specified (thus allowing more than one instance in a query). I don't like the $efields bit though, and will change that on the next checkin. Don't want to lose a working version though!
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@148 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 17:19:07 +00:00
abijah
af405a44d5 Yet another place where Ledger.name was being used.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@147 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 08:38:31 +00:00
abijah
1f9772e926 Fixed bug created when controller was added as an optional parameter to Links
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@146 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 04:48:52 +00:00
abijah
b1a0437117 Removed another instance of using Ledger.name
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@145 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 04:48:17 +00:00
abijah
8db9b90157 Removed another unnecessary field
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@144 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 04:47:38 +00:00
abijah
33b7d3d67d Removed what I believe to be unnecessary fields from the contacts model, since they should be determinable by convention.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@143 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 02:24:39 +00:00
abijah
57c73eafdb Eliminated use of ledger name, since a ledger is just one of the books that make up an account. There is no reason to identify a ledger by a name other than the account name.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@142 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 02:18:05 +00:00
abijah
30b3185473 Added accounts to the ledger entry grids, since it's tough to figure out what's going on without them. This exposed a problem with the controller name automatically being determined in the Links function, so it now looks for an optional controller parameter.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@141 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 23:22:38 +00:00
abijah
e9dd1366bc Further work on the linkable behavior, since it wasn't working right with aliases. It doesn't help matters that models are instantiated from the model associations with their own alias. Thus, the priority of a tables alias is 1) 'alias' as defined in the 'link' structure'; 2) alias member of the model instance; 3) class name of the model instance. I may need to revisit this work later, since while typing these comments I managed to enlighten myself on the alias scheme. But it does seem to work for now.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@140 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 23:06:27 +00:00
abijah
7ee461d993 Added monetary source into the ledger entry lists. This may be more information than is needed on the listing, but I'll take it out later if so.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@139 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 21:52:38 +00:00
abijah
365b2295af Added an element for monetary_sources. Not sure if it will get used, but it was easy enough to do.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@138 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 21:45:07 +00:00
abijah
dfb0d90246 Moved map listings to jqGrid, and fixed cut/paste error in the comments of the transactions controller.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@137 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 21:34:35 +00:00
abijah
af32d88605 Moved transaction listings to jqGrid, and fixed a bug in the jqGrid element wrt. comment columns
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@136 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 21:24:42 +00:00
abijah
c9c06a9fb4 Updated all the view.ctp files to use the new style infobox. I should probably create an element for it, but I'll hold off for now.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@135 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 21:01:22 +00:00
abijah
c3139220ee Moved the ledger_entries controller/view to jqGrid.
Changed the app controller jqGrid virtual functions for getting the tables for both count and the full query.  The ExtraTables bit was too confusing, and was only intended to allow the user to specify a subset for count and augment it for full query.  This is easily accomplished by having DataTables just call DataCountTables first... one line solution ends the confusion.

Modified linkable behavior to support a %{MODEL_ALIAS} tag, which is replaced in the relationship conditions at runtime with the actual model alias.  This is experimental at best, and certainly will create a problem for any model that ends up using the conditions in 'contain' instead of 'link'.

Broke the LedgerEntry->findInLedgerContext function out into multiple pieces, so those same pieces could be used in the LedgerEntries controller to populate jqGrid.

Changed the ledger_entries element, as a special case, to also allow listing control from ledger_id and account_type, instead of idlist as a mechanism for populating the grid.

Changed the infobox summary css, which will break several pages until I rework them.

Some next steps include fixing the broken infoboxes, and changing the transactions view to use the ledger_entries element.  This also means the ledger_entries element will need to add support for idlist, or if we have any credit/debit issues, perhaps another custom transaction_id instead.



git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@134 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 19:41:20 +00:00
abijah
68273302cb Removed the useless pagination code from ledger_entries
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@133 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 06:46:05 +00:00
abijah
abd45244e1 Changed account to split the table requests into two parts.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@132 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 06:31:21 +00:00
abijah
e3b838d62a Moved ledgers over the jqGrid. Working reasonably well at the moment.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@131 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 06:22:38 +00:00
abijah
5fd7483ac1 Updated accounts to use jqGrid.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@130 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 04:15:55 +00:00
abijah
274ed13644 Fixed an issue with debug output when including more than one grid on a page.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@129 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 04:15:35 +00:00
abijah
4537174873 Added mechanism to easily create links in the listing grids. I'm not very keen on how it works, but it's good enough for the moment, unless/until I figure out how to push this to the view. If it should stay in the controller, I'm sure a more sophisticated mechanism will be required.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@128 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 02:50:21 +00:00
abijah
3c5a31aaff Added debug mechanism to help track grid loading problems. It will obviously need to be taken out at some point, but I'll wait until things are working well enough.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@127 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 02:48:58 +00:00
abijah
fd155aaaeb Moved the pagination objects to the right side instead of centered. Also, replaced the jQuery function call for the pager parameter to just the id text. I found this in the manual, and it saves us from having to use the --special exception.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@126 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 00:44:40 +00:00
abijah
284765e06a I apparently forgot to check the pmgr_jqGrid.js file in a few checkins ago, meaning those revisions are all broken. This is finally the checkin to include it.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@125 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 00:13:57 +00:00
abijah
352e3487cc Minor tweak to the css to create a margin for each grid, and so added a div to wrap each item listing. Changed the search boxes to only be available for the overall item listing.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@124 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 23:54:48 +00:00
abijah
b02695631e Moved all of the jqGrid search javascript into its own file to prevent duplication when including more than one grid on a page. I also put search boxes directly into the jqGrid element, with the requested fields passed in as a parameter. I've got the autosearch mechanism tied across all grids, but search and reload is grid specific. This was mostly to get the code into an extensible spot, but the layout is not yet desirable. I'll yank the search boxes on the next checkin not that its proven out.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@123 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 23:16:35 +00:00
abijah
b6317d3ee9 Fixed a bug in which jqGrid would fetch data from the current controller, not the controller responsible for populating the data. Added the ability to fetch data based strictly off of an ID list, which is useful for lists that are embedded in other pages, where the list conditions are entirely foreign to the controller responsible for providing the data. To assist with this one jqGrid virtual function needed the model added as a parameter, so I added it to them all and modified the jqGrid functions in the existing derived controllers. Right now the elements (such as contacts.ctp, the only working one) receive a full list of data to populate themselves. I could have simply taken this and passed it directly to jqGrid, with no need for further server interaction. However, this could result in some very large lists, and although pagination will ensure the user is not overwhelmed, the connection or the browser could be. Unless we have a strong performance need, I'll keep it this way. In the meantime, I'll leave the underlying data available to each element, in case I have to switch over. When all is proven out, I can simplify all the queries such that the extra data is never requested in the first place.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@122 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 22:05:44 +00:00
abijah
2cbd5da8ee Moved the phpVarToJavascript function into our FormatHelper. It isn't really the ideal place for it, but I don't want to create a new helper (at least, not yet)
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@121 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 20:36:38 +00:00
abijah
960ac108b8 Moved contacts onto jqgrid. Added 'name' and 'longname' formats.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@120 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 20:24:36 +00:00
abijah
0133c85c01 Fixed trivial spelling error in one comment block
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@119 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 20:12:52 +00:00
abijah
92d8387e8c Made the app controller include the action by default. Added virtual callouts for data order and limit. Changed fields to use formatting, including a custom format for currency and id. Added a function for auto conversion from PHP variables to javascript. Fixed some minor bugs in the controllers already converted to jqGrid. Moved leases onto jqGrid.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@118 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 19:50:09 +00:00
abijah
67d640b1a0 Moved units onto jqGrid. Also generalized the jqGridSetup (now jqGridView) function and moved it into the app controller.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@117 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 05:33:30 +00:00
abijah
ddf4d5cb29 Fixed minor issue where an empty query could continue to persist.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@116 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 05:14:36 +00:00
abijah
2143960ce9 Moved all the jqGrid logic into a separate element, in anticipation of moving all lists to jqGrid
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@115 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 05:04:41 +00:00
abijah
06a4a25be8 Yanked the multicolumn toolbar, and returned to my simple text boxes. I will probably end up going with these search boxes, or the modal box (perhaps with autosearch) if I can't come up with a better idea.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@114 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 04:40:47 +00:00
abijah
25677ffa5e Got the mulitcolumn search toolbar in place, but it's not working. First I haven't managed to get an autosearch working (searching as you type). Second, and much more critically, I don't have the controller correctly responding to search terms, as it was implemented rather poorly. I'm moving on for now.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@113 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 03:22:53 +00:00
abijah
f06d831329 Testing implementation of an autosearch functionality, which works. Probably wasted, as I suspect I can get this directly out of jqGrid
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@112 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 01:27:58 +00:00
abijah
eefc0d7bce Split the jqGrid code out a bit further, giving the application controller full responsibility for handling the jqGrid requests. Virtual functions have been added to allow a derived controller to customize this action as needed.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@111 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 00:53:08 +00:00
abijah
046ffba340 Moved all the vendor css & js code into webroot. Although it technically was working fine, cake apparently steps on the fact that the file doesn't change between requests, leading the browser to re-download the code with every hit. Under the webroot directory, cake returns code 304 if the browser already has a copy cached.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@110 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 00:46:12 +00:00
abijah
cf0da7d3c2 Added query ability to the customer grid. There is a bug with the paging code, but it roughly works.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@109 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 21:20:11 +00:00
abijah
95181f4718 Things are finally working fairly well for the customers grid (although I've not yet taken any speed issues into account). I removed the index.ctp file, since it was largely useless and I figured out how to render directly to the element. I also moved most of the jqGrid XML code into the application controller, since it will be reused by most of our controllers.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@108 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 20:46:17 +00:00
abijah
447c6a8376 Moved the position of the Loading... message on jqGrid. It probably doesn't matter, as we customize the grid, we'll likely add an icon instead of text to indicate loading.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@107 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 20:44:36 +00:00
abijah
54291b4467 Another attempt to get the customer table working. Cake's query mechanism is really torquing me, it never seems to be able to do what I need (perhaps because they've generalized it to work with so many SQL engines. I'm just going to pull unit information out all together, and I can add it back in another day if needed.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@106 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 15:52:09 +00:00
abijah
94c78ccb2a Check in aother snapshot, since I can now pass complex structures from the view back to the jqGrid data provider
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@105 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 07:22:38 +00:00
abijah
323c88a669 Added a primary contact for each customer, as there must be someone (or some entity) to contact for every customer. This simply makes it explicit, and has the added benefit of being easier to work with when querying.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@104 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 04:19:19 +00:00
abijah
3fb680e20f Added jqGrid 3.4.4 and started the work to upgrade our table to use it. The work is by no means done, but it is at leasting working to some degree. I have some customer changes in mind and want to switch gears, so I'm checking in.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@103 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 03:51:29 +00:00
abijah
cbdd198be5 Check in a version of the debug toolkit that I've added debug prints to. They're commented out at the moment, but may come in handy later.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@102 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 03:46:17 +00:00
abijah
8cdf061fca More minor cleanup
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@101 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-12 02:45:48 +00:00
abijah
5e321888d5 cleaned up and put the different payment types into a loop for reuse.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@100 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-12 02:35:13 +00:00
abijah
d45481b770 FIrst pass implementation to accept payments. Nowhere near complete, but things are working relatively well, and I have a plethora of different attempts saved in comment blocks. I really want to clean up though, so I'm snapshotting it.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@99 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-12 01:49:24 +00:00
abijah
ff5c7260f8 Due to an apparent bug in the core View class, raw images were not being generated with the inclusion of the DebugToolkit. This checkin does NOT fix the problem, but it does include some debug mechanisms that I have continued to need from time to time.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@98 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-11 02:38:54 +00:00
abijah
e2f623b7ee It seems that the Javascript helper is automatically included, but not if there is a problem with the controller, such as if an action is missing. In this case the user sees a useless error message instead of the normal 'action missing' one. By manually adding the Javascript helper, that problem should go away.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@97 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-11 00:17:13 +00:00
abijah
b47bb9d46e Added the jquery and jquery-ui libraries to the application. Added jquery inclusion in the default layout, on the presumption that it will get used on most pages. I'll remove it and pepper it where necessary if that proves not to be the case.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@96 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-11 00:09:10 +00:00
abijah
9cf245d030 Removed the unintended javascript addition from the last checkin.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@95 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 23:39:40 +00:00
abijah
8bce19d8c4 Added a monetary_sources controller/view. Don't know if we'll really want this, since it might just make the most sense to embed its actions within ledger entry. We'll keep it for now.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@94 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 21:24:05 +00:00
abijah
ab766c2dc5 Fixed to handle the possibility of a NULL monetary source, and tidied the formatting a bit.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@93 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 21:14:26 +00:00
abijah
4a53ebd70b Added the debug toolkit plugin, found on the bakery website.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@92 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 21:12:59 +00:00
abijah
ce735cad3f Added the Containable behavior back into the AppModel, since it's obviously getting used in every controller.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@91 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 21:09:23 +00:00
abijah
ef3b5f3022 Customized our fuzzy 'age' function to suit our purpose
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@90 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 20:20:55 +00:00
abijah
73ea4fa86c Added a formatting method to print the age of a datetime object, and modified the lease view to use it. I anticipate customizing the function to be more fuzzy and less precise.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@89 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 17:06:35 +00:00
abijah
806f732de6 Removed the external account information (such as quickbooks account number) from account listings. This is fairly specific information that probably only needs to be in the account detail. When setting up quickbooks though, I could see it being useful, so perhaps an action in the accounts controller to list all accounts with their external info, or a parameter to the existing actions.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@88 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 15:08:52 +00:00
abijah
b78834f7d6 Fixed problem with units that are vacant, and thus have no current lease.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@87 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 09:10:09 +00:00
abijah
a0274b4d89 Added in security deposit information to the lease view
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@86 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 08:58:43 +00:00
abijah
970b2ad202 Added lease and ledger_entry controllers/views. Minor bugfixes as well.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@85 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 08:53:22 +00:00
abijah
e0d9edc4a8 Primarly a cleanup checkin, although a couple minor bugfixes were included as well.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@82 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 05:14:08 +00:00
abijah
ffd1b64580 Significant changes to work with the new account/ledger structure. Removed much of the auto-generated model association code. Added helper functions into the models to perform model related work, such as model 'stats' (a bad name for a function to return a summary of pertinent financial information from a given model instance). There is a ton of cleanup to do, but first I want to get it all captured.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@81 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 02:41:23 +00:00
abijah
3dcd83229b Fixed problem with relationships that are defined soley on the 'conditions' part of the association, and not on 'foreignKey' (which is allowed to be 'false').
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@80 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 02:31:49 +00:00
abijah
ebc4a42ae9 Fixed issue with the SQL debug output since the error column is typically empty
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@79 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 02:29:33 +00:00
abijah
f08884f326 Finally added a format helper, which has been long intended. There may be still be conversion issues, it hasn't been tested much.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@77 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-08 03:32:07 +00:00
abijah
e740cc859b Added menu items to help me work on development. Some of these will likely be removed later.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@75 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-07 17:06:17 +00:00
abijah
f12a95f3b9 Removed the .bak files, since everything has now been snapshotted.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@72 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-06 20:23:54 +00:00
abijah
677458e942 I'm still in the middle of moving onto a ledger based system. However, I'm am now changing how transactions and entries relate back to the customer. I'll be using a ledger for each lease (for rent, late charges, security deposits, etc), and a ledger for each customer (for POS, non-specific deposits such as reservations or covering mulitple units, bad debt writeoff, and possibly customer credits, when not obviously lease specific). This coming change might not be in the right direction, so I want to capture the work as is right now. This change set is not fully functional. Many operations do work, but there are obviously transaction problems with units and customers.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@71 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-06 20:18:56 +00:00
abijah
ce24abc812 Snapshot of some partial work done with ledger.ctp. There was only a slight change to just the 'mix' ledger, in order to get it working with the new ledger tables. This checkin leaves the codebase in an inconsistent state.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@70 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-06 07:57:41 +00:00
abijah
1ead830ad6 Branching to change the accounting mechanism from the broken charge/receipt/payment to simple, double entry accounting ledgers.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605/site@69 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-06 05:22:11 +00:00
abijah
0848ab5055 Additional work on generating ledger information. I've been reading up on accounting basics though, and I feel I'm just not going in the right direction. I'm checking this in, since it works somewhat, and will probably try to head in a different direction.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@66 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-04 01:54:15 +00:00
abijah
52c72b08b2 Added a couple helpers, including Html, to our app controller and removed Html from each individual controller
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@65 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-03 22:33:03 +00:00
abijah
fc71c058fb Added links everywhere for charge/payment/receipt. Also, minor tweaking to the views in a couple places.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@64 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 08:39:33 +00:00
abijah
dd5402d2f1 Added the payments controller and views.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@63 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 08:15:51 +00:00
abijah
f473a91870 Added the charges controller and views. Fixed a couple minor bugs found with receipts.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@62 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 08:05:53 +00:00
abijah
cdd274adf7 Added a receipt controller to verify receipt data
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@60 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 07:24:51 +00:00
abijah
8ea0822ed1 Removed the test code I'd forgot and left in the table element
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@59 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 07:23:42 +00:00
abijah
492e70b2f6 Fixed copy/paste error
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@58 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 07:23:05 +00:00
abijah
abff728a37 Rolled back the last changes, which were checked in for documentation only.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@57 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 06:28:56 +00:00
abijah
b8c4257f95 Added payments under each receipt in the ledger. This isn't something I really want, just something I was testing. Snapshotting before I delete it, since it did work correctly
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@56 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 06:25:59 +00:00
abijah
5f715cc076 Moved the view action to use the Containable behavior instead of the convoluted bind/unbind
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@55 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 06:17:49 +00:00
abijah
f40dc205f9 Cleaned up the controllers and now make use of the Linkable behavior for listing out items.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@53 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 04:36:28 +00:00
abijah
feaabd29d9 Cleaned up the paginate comment remnants and added the undocumented 'extra' parameter to paginate
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@52 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 04:30:32 +00:00
abijah
f48e7d8907 Removed the named table alias from each of the HABTM joins, since we don't know in advance what name will be used in the actual join
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@51 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 04:29:26 +00:00
abijah
991b5a3317 Performed cleanup, and started the thought process of figuring out how to use one link table multiple times in the same query. My changes worked actually, but I want to wait on this to see if I can figure out if there is already a core solution (since it seems likely that things behaving like a tree would have one table used multiple times in the same query... although they probably get around that by running 100 different queries come to think of it).
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@50 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 04:27:34 +00:00
abijah
68585a0b30 I've been around and around with paging. I started using the Containable behavior, which is fantastic for something like 'view', but is highly problematic for listings, especially with pagination. I discovered the Linkable behavior, and it's much more database efficient, and I actually can get it to work with pagination (except when using GROUP BY). I did have to tweak it though, to handle some of the more complex queries that I intend. This checkin includes a bunch of garbage, but given the amount of time I've spent on this crap, I'm afraid to lose anything that might later be useful information. I'll clean up on the next checkin.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@49 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 02:36:26 +00:00
abijah
a9a570d666 Added some of the original formatting back into the sql log table.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@48 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 02:11:48 +00:00
abijah
15c4b96a2a Minor tweak to the table headers
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@47 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 02:11:14 +00:00
abijah
ce252f2e70 Changed how fields are handled, so that they are all included by default and the user is not forced to specify them. This works with paginate, but the additional fields are requested in the count query. Would like to resolve this, but it doesn't seem to be confusing paginate.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@46 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-31 18:27:21 +00:00
abijah
4b857ff11f Testing out a possible model behavior called linkable. I may not go this route, but I'll just delete it if not.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@45 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-31 17:02:41 +00:00
abijah
6661d26c76 Getting sidemenu ready for more dynamic actions based on context. Couple minor tweaks to layout.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@44 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-30 20:51:07 +00:00
abijah
b409bf09d1 Modified table element algorithm to be cleaner and to handle multiple class types. Modified ledger listings to group the charges and associated payment rows with one color. Fixed summary balance data to come from the controller instead of being created in the view. Created an infobox to carry pertinent info in the top right of the view pages.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@43 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-30 20:07:24 +00:00
abijah
b488054106 Changed how tables are layed out (since I was repeatedly duplicating code in many places) by adding a table element to be used wherever we need a table. This could probably have been a helper instead of an element, but it's not clear to me why one should be chosen over the other, and I already know how to quickly add an element (I think the real choice resides in whether you need a collection of helper functions, or you just want to drop in a chunk of html, i.e. a helper element). Also, a major revamp to the style sheets as well, although more work is clearly needed.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@42 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-30 15:56:41 +00:00
abijah
59398cb3f0 Added comment blocks and context specific side menu link items. Also tweaked the Page titles and headings for the table listings.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@41 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 16:01:47 +00:00
abijah
1145d293b2 Removed unnecessary sidemenu links function, as the overriding class can just call the parent to get the standard links.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@40 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 15:55:50 +00:00
abijah
2feb7f60a4 Minor CSS layout tweak
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@39 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 15:54:33 +00:00
abijah
bd6cc37d4a Initial working version ofa consistent layout with side menu
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@38 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 14:49:11 +00:00
abijah
8dae1ccf84 Added a higher preference for horizontal unit names
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@37 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 06:57:22 +00:00
abijah
50449205b4 The map is working quite well now, including the legend. Next steps will be to add the sidemenu.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@36 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 05:10:46 +00:00
abijah
77c038e880 Fixed the underlying hotlink map to match the coordinates of the actual image. Also fixed a few issues with requested_width propogation, although there may still be some bugs.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@35 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 04:37:24 +00:00
abijah
44bdb384f5 More tweaks to get the map working. At the moment, the clickable area is off because it's not scaled like the actual image is. I'll have to work on that next.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@34 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 03:36:28 +00:00
abijah
2b135b0e66 Further progress on the site map. The scale is off at the moment, but it's working well enough that it's worth a snapshot.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@33 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 02:45:23 +00:00
abijah
23ec1b6b20 Adding mapping ability. Incomplete as of yet, but coming along nicely.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@32 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 01:47:12 +00:00
abijah
8f4f3c054e Moved the unit status logic into the model where it belongs.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@30 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 22:09:04 +00:00
abijah
1249854514 Added support for querying only occupied or vacant units. It's working at the moment, but I'll probably move some more logic to the controller next.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@29 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 21:52:14 +00:00
abijah
7805e4d229 Added preliminary support for units. The queries are giving me a heck of a time, so I've cheated in some places. For the most part though, it's working. Also, something went wrong with svn, and view/contacts/view.ctp was not right (a checkin seems to have been omitted on it). This checking brings it up to date.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@28 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 11:26:09 +00:00
abijah
54c7287ee4 Removed the revisit code, as use of it would only screw up pagination anyway.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@25 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 09:36:58 +00:00
abijah
bcec2a9891 Added more models
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@24 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 09:27:29 +00:00
abijah
e772ff8755 Fixed duplicate row entries and other paginate issues. The fix might be a hack, but it works for now.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@23 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 09:07:53 +00:00
abijah
3288969b0d First pass at listing the customers. Need to figure out how to paginate based on a HABTM relationship.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@22 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 08:04:22 +00:00
abijah
d268b6fe7e Moved the contact info into the contacts controller.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@20 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 07:12:32 +00:00
abijah
e9b31d964c Added Lease History and security deposit tracking.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@19 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 07:05:05 +00:00
abijah
47d362750e Added phone and address models as well as outputing them to the view.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@16 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 06:31:07 +00:00
abijah
47af64aefe Very, very early snapshot. Some models are working, and I have a controller for testing. Everything is subject to change. I _do_ have a working tenant ledger though, so it's worth a snapshot.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@15 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 05:49:03 +00:00
abijah
1ca704157b Adjusted database details and sitelink conversion script to go along with new schema naming convention changes
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@14 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 20:54:14 +00:00
abijah
8a3be97d41 Removed the cache files from the repository
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@7 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 19:23:05 +00:00
abijah
05a4ee38f0 Fixed the stupid svn:ignore properties, which all had a trailing space (doh!)
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@6 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:35:43 +00:00
abijah
0e68fea04b Added svn:ignore for all of the tmp directories
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@5 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:24:45 +00:00
abijah
a9f47d73ba Load pmgr into branches/initial_20090526/site.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@4 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:18:23 +00:00
abijah
5b5e478bd0 Create directories to load project into.
* branches/initial_20090526/site: New directory.


git-svn-id: file:///svn-source/pmgr/branches/initial_20090526/site@3 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:18:18 +00:00
Abijah
d4122b207b Created directory structure
git-svn-id: file:///svn-source/pmgr/trunk/site@1 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:16:20 +00:00
Abijah
562ffc9e4b Created directory structure
git-svn-id: file:///svn-source/pmgr/trunk@1 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:16:20 +00:00
513 changed files with 7386 additions and 30008 deletions

View File

@@ -1,3 +0,0 @@
@echo off
%~dp0\scripts\sitelink2pmgr.pl %~dp0\db\schema.sql %~dp0db\vss.mdb %*
echo Done!

View File

@@ -25,9 +25,9 @@
-- REVISIT <AP>: 20090511
-- By not specifying the database, the script can
-- make the determination of which one to use.
-- DROP DATABASE IF EXISTS `property_manager`;
-- CREATE DATABASE `property_manager`;
-- USE `property_manager`;
DROP DATABASE IF EXISTS `property_manager`;
CREATE DATABASE `property_manager`;
USE `property_manager`;
-- ######################################################################
@@ -241,7 +241,7 @@ CREATE TABLE `pmgr_contacts_methods` (
-- ######################################################################
-- ######################################################################
-- ##
-- ## GROUPS
-- ## GROUPS / USERS
-- ##
@@ -256,59 +256,15 @@ CREATE TABLE `pmgr_groups` (
-- code may not be userful
`code` VARCHAR(12) NOT NULL, -- User style "id"
`name` VARCHAR(80) NOT NULL,
-- Lower ranks are given higher priority
`rank` SMALLINT UNSIGNED NOT NULL DEFAULT 100,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_group_options
DROP TABLE IF EXISTS `pmgr_group_options`;
CREATE TABLE `pmgr_group_options` (
`group_id` INT(10) UNSIGNED NOT NULL,
`name` VARCHAR(50) NOT NULL,
`value` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`group_id`, `name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_group_permissions
DROP TABLE IF EXISTS `pmgr_group_permissions`;
CREATE TABLE `pmgr_group_permissions` (
`group_id` INT(10) UNSIGNED NOT NULL,
`name` CHAR(30) NOT NULL,
`access` ENUM('ALLOWED',
'DENIED',
'FORCED')
NOT NULL DEFAULT 'ALLOWED',
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`group_id`, `name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ##
-- ## USERS
-- ##
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
@@ -318,14 +274,10 @@ DROP TABLE IF EXISTS `pmgr_users`;
CREATE TABLE `pmgr_users` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`code` VARCHAR(12) NOT NULL, -- User style "id"
-- Login details. Passwords are not yet used (and so NULL).
`login` VARCHAR(30) NOT NULL,
`salt` CHAR(12) DEFAULT NULL,
`passhash` VARCHAR(255) DEFAULT NULL,
`login` VARCHAR(30) NOT NULL,
-- Contact information for this user
`contact_id` INT(10) UNSIGNED NOT NULL,
`contact_id` INT(10) UNSIGNED DEFAULT NULL,
-- Specific comments
`comment` VARCHAR(255) DEFAULT NULL,
@@ -334,18 +286,208 @@ CREATE TABLE `pmgr_users` (
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ##
-- ## OPTIONS
-- ##
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_options
DROP TABLE IF EXISTS `pmgr_options`;
CREATE TABLE `pmgr_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
UNIQUE KEY `name_key` (`name`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_option_values
DROP TABLE IF EXISTS `pmgr_option_values`;
CREATE TABLE `pmgr_option_values` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`option_id` INT(10) UNSIGNED NOT NULL,
`value` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_default_options
DROP TABLE IF EXISTS `pmgr_default_options`;
CREATE TABLE `pmgr_default_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`option_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_group_options
DROP TABLE IF EXISTS `pmgr_group_options`;
CREATE TABLE `pmgr_group_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`group_id` INT(10) UNSIGNED NOT NULL,
`option_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `group_key` (`group_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_user_options
DROP TABLE IF EXISTS `pmgr_user_options`;
CREATE TABLE `pmgr_user_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NOT NULL,
`name` VARCHAR(50) NOT NULL,
`value` VARCHAR(255) NOT NULL,
`option_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `user_key` (`user_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
PRIMARY KEY (`user_id`, `name`)
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_site_options
DROP TABLE IF EXISTS `pmgr_site_options`;
CREATE TABLE `pmgr_site_options` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`site_id` INT(10) UNSIGNED NOT NULL,
`option_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `site_key` (`site_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ##
-- ## PERMISSIONS
-- ##
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_permissions
DROP TABLE IF EXISTS `pmgr_permissions`;
CREATE TABLE `pmgr_permissions` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
UNIQUE KEY `name_key` (`name`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_permission_values
DROP TABLE IF EXISTS `pmgr_permission_values`;
CREATE TABLE `pmgr_permission_values` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`permission_id` INT(10) UNSIGNED NOT NULL,
`access` ENUM('ALLOW',
'DENY')
NOT NULL DEFAULT 'DENY',
`level` SMALLINT UNSIGNED DEFAULT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_default_permissions
DROP TABLE IF EXISTS `pmgr_default_permissions`;
CREATE TABLE `pmgr_default_permissions` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`permission_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_group_permissions
DROP TABLE IF EXISTS `pmgr_group_permissions`;
CREATE TABLE `pmgr_group_permissions` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`group_id` INT(10) UNSIGNED NOT NULL,
`permission_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `group_key` (`group_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_user_permissions
DROP TABLE IF EXISTS `pmgr_user_permissions`;
CREATE TABLE `pmgr_user_permissions` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NOT NULL,
`permission_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `user_key` (`user_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_site_permissions
DROP TABLE IF EXISTS `pmgr_site_permissions`;
CREATE TABLE `pmgr_site_permissions` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`site_id` INT(10) UNSIGNED NOT NULL,
`permission_value_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
KEY `site_key` (`site_id`),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -380,46 +522,6 @@ CREATE TABLE `pmgr_sites` (
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_site_options
DROP TABLE IF EXISTS `pmgr_site_options`;
CREATE TABLE `pmgr_site_options` (
`site_id` INT(10) UNSIGNED NOT NULL,
`name` VARCHAR(50) NOT NULL,
`value` VARCHAR(255) NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`site_id`, `name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_site_memberships
--
-- Which users are allowed to access which sites,
-- and under which set of group permissions (possibly multiple)
-- SELECT U.id, P.name, MAX(P.access)
-- FROM pmgr_users U
-- LEFT JOIN pmgr_site_membership M ON M.user_id = U.id
-- LEFT JOIN pmgr_groups G ON G.id = M.group_id
-- LEFT JOIN pmgr_group_permissions P ON P.group_id = G.id
-- GROUP BY U.id, P.name
DROP TABLE IF EXISTS `pmgr_site_memberships`;
CREATE TABLE `pmgr_site_memberships` (
`site_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NOT NULL,
`group_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`site_id`, `user_id`, `group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_site_areas
@@ -437,6 +539,38 @@ CREATE TABLE `pmgr_site_areas` (
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ######################################################################
-- ##
-- ## MEMBERSHIPS
-- ##
-- ----------------------------------------------------------------------
-- ----------------------------------------------------------------------
-- TABLE pmgr_memberships
--
-- Which users are allowed to access which sites,
-- and under which set of group permissions (possibly multiple)
DROP TABLE IF EXISTS `pmgr_memberships`;
CREATE TABLE `pmgr_memberships` (
`site_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NOT NULL,
`group_id` INT(10) UNSIGNED NOT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`site_id`, `user_id`, `group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ######################################################################
-- ######################################################################
-- ######################################################################
@@ -475,8 +609,6 @@ CREATE TABLE `pmgr_units` (
'LIENED')
NOT NULL DEFAULT 'VACANT',
`current_lease_id` INT(10) UNSIGNED DEFAULT NULL,
`sort_order` MEDIUMINT UNSIGNED NOT NULL,
`walk_order` MEDIUMINT UNSIGNED NOT NULL,
@@ -878,7 +1010,7 @@ INSERT INTO `pmgr_accounts` (`type`, `name`)
VALUES
('ASSET', 'A/R' ),
('LIABILITY', 'A/P' ),
('LIABILITY', 'Customer Credit' );
('LIABILITY', 'Credit' );
INSERT INTO `pmgr_accounts` (`type`, `name`, `receipts`)
VALUES
('ASSET', 'Cash', 1),
@@ -971,6 +1103,7 @@ CREATE TABLE `pmgr_transactions` (
'CREDIT_NOTE', -- Inverse of Sales Invoice
'PAYMENT', -- Actual payment
'DEPOSIT',
'AUTO_DEPOSIT', -- Fundamentally same as DEPOSIT
'WITHDRAWAL',
'CLOSE', -- Essentially an internal (not accounting) transaction
-- 'CREDIT',
@@ -1148,6 +1281,9 @@ CREATE TABLE `pmgr_tender_types` (
-- include credit cards, debit cards, and ACH transfers.
`tillable` TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,
-- Should these items be deposited automatically?
`auto_deposit` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
-- Names of the 4 data fields (or NULL if not used)
-- Not the most robust of solutions, especially since
-- it requires (or strongly implicates) that all fields
@@ -1171,6 +1307,10 @@ CREATE TABLE `pmgr_tender_types` (
-- account, either distinct or non-distinct from others
`account_id` INT(10) UNSIGNED NOT NULL,
-- Which account should these items be deposited in?
-- This may or may not actually be used for all types
-- but will likely get used for auto deposit items.
`deposit_account_id` INT(10) UNSIGNED DEFAULT NULL,
`comment` VARCHAR(255) DEFAULT NULL,
@@ -1220,6 +1360,8 @@ CREATE TABLE `pmgr_tenders` (
`ledger_entry_id` INT(10) UNSIGNED NOT NULL,
-- The ledger entry if this tender is marked NSF
`nsf_ledger_entry_id` INT(10) UNSIGNED DEFAULT NULL,
-- The ledger entry if this actual deposit transaction
`deposit_ledger_entry_id` INT(10) UNSIGNED DEFAULT NULL,
-- The deposit transaction that included these monies
`deposit_transaction_id` INT(10) UNSIGNED DEFAULT NULL,
-- The NSF transaction coming back from the bank.

View File

@@ -1,85 +0,0 @@
-- Delete bad transaction(s)
DELETE M
FROM
pmgr_ledger_entries LE,
pmgr_tenders M
WHERE
M.ledger_entry_id = LE.id AND
LE.transaction_id
IN (467);
DELETE LE
FROM
pmgr_ledger_entries LE
WHERE
LE.transaction_id
IN (467);
DELETE SE
FROM
pmgr_statement_entries SE
WHERE
SE.transaction_id
IN (467);
DELETE T
FROM
pmgr_transactions T
WHERE
T.id
IN (467);
-- Delete bad transaction, one variable setting
SET @tid = 467;
DELETE M FROM pmgr_ledger_entries LE, pmgr_tenders M
WHERE M.ledger_entry_id = LE.id AND LE.transaction_id = @tid;
DELETE LE FROM pmgr_ledger_entries LE
WHERE LE.transaction_id = @tid;
DELETE SE FROM pmgr_statement_entries SE
WHERE SE.transaction_id = @tid;
DELETE T FROM pmgr_transactions T
WHERE T.id = @tid;
-- Determine economic conditions
SELECT `status`, COUNT(id), SUM(rent) FROM pmgr_units
GROUP BY `status` WITH ROLLUP;
-- Check that transaction totals add up correctly
SELECT T.id, T.type, T.amount,
-- T.type, A.type, E.crdr,
SUM(IF(E.account_id = T.account_id,
IF(A.type IN ('ASSET','EXPENSE') XOR E.crdr='DEBIT',-1,1),0)
*E.amount) AS Tamt,
SUM(IF(E.account_id = T.account_id,
0,IF(A.type IN ('ASSET','EXPENSE') XOR E.crdr='DEBIT',-1,1))
*E.amount) AS Oamt,
COUNT(E.id) AS Ecnt
FROM pmgr_transactions T
-- LEFT JOIN pmgr_statement_entries E ON E.transaction_id = T.id
LEFT JOIN pmgr_ledger_entries E ON E.transaction_id = T.id
LEFT JOIN pmgr_accounts A ON A.id = T.account_id -- E.account_id
-- WHERE
-- E.account_id != T.account_id
GROUP BY T.id
HAVING
(T.type = 'INVOICE' AND Tamt <> T.amount)
OR
(T.type <> 'INVOICE' AND Oamt <> T.amount)
OR
(Tamt * -1 <> Oamt)
-- Verify that statement entries all have the correct type
SELECT SE.id, SE.type, T.id, T.type
FROM pmgr_statement_entries SE
LEFT JOIN pmgr_transactions T ON T.id = SE.transaction_id
WHERE
((T.type = 'RECEIPT' OR T.type = 'CREDIT_NOTE') AND
SE.type NOT IN ('DISBURSEMENT', 'WAIVER', 'REVERSAL', 'WRITEOFF', 'SURPLUS')
)
OR
((T.type = 'INVOICE' OR T.type = 'PAYMENT') AND
SE.type NOT IN ('CHARGE', 'PAYMENT', 'REFUND')
)
-- catch other types not considered in this query
OR T.type NOT IN ('RECEIPT', 'CREDIT_NOTE', 'INVOICE', 'PAYMENT')

View File

@@ -1,68 +0,0 @@
N - GATE
N - ACH / CREDIT CARD PROCESSING
Y - CREDIT CARD ENTRY
Y - ACH ENTRY
P - INVENTORY TRACKING / POS
Y - UNIT TYPES
Y - UNIT SIZES
Y - UNITS
Y - MOVE IN / OUT
Y - UNIT TRANSFERS
Y - LEASE TRACKING (PDF Generation)
Y - LETTERS (PDF Generation)
Y - REMINDERS
Y - MULTIPLE LATE RENT SCHEDULES (Tenant A vs Tenant B)
Y - ACCOUNTING (assign charges to accounts)
Y - DETAILED REPORTING (HTML & PDF)
Y - SITE MAP; HOT CLICKABLE
P - PROSPECTIVE TENANTS
Y - MARKETING
P - RESERVATIONS
P - MOVE OUT NOTICES
P - MULTI-SITE (One database, multiple sites)
Y - GENERATE GEOGRAPHIC MAP OF CUSTOMERS USING GOOGLE!
- Major advantage here... MapPoint only choice with competitors
Y - WEB BASED
Y - CUSTOMER VIEW / MANAGER VIEW
Y - CUSTOMERS CAN CREATE ACCOUNTS, VIEW HISTORY
Y - CUSTOMERS CAN SIGN UP FOR AUTO PAY
----------------------------------------------------------------------
----------------------------------------------------------------------
Operations to be functional
'X' marks functionality sufficiently completed
X - Create Customer ID/Account
X - Add Contact information to Customer
X - Move Customer into Unit
? - Enter Rent Concessions given
X - Asses Rent Charges
X - Asses Late Charges
X - Asses Security Deposits
X - Receive and record Checks
X - Receive and record Money Orders
X - Receive and record Cash
X - Receive and record ACH Deposits
? - Reverse rent charges (early moveout on prepaid occupancy)
X - Handle NSF checks
X - Assess NSF Fees
X - Determine Lease Paid-Through status
- Report: List of customers overdue
X - Flag unit as overlocked
X - Flag unit as evicting
X - Flag unit as normal status
X - Flag unit as dirty
- Enter notes when communicating with Customer
X - Accept pre-payments
X - Record Customer Move-Out from Unit
X - Record utilization of Security Deposit
X - Record issuing of a refund
- Record Deposit into Petty Cash
- Record Payment from Petty Cash to expenses
X - Record Petty Cash to refund.
X - Write Off Bad Debt
X - Perform a Deposit
X - Close the Books (nightly / weekly, etc)
X - Determine Rents Collected for a given period.

File diff suppressed because it is too large Load Diff

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

@@ -35,16 +35,350 @@
* @subpackage cake.app
*/
class AppController extends Controller {
var $uses = array('Option', 'Permission');
var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid');
var $components = array('DebugKit.Toolbar');
var $sidemenu = array('areas' => array('SITE' => false, 'REPORT' => false, 'CONTROLLER' => false, 'ACTION' => false, 'SANDBOX' => false));
var $std_area = 10;
var $admin_area = 20;
var $dev_area = 30;
var $op_area = 40;
var $new_area = 50;
function __construct() {
$this->params['dev'] = false;
$this->params['admin'] = false;
parent::__construct();
}
function sideMenuLinks() {
/**************************************************************************
**************************************************************************
**************************************************************************
* function: dev/admin()
* - Indicates if the user has dev/admin access
*/
function dev() { return !empty($this->params['dev']); }
function admin() { return !empty($this->params['admin']); }
/**************************************************************************
**************************************************************************
**************************************************************************
* function: sideMenuAreaVerify
* - Verifies the validity of the sidemenu area/subarea/priority,
* and ensures the class member is set to appropriately handle it.
*/
function sideMenuAreaVerify(&$area, $subarea, $priority = null) {
$area = strtoupper($area);
if (!array_key_exists($area, $this->sidemenu['areas']))
$this->INTERNAL_ERROR("Sidemenu link '{$area}': Unknown");
if ($area == 'SITE')
$name = 'Navigation';
elseif ($area == 'CONTROLLER')
$name = Inflector::humanize($this->params['controller']);
elseif ($area == 'ACTION')
$name = Inflector::humanize(Inflector::singularize($this->params['controller']));
elseif ($area == 'REPORT')
$name = 'Reports';
elseif ($area == 'SANDBOX')
$name = 'Sandbox';
if (empty($this->sidemenu['areas'][$area]))
$this->sidemenu['areas'][$area]
= array('enable' => true, 'name' => $name, 'subareas' => array());
if (empty($subarea))
return;
$subname = $name;
if ($subarea == $this->std_area)
$subname .= '';
elseif ($subarea == $this->op_area)
//$subname .= '-Ops';
$subname = 'Actions';
elseif ($subarea == $this->new_area)
//$subname .= '-New';
$subname = 'Creation';
elseif ($subarea == $this->admin_area)
$subname .= '-Admin';
elseif ($subarea == $this->dev_area)
$subname .= '-Dev';
else
$subname .= '-' . $subarea;
if (empty($this->sidemenu['areas'][$area]['subareas'][$subarea]))
$this->sidemenu['areas'][$area]['subareas'][$subarea]
= array('enable' => true, 'name' => $subname, 'priorities' => array());
if (empty($priority))
return;
if (empty($this->sidemenu['areas'][$area]['subareas'][$subarea]['priorities'][$priority]))
$this->sidemenu['areas'][$area]['subareas'][$subarea]['priorities'][$priority]
= array();
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: sideMenuAreaName
* - Sets the name of the sidemenu area/subarea
*/
function sideMenuAreaName($name, $area, $subarea = null) {
$this->sideMenuAreaVerify($area, $subarea);
if (empty($subarea))
$this->sidemenu['areas'][$area]['name'] = $name;
else
$this->sidemenu['areas'][$area]['subareas'][$subarea]['name'] = $name;
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: sideMenuAreaActivate
* - Sets the selected area/subarea to be active when the
* page is first loaded.
*/
function sideMenuAreaActivate($area, $subarea = null) {
$this->sidemenu['active'] = compact('area', 'subarea');
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: sideMenuEnable
* - Enables/Disables an area or subarea of the sidemenu
*/
function sideMenuEnable($area, $subarea = null, $enable = true) {
$this->sideMenuAreaVerify($area, $subarea);
if (isset($subarea))
$this->sidemenu['areas'][$area]['subareas'][$subarea]['enable'] = $enable;
else
$this->sidemenu['areas'][$area]['enable'] = $enable;
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addSideMenuLink
* - Adds another link to the sidemenu area/subarea/priority
*/
function addSideMenuLink($name, $url, $extra, $area, $subarea = null, $priority = 10) {
if (empty($subarea))
$subarea = $this->std_area;
$this->sideMenuAreaVerify($area, $subarea);
$this->sidemenu['areas'][$area]['subareas'][$subarea]['priorities'][$priority][]
= array('name' => $name, 'url' => $url) + (empty($extra) ? array() : $extra);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addDefaultSideMenuLinks
* - Adds the standard links present on all generated pages
*/
function addDefaultSideMenuLinks() {
$this->addSideMenuLink('Site Map',
array('controller' => 'maps', 'action' => 'view', 1), null,
'SITE');
$this->addSideMenuLink('Unit Sizes',
array('controller' => 'unit_sizes', 'action' => 'index'), null,
'SITE');
$this->addSideMenuLink('Units',
array('controller' => 'units', 'action' => 'index'), null,
'SITE');
$this->addSideMenuLink('Leases',
array('controller' => 'leases', 'action' => 'index'), null,
'SITE');
$this->addSideMenuLink('Customers',
array('controller' => 'customers', 'action' => 'index'), null,
'SITE');
$this->addSideMenuLink('Deposits',
array('controller' => 'transactions', 'action' => 'deposit'), null,
'SITE');
$this->addSideMenuLink('Accounts',
array('controller' => 'accounts', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Contacts',
array('controller' => 'contacts', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Ledgers',
array('controller' => 'ledgers', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Tenders',
array('controller' => 'tenders', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Transactions',
array('controller' => 'transactions', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Ldgr Entries',
array('controller' => 'ledger_entries', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Stmt Entries',
array('controller' => 'statement_entries', 'action' => 'index'), null,
'SITE', $this->admin_area);
$this->addSideMenuLink('Un-Nuke',
'#', array('htmlAttributes' =>
array('onclick' => '$(".pr-section").show(); return false;')),
'SITE', $this->dev_area);
$this->addSideMenuLink('New Ledgers',
array('controller' => 'accounts', 'action' => 'newledger'), null,
'SITE', $this->dev_area);
//array('name' => 'RESET DATA', array('controller' => 'accounts', 'action' => 'reset_data'));
$this->addSideMenuLink('New Receipt',
array('controller' => 'customers', 'action' => 'receipt'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('New Invoice',
array('controller' => 'leases', 'action' => 'invoice'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('Move-In',
array('controller' => 'customers', 'action' => 'move_in'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('Move-Out',
array('controller' => 'leases', 'action' => 'move_out'), null,
'SITE', $this->op_area);
$this->addSideMenuLink('New Deposit',
array('controller' => 'tenders', 'action' => 'deposit'), null,
'SITE', $this->op_area);
if ($this->admin())
$this->addSideMenuLink('Assess Charges',
array('controller' => 'leases', 'action' => 'assess_all'), null,
'SITE', $this->op_area);
if ($this->admin()) {
$acct = new Account;
$this->addSideMenuLink('Collected Rent',
array('controller' => 'accounts',
'action' => 'collected',
$acct->rentAccountID()), null,
'REPORT');
$this->addSideMenuLink('Unpaid Charges',
array('controller' => 'statement_entries', 'action' => 'unpaid'), null,
'REPORT');
$this->addSideMenuLink('Lease Up',
array('controller' => 'leases', 'action' => 'overview'), null,
'REPORT');
$this->addSideMenuLink('Unit Summary',
array('controller' => 'units', 'action' => 'overview'), null,
'REPORT');
$this->addSideMenuLink('Monthly Charges',
array('controller' => 'statement_entries', 'action' => 'chargesbymonth'), null,
'REPORT');
}
else {
$this->sideMenuEnable('REPORT', null, false);
}
$url_components = array('plugin', 'controller', 'action', 'named');
if (devbox()) {
/* $sources = ConnectionManager::sourceList(); */
/* $db = ConnectionManager::getDataSource($sources[0])->config['database']; */
/* $this->sideMenuAreaName($db, 'SANDBOX', $this->std_area); */
$this->sideMenuAreaName('DevBox', 'SANDBOX', $this->std_area);
$this->addSideMenuLink('Rebuild DevBox',
array('controller' => 'util', 'action' => 'rebuild_devbox'), null,
'SANDBOX');
}
elseif (sandbox()) {
$this->addSideMenuLink('Rebuild Sandbox',
array('controller' => 'util', 'action' => 'rebuild_sandbox'), null,
'SANDBOX');
$this->addSideMenuLink('Leave Sandbox',
array('sand_route' => false)
+ array_intersect_key($this->params, array_flip($url_components))
+ $this->params['pass'],
null, 'SANDBOX');
}
else {
$this->addSideMenuLink('Enter Sandbox',
array('sand_route' => true)
+ array_intersect_key($this->params, array_flip($url_components))
+ $this->params['pass'],
null, 'SANDBOX');
}
// REVISIT <AP>: 20090824
// Depending on preference, we may put this into the gridView
// function, making the links available only when navigating.
$this->addGridViewSideMenuLinks();
}
/**************************************************************************
**************************************************************************
**************************************************************************
* virtual: addGridViewSideMenuLinks
* - Adds the grid view specific navigation links, if overridden.
*/
function addGridViewSideMenuLinks() {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* hook: beforeFilter
* - Called just before the action function
*/
function beforeFilter() {
$this->params['user'] = $this->Permission->User->currentUser();
$this->params['admin'] = $this->Option->enabled('admin');
$this->params['dev'] = devbox();
if ($this->dev() && !$this->Option->enabled('dev'))
$this->redirect("/");
if ($this->dev())
Configure::write('debug', 2);
$this->addDefaultSideMenuLinks();
//$this->sideMenuEnable('SITE', $this->op_area, false);
foreach ($this->sidemenu['areas'] AS $area_name => $area) {
if (!$this->dev())
$this->sideMenuEnable($area_name, $this->dev_area, false);
if (!$this->admin())
$this->sideMenuEnable($area_name, $this->admin_area, false);
}
$this->authorize("controller.{$this->params['controller']}");
$this->authorize("action.{$this->params['controller']}.{$this->params['action']}");
$this->log('----------------------------------------------------------------------', 'request');
$this->log('----------------------------------------------------------------------', 'request');
$this->log($this->params, 'request');
}
/**************************************************************************
**************************************************************************
**************************************************************************
* hook: beforeRender
* - Called just before rendering the page
*/
function beforeRender() {
// Stupid Cake... our constructor sets admin/dev,
// but cake stomps it somewhere along the way
// after constructing the CakeError controller.
@@ -53,51 +387,63 @@ class AppController extends Controller {
$this->params['admin'] = false;
}
$menu = array();
$menu[] = array('name' => 'Common', 'header' => true);
$menu[] = array('name' => 'Site Map', 'url' => array('controller' => 'maps', 'action' => 'view', 1));
$menu[] = array('name' => 'Units', 'url' => array('controller' => 'units', 'action' => 'index'));
$menu[] = array('name' => 'Leases', 'url' => array('controller' => 'leases', 'action' => 'index'));
$menu[] = array('name' => 'Customers', 'url' => array('controller' => 'customers', 'action' => 'index'));
$menu[] = array('name' => 'Deposits', 'url' => array('controller' => 'transactions', 'action' => 'deposit'));
foreach ($this->sidemenu['areas'] AS $aname => &$area) {
if (empty($area['enable']))
$area = array();
if (empty($area['subareas']))
continue;
ksort($area['subareas']);
if ($this->params['admin']) {
$menu[] = array('name' => 'Admin', 'header' => true);
$menu[] = array('name' => 'Accounts', 'url' => array('controller' => 'accounts', 'action' => 'index'));
$menu[] = array('name' => 'Contacts', 'url' => array('controller' => 'contacts', 'action' => 'index'));
$menu[] = array('name' => 'Ledgers', 'url' => array('controller' => 'ledgers', 'action' => 'index'));
$menu[] = array('name' => 'Tenders', 'url' => array('controller' => 'tenders', 'action' => 'index'));
$menu[] = array('name' => 'Transactions', 'url' => array('controller' => 'transactions', 'action' => 'index'));
$menu[] = array('name' => 'Ldgr Entries', 'url' => array('controller' => 'ledger_entries', 'action' => 'index'));
$menu[] = array('name' => 'Stmt Entries', 'url' => array('controller' => 'statement_entries', 'action' => 'index'));
$menu[] = array('name' => 'New Ledgers', 'url' => array('controller' => 'accounts', 'action' => 'newledger'));
$menu[] = array('name' => 'Assess Charges', 'url' => array('controller' => 'leases', 'action' => 'assess_all'));
foreach ($area['subareas'] AS $sname => &$subarea) {
if (empty($subarea['enable']))
$subarea = array();
if (empty($subarea['priorities']))
continue;
ksort($subarea['priorities']);
foreach ($subarea['priorities'] AS $pname => &$priority) {
if (empty($priority))
unset($subarea['priorities'][$pname]);
}
unset($priority);
if (empty($subarea['priorities']))
unset($area['subareas'][$sname]);
}
unset($subarea);
if (empty($area['subareas']))
unset($this->sidemenu['areas'][$aname]);
}
unset($area);
// Activate a default section (unless already specified)
foreach (array_reverse(array_diff_key($this->sidemenu['areas'], array('SANDBOX'=>1))) AS $area_name => $area) {
if (empty($area))
continue;
if (empty($this->sidemenu['active']) ||
empty($this->sidemenu['areas'][$this->sidemenu['active']['area']]))
$this->sideMenuAreaActivate($area_name);
}
if ($this->params['dev']) {
$menu[] = array('name' => 'Development', 'header' => true);
$menu[] = array('name' => 'Un-Nuke', 'url' => '#', 'htmlAttributes' =>
array('onclick' => '$(".pr-section").show(); return false;'));
$menu[] = array('name' => 'New Ledgers', 'url' => array('controller' => 'accounts', 'action' => 'newledger'));
//array('name' => 'RESET DATA', 'url' => array('controller' => 'accounts', 'action' => 'reset_data'));
}
// If generating reports, don't display the controller menu.
// Each report comes from a controller, but there is no need
// to present the controller actions, so remove that section
// from the menu.
if ($this->sidemenu['active']['area'] == 'REPORT')
$this->sideMenuEnable('CONTROLLER', null, false);
return $menu;
//pr($this->sidemenu);
$this->set('sidemenu', $this->sidemenu);
}
function beforeFilter() {
$this->params['dev'] =
(!empty($this->params['dev_route']));
$this->params['admin'] =
(!empty($this->params['admin_route']) || !empty($this->params['dev_route']));
if (!$this->params['dev'])
Configure::write('debug', '0');
}
function beforeRender() {
$this->set('sidemenu', $this->sideMenuLinks());
}
/**************************************************************************
**************************************************************************
**************************************************************************
* override: redirect
*/
function redirect($url, $status = null, $exit = true) {
// OK, since the controller will not be able to
@@ -127,28 +473,6 @@ class AppController extends Controller {
return parent::redirect($url, $status, $exit);
}
function reset_data() {
$this->layout = null;
$this->autoLayout = false;
$this->autoRender = false;
Configure::write('debug', '0');
$script = $_SERVER['DOCUMENT_ROOT'] . '/pmgr/build.cmd';
echo "<P>" . date('r') . "\n";
//echo "<P>Script: $script" . "\n";
$db = & $this->Account->getDataSource();
$script .= ' "' . $db->config['database'] . '"';
$script .= ' "' . $db->config['login'] . '"';
$script .= ' "' . $db->config['password'] . '"';
$handle = popen($script . ' 2>&1', 'r');
//echo "<P>Handle: $handle; " . gettype($handle) . "\n";
echo "<P><PRE>\n";
while (($read = fread($handle, 2096))) {
echo $read;
}
echo "</PRE>\n";
pclose($handle);
}
/**************************************************************************
**************************************************************************
@@ -156,8 +480,14 @@ class AppController extends Controller {
* helper: gridView
* - called by derived controllers to create an index listing
*/
function index() {
$names = Inflector::humanize(Inflector::pluralize($this->params['controller']));
$this->gridView('All ' . $names, 'all');
}
function gridView($title, $action = null, $element = null) {
$this->sideMenuEnable('SITE', $this->op_area);
$this->sideMenuAreaActivate('CONTROLLER');
$this->set('title', $title);
// The resulting page will contain a grid, which will
// use ajax to obtain the actual data for this action
@@ -294,6 +624,7 @@ class AppController extends Controller {
$xml = preg_replace("/</", "&lt;", $xml);
$xml = preg_replace("/>/", "&gt;", $xml);
echo ("\n<PRE>\n$xml\n</PRE>\n");
$this->render_empty();
}
}
@@ -314,15 +645,12 @@ class AppController extends Controller {
// Grouping (which would not be typical)
$query['group'] = $this->gridDataCountGroup($params, $model);
// DEBUG PURPOSES ONLY!
$params['count_query'] = $query;
// Get the number of records prior to pagination
return $this->gridDataCountExecute($params, $model, $query);
}
function gridDataCountExecute(&$params, &$model, $query) {
return $model->find('count', $query);
return $this->gridDataFind($params, $model, 'count', $query);
}
function gridDataCountTables(&$params, &$model) {
@@ -540,6 +868,9 @@ class AppController extends Controller {
$page = ($params['page'] <= 1) ? 1 : (($params['page'] > $total) ? $total : $params['page']);
$start = $limit * ($page - 1);
// Adjust the limit upward, if multiple pages were requested.
$limit *= empty($params['npage']) ? 1 : $params['npage'];
return compact('record_count', 'limit', 'page', 'start', 'total');
}
@@ -571,14 +902,11 @@ class AppController extends Controller {
isset($params['sidx']) ? $params['sidx'] : null,
isset($params['sord']) ? $params['sord'] : null);
// DEBUG PURPOSES ONLY!
$params['query'] = $query;
return $this->gridDataRecordsExecute($params, $model, $query);
}
function gridDataRecordsExecute(&$params, &$model, $query) {
return $model->find('all', $query);
return $this->gridDataFind($params, $model, 'all', $query);
}
function gridDataTables(&$params, &$model) {
@@ -620,12 +948,24 @@ class AppController extends Controller {
'value' => $params['filtValue']);
}
// Translate a user specified date into the SQL date format
foreach ($searches AS &$search) {
if (preg_match('/(_date|stamp)$/', $search['field']) &&
preg_match('%(\d{1,2})[-/](\d{1,2})[-/](\d{2,4})%', $search['value'], $matches)) {
$search['value'] = sprintf('%04d%02d%02d',
$matches[3] + ($matches[3] < 50 ? 2000 : ($matches[3] < 100 ? 1900 : 0)),
$matches[2], $matches[1]);
}
}
unset($search);
$ops = array('eq' => array('op' => null, 'pre' => '', 'post' => ''),
'ne' => array('op' => '<>', 'pre' => '', 'post' => ''),
'lt' => array('op' => '<', 'pre' => '', 'post' => ''),
'le' => array('op' => '<=', 'pre' => '', 'post' => ''),
'gt' => array('op' => '>', 'pre' => '', 'post' => ''),
'ge' => array('op' => '>=', 'pre' => '', 'post' => ''),
'in' => array('op' => 'IN', 'pre' => '(', 'post' => ')'),
'bw' => array('op' => 'LIKE', 'pre' => '', 'post' => '%'),
'ew' => array('op' => 'LIKE', 'pre' => '%', 'post' => ''),
'cn' => array('op' => 'LIKE', 'pre' => '%', 'post' => '%'),
@@ -675,6 +1015,13 @@ class AppController extends Controller {
return $start . ', ' . $limit;
}
function gridDataFind(&$params, &$model, $type, $query) {
if ($params['debug'])
$params['queries'][] = compact('type', 'query');
return $model->find($type, $query);
}
/**************************************************************************
**************************************************************************
@@ -695,6 +1042,7 @@ class AppController extends Controller {
$this->gridDataPostProcessLinks($params, $model, $records, array());
// DEBUG PURPOSES ONLY!
//if ($params['debug'])
//$params['records'] = $records;
}
@@ -772,6 +1120,7 @@ class AppController extends Controller {
continue;
// DEBUG PURPOSES ONLY!
//if ($params['debug'])
//$params['linkrecord'][] = compact('table', 'field', 'id', 'controller', 'record');
$record[$table][$field] =
'<A HREF="' .
@@ -802,9 +1151,8 @@ 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) {
@@ -820,7 +1168,8 @@ class AppController extends Controller {
}
function gridDataOutputSummary(&$params, &$model, $pagination) {
echo " <params><![CDATA[\n" . print_r($params, true) . "\n]]></params>\n";
if ($params['debug'])
echo " <params><![CDATA[\n" . print_r($params, true) . "\n]]></params>\n";
echo " <page>{$pagination['page']}</page>\n";
echo " <total>{$pagination['total']}</total>\n";
echo " <records>{$pagination['record_count']}</records>\n";
@@ -861,20 +1210,32 @@ class AppController extends Controller {
function gridDataOutputRecordCell(&$params, &$model, &$record, $field, $data) {
// be sure to put text data in CDATA
if (preg_match("/^\d*$/", $data))
if (preg_match("/^[\d.]*$/", $data))
echo " <cell>$data</cell>\n";
else
echo " <cell><![CDATA[$data]]></cell>\n";
}
function authorize($name) {
if ($this->Permission->deny($name))
$this->UNAUTHORIZED("Unauthorized: $name");
}
function UNAUTHORIZED($msg) {
//$this->redirect('controller' => '???', 'action' => 'login');
//$this->render('/unauthorized');
$this->set('message', '<H2>' . $msg . '</H2>');
$this->render_empty();
}
function INTERNAL_ERROR($msg, $depth = 0) {
INTERNAL_ERROR($msg, false, $depth+1);
$this->render_empty();
$this->_stop();
}
function render_empty() {
$this->render('/empty');
echo $this->render('/empty');
$this->_stop();
}
}

View File

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

View File

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

5
site/build_devbox.cmd Normal file
View File

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

5
site/build_sandbox.cmd Normal file
View File

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

View File

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

View File

@@ -38,7 +38,7 @@
* In production mode, flash messages redirect after a time interval.
* In development mode, you need to click the flash message to continue.
*/
Configure::write('debug', 2);
Configure::write('debug', 0);
/**
* Application wide charset encoding
*/
@@ -117,7 +117,7 @@
/**
* The name of CakePHP's session cookie.
*/
Configure::write('Session.cookie', 'CAKEPHP');
Configure::write('Session.cookie', 'PMGR');
/**
* Session time out time (in seconds).
* Actual value depends on 'Security.level' setting.

View File

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

View File

@@ -27,25 +27,49 @@
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
$default_path = array('controller' => 'maps', 'action' => 'view', '1');
/**
* Here, we are connecting '/' (base path) to our site map.
* It's hardcoded to map #1, but at some point we'll implement
* a login mechanism and the default path will be to log on instead.
*/
Router::connect('/', array('controller' => 'maps', 'action' => 'view', '1'));
Router::connect('/', $default_path);
/*
* Route for admin functionality
* Route for sandbox functionality
*/
Router::connect('/admin/:controller/:action/*',
array('action' => null, 'admin_route' => true)
);
Router::connect('/sand',
array('sand_route' => true) + $default_path);
Router::connect('/sand/:controller/:action/*',
array('sand_route' => true, 'action' => null));
/* Unfortunately, for some reason we need an extra route to solve
* a bug with form generation. When $this->data is set by the
* controller, and a URL is generated by the FormHelper, this
* route is required to ensure the form action is correct. An
* example of a broken page is for /customers/edit/XX. It appears
* the page location uses the route above, it's only URL generation
* that seems to be broken.
*/
Router::connect('/sand/:controller/:action/:id/*',
array('sand_route' => true,'action' => null, 'id'=>null));
/*
* Route for development functionality
* Route for developement functionality
*/
Router::connect('/dev',
array('dev_route' => true) + $default_path);
Router::connect('/dev/:controller/:action/*',
array('action' => null, 'dev_route' => true)
);
array('dev_route' => true, 'action' => null));
/* Unfortunately, for some reason we need an extra route to solve
* a bug with form generation. When $this->data is set by the
* controller, and a URL is generated by the FormHelper, this
* route is required to ensure the form action is correct. An
* example of a broken page is for /customers/edit/XX. It appears
* the page location uses the route above, it's only URL generation
* that seems to be broken.
*/
Router::connect('/dev/:controller/:action/:id/*',
array('dev_route' => true,'action' => null, 'id'=>null));
?>

View File

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

View File

@@ -2,19 +2,7 @@
class ContactsController extends AppController {
var $sidemenu_links = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -35,19 +23,34 @@ class ContactsController extends AppController {
* to jqGrid.
*/
function gridDataFilterTablesConfig(&$params, &$model, $table) {
$config = parent::gridDataFilterTablesConfig($params, $model, $table);
// Special case for Customer; We need the Contact/Customer relationship
if ($table == 'Customer')
$config = array('fields' => array('ContactsCustomer.type',
'ContactsCustomer.active'),
'conditions' => array('ContactsCustomer.active' => true),
);
return $config;
}
function gridDataOrder(&$params, &$model, $index, $direction) {
$order = parent::gridDataOrder($params, $model, $index, $direction);
if ($index === 'Contact.last_name') {
$order[] = 'Contact.first_name ' . $direction;
}
if ($index === 'Contact.first_name') {
$order[] = 'Contact.last_name ' . $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[] = 'Contact.last_name ' . $direction;
$order[] = 'Contact.first_name ' . $direction;
return $order;
}
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['Contact'] = array('id');
$links['Contact'] = array('display_name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}
@@ -78,13 +81,9 @@ class ContactsController extends AppController {
));
// Set up dynamic menu items
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
$this->sidemenu_links[] =
array('name' => 'Edit',
'url' => array('action' => 'edit',
$id));
$this->addSideMenuLink('Edit',
array('action' => 'edit', $id), null,
'ACTION');
// Prepare to render.
$title = 'Contact: ' . $contact['Contact']['display_name'];

View File

@@ -1,28 +1,42 @@
<?php
class CustomersController extends AppController {
var $sidemenu_links =
array(array('name' => 'Customers', 'header' => true),
array('name' => 'Current', 'url' => array('controller' => 'customers', 'action' => 'current')),
array('name' => 'Past', 'url' => array('controller' => 'customers', 'action' => 'past')),
array('name' => 'All', 'url' => array('controller' => 'customers', 'action' => 'all')),
array('name' => 'Add Customer', 'url' => array('controller' => 'customers', 'action' => 'add')),
);
//var $components = array('RequestHandler');
var $components = array('RequestHandler');
// DEBUG FUNCTION ONLY!
// Call without id to update ALL customers
function force_update($id = null) {
$this->Customer->update($id);
$this->redirect(array('action'=>'index'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Current',
array('controller' => 'customers', 'action' => 'current'), null,
'CONTROLLER');
$this->addSideMenuLink('Past',
array('controller' => 'customers', 'action' => 'past'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'customers', 'action' => 'all'), null,
'CONTROLLER');
/* $this->addSideMenuLink('New Customer', */
/* array('controller' => 'customers', 'action' => 'add'), null, */
/* 'CONTROLLER', $this->new_area); */
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -81,19 +95,29 @@ class CustomersController extends AppController {
return $conditions;
}
function gridDataOrder(&$params, &$model, $index, $direction) {
$order = array();
$order[] = parent::gridDataOrder($params, $model, $index, $direction);
function gridDataFilterTablesConfig(&$params, &$model, $table) {
$config = parent::gridDataFilterTablesConfig($params, $model, $table);
if ($index !== 'PrimaryContact.last_name')
$order[] = parent::gridDataOrder($params, $model,
'PrimaryContact.last_name', $direction);
if ($index !== 'PrimaryContact.first_name')
$order[] = parent::gridDataOrder($params, $model,
'PrimaryContact.first_name', $direction);
if ($index !== 'Customer.id')
$order[] = parent::gridDataOrder($params, $model,
'Customer.id', $direction);
// Special case for Contact; We need the Contact/Customer relationship
if ($table == 'Contact')
$config = array('fields' => array('ContactsCustomer.type',
'ContactsCustomer.active'),
'conditions' => array('ContactsCustomer.active' => true),
);
return $config;
}
function gridDataOrder(&$params, &$model, $index, $direction) {
$order = parent::gridDataOrder($params, $model, $index, $direction);
// After sorting by whatever the user wants, add these
// defaults into the sort mechanism. If we're already
// sorting by one of them, it will only be redundant,
// and should cause no harm (possible a longer query?)
$order[] = 'PrimaryContact.last_name ' . $direction;
$order[] = 'PrimaryContact.first_name ' . $direction;
$order[] = 'Customer.id ' . $direction;
return $order;
}
@@ -111,14 +135,18 @@ class CustomersController extends AppController {
* - Sets up the move-in page for the given customer.
*/
function move_in($id = null) {
function move_in($id = null, $unit_id = null) {
$customer = array();
$unit = array();
if (isset($id)) {
if (!empty($id)) {
$this->Customer->recursive = -1;
$customer = current($this->Customer->read(null, $id));
}
if (!empty($unit_id)) {
$this->Customer->Lease->Unit->recursive = -1;
$unit = current($this->Customer->Lease->Unit->read(null, $unit_id));
}
$this->set(compact('customer', 'unit'));
$title = 'Customer Move-In';
@@ -219,52 +247,76 @@ class CustomersController extends AppController {
$outstanding_deposit = $this->Customer->securityDepositBalance($id);
// Figure out if this customer has any non-closed leases
$show_moveout = false;
$show_payment = false;
$show_moveout = false; $moveout_lease_id = null;
$show_payment = false; $payment_lease_id = null;
foreach ($customer['Lease'] AS $lease) {
if (!isset($lease['close_date']))
if (!isset($lease['close_date'])) {
if ($show_payment)
$payment_lease_id = null;
else
$payment_lease_id = $lease['id'];
$show_payment = true;
if (!isset($lease['moveout_date']))
}
if (!isset($lease['moveout_date'])) {
if ($show_moveout)
$moveout_lease_id = null;
else
$moveout_lease_id = $lease['id'];
$show_moveout = true;
}
}
// Set up dynamic menu items
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
$this->sidemenu_links[] =
array('name' => 'Edit',
'url' => array('action' => 'edit',
$id));
$this->sidemenu_links[] =
array('name' => 'Move-In',
'url' => array('action' => 'move_in',
$id));
/* if ($show_moveout) { */
/* $this->sidemenu_links[] = */
/* array('name' => 'Move-Out', */
/* 'url' => array('action' => 'move_out', */
/* $id)); */
/* } */
if ($show_payment || $outstanding_balance > 0)
$this->sidemenu_links[] =
array('name' => 'New Receipt',
'url' => array('action' => 'receipt',
$id));
$this->addSideMenuLink('New Receipt',
array('action' => 'receipt', $id), null,
'ACTION');
if ($show_payment) {
/* $ids = $this->Customer->leaseIds($id, true); */
/* if (count($ids) == 1) */
/* $lease_id = $ids[0]; */
/* else */
/* $lease_id = null; */
$this->addSideMenuLink('New Invoice',
array('controller' => 'leases',
'action' => 'invoice',
$payment_lease_id), null,
'ACTION');
}
$this->addSideMenuLink('Move-In',
array('action' => 'move_in', $id), null,
'ACTION');
if ($show_moveout) {
$this->addSideMenuLink('Move-Out',
array('controller' => 'leases',
'action' => 'move_out',
$moveout_lease_id), null,
'ACTION');
}
if (!$show_moveout && $outstanding_balance > 0)
$this->sidemenu_links[] =
array('name' => 'Write-Off',
'url' => array('action' => 'bad_debt',
$id));
$this->addSideMenuLink('Write-Off',
array('action' => 'bad_debt', $id), null,
'ACTION');
if ($outstanding_balance < 0)
$this->sidemenu_links[] =
array('name' => 'Issue Refund',
'url' => array('action' => 'refund', $id));
$this->addSideMenuLink('Issue Refund',
array('action' => 'refund', $id), null,
'ACTION');
$this->addSideMenuLink('Edit',
array('action' => 'edit', $id), null,
'ACTION');
if ($this->admin())
$this->addSideMenuLink('Merge',
array('action' => 'merge', $id), null,
'ACTION');
// Prepare to render.
$title = 'Customer: ' . $customer['Customer']['name'];
@@ -322,11 +374,51 @@ 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) {
$this->data = $this->Customer->details($id);
// REVISIT <AP>: 20090816
// This should never need to be done by a controller.
// However, until things stabilize, this gives the
// user a way to update any cached items on the
// customer, by just clicking Edit then Cancel.
$this->Customer->update($id);
// Get details on this customer, its contacts and leases
$customer = $this->Customer->find
('first', array
('contain' => array
(// Models
'Contact' =>
array('order' => array('Contact.display_name'),
// Models
'ContactPhone',
'ContactEmail',
'ContactAddress',
),
'Lease' =>
array('Unit' =>
array('order' => array('sort_order'),
'fields' => array('id', 'name'),
),
),
),
'conditions' => array('Customer.id' => $id),
));
$this->data = $customer;
$title = 'Customer: ' . $this->data['Customer']['name'] . " : Edit";
}
else {
@@ -355,10 +447,46 @@ 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();
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: merge
* - Merges two customers
*/
function merge($id = null) {
if ($id) {
$this->Customer->recursive = -1;
$customer = $this->Customer->read(null, $id);
$customer = $customer['Customer'];
if (empty($customer))
$this->INTERNAL_ERROR("Customer $id does not exist");
$this->set('dst_customer', $customer);
$this->set('dst_name', $customer['name']);
$this->set('dst_id', $id);
}
else {
$this->INTERNAL_ERROR("Merge called with invalid customer");
}
}
function mergeFinal() {
if (!$this->RequestHandler->isPost()) {
echo('<H2>THIS IS NOT A POST FOR SOME REASON</H2>');
return;
}
$post = $this->params['form'];
$this->Customer->merge($post['dst-id'], $post['src-id'],
unserialize($post['contact-ids']));
$this->redirect(array('action'=>'view', $post['dst-id']));
}
/**************************************************************************
**************************************************************************
**************************************************************************

View File

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

View File

@@ -2,26 +2,32 @@
class LeasesController extends AppController {
var $sidemenu_links =
array(array('name' => 'Leases', 'header' => true),
array('name' => 'Active', 'url' => array('controller' => 'leases', 'action' => 'active')),
array('name' => 'Closed', 'url' => array('controller' => 'leases', 'action' => 'closed')),
array('name' => 'Delinquent', 'url' => array('controller' => 'leases', 'action' => 'delinquent')),
array('name' => 'All', 'url' => array('controller' => 'leases', 'action' => 'all')),
);
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Active',
array('controller' => 'leases', 'action' => 'active'), null,
'CONTROLLER');
$this->addSideMenuLink('Closed',
array('controller' => 'leases', 'action' => 'closed'), null,
'CONTROLLER');
$this->addSideMenuLink('Delinquent',
array('controller' => 'leases', 'action' => 'delinquent'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'leases', 'action' => 'all'), null,
'CONTROLLER');
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -29,11 +35,11 @@ class LeasesController extends AppController {
* - Generate a listing of leases
*/
function index() { $this->all(); }
function active() { $this->gridView('Active Leases'); }
function index() { $this->active(); }
function active() { $this->gridView('Active Leases', 'active'); }
function delinquent() { $this->gridView('Delinquent Leases'); }
function closed() { $this->gridView('Closed Leases'); }
function all() { $this->gridView('All Leases', 'all'); }
function all() { $this->gridView('All Leases'); }
/**************************************************************************
@@ -170,49 +176,54 @@ class LeasesController extends AppController {
function move_out($id = null) {
if ($this->data) {
// Handle the move out based on the data given
//pr($this->data);
$this->Lease->moveOut($this->data['Lease']['id'],
'VACANT',
$this->data['Lease']['moveout_date']
);
$this->redirect($this->data['redirect']);
$lease = $this->Lease->find
('first', array
('contain' => array('Customer.id'),
'conditions' => array(array('Lease.id' => $this->data['Lease']['id'])),
));
$this->redirect(array('controller' => 'customers',
'action' => 'view',
$lease['Customer']['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');
}
@@ -387,6 +398,10 @@ class LeasesController extends AppController {
$this->set(compact('default_late'));
if ($type === 'move-in') {
// Make sure we have a valid lease that we're moving in
if (empty($lease))
$this->redirect(array('action' => 'index'));
$movein = array();
$movein['time'] = strtotime($lease['Lease']['movein_date']);
$movein['effective_time'] = strtotime($lease['Lease']['movein_date']);
@@ -429,6 +444,64 @@ class LeasesController extends AppController {
$this->redirect(array('action'=>'index'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: overview
* - Displays lease up information
*/
function overview($months = 12) {
$overview = array('months' => array());
for ($month = 0; $month < $months; ++$month) {
//for ($month = 12; $month >= 0; --$month) {
$this_month = "(DATE(NOW() - INTERVAL $month MONTH - INTERVAL DAY(NOW())-1 DAY))";
$next_month = "($this_month + INTERVAL 1 MONTH)";
$row = $this->Lease->find
('first', array('link' => array(),
'fields' => array("MONTHNAME($this_month) AS month",
"YEAR($this_month) AS year"),
));
$mname = $row[0]['month'] .', '. $row[0]['year'];
$overview['months'][$mname] = array('name' => $mname);
foreach(array('start' => array('before' => $this_month, 'after' => $this_month),
'finish' => array('before' => $next_month, 'after' => $next_month),
'peak' => array('before' => $next_month, 'after' => $this_month))
AS $type => $parm) {
$count = $this->Lease->find
('count',
array('link' => array(),
'conditions' => array("movein_date < {$parm['before']}",
"(moveout_date IS NULL OR moveout_date >= {$parm['after']})",
),
));
$overview['months'][$mname][$type] = $count;
}
foreach(array('movein', 'moveout') AS $mvinout) {
$count = $this->Lease->find
('count',
array('link' => array(),
'conditions' => array("{$mvinout}_date < $next_month",
"{$mvinout}_date >= $this_month")
));
$overview['months'][$mname][$mvinout] = $count;
}
}
// Enable the Reports menu section
$this->sideMenuAreaActivate('REPORT');
// Prepare to render.
$this->set('title', 'Lease Up Report');
$this->set(compact('overview'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -467,28 +540,21 @@ class LeasesController extends AppController {
// yet still have an outstanding balance. This can happen if someone
// were to reverse charges, or if a payment should come back NSF.
if (!isset($lease['Lease']['close_date']) || $outstanding_balance > 0) {
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
if (!isset($lease['Lease']['moveout_date']))
$this->sidemenu_links[] =
array('name' => 'Move-Out', 'url' => array('action' => 'move_out',
$id));
$this->addSideMenuLink('Move-Out',
array('action' => 'move_out', $id), null,
'ACTION');
if (!isset($lease['Lease']['close_date']))
$this->sidemenu_links[] =
array('name' => 'New Invoice', 'url' => array('action' => 'invoice',
$id));
$this->addSideMenuLink('New Invoice',
array('action' => 'invoice', $id), null,
'ACTION');
$this->sidemenu_links[] =
array('name' => 'New Receipt', 'url' => array('controller' => 'customers',
'action' => 'receipt',
$lease['Customer']['id']));
/* if ($outstanding_balance < 0) */
/* $this->sidemenu_links[] = */
/* array('name' => 'Transfer Credit to Customer', */
/* 'url' => array('action' => 'promote_surplus', $id)); */
$this->addSideMenuLink('New Receipt',
array('controller' => 'customers',
'action' => 'receipt',
$lease['Customer']['id']), null,
'ACTION');
// REVISIT <AP>:
// Not allowing refund to be issued from the lease, as
@@ -500,19 +566,19 @@ class LeasesController extends AppController {
$this->INTERNAL_ERROR("Should not have a customer lease credit.");
/* if ($outstanding_balance < 0) */
/* $this->sidemenu_links[] = */
/* array('name' => 'Issue Refund', */
/* 'url' => array('action' => 'refund', $id)); */
/* $this->addSideMenuLink('Issue Refund', */
/* array('action' => 'refund', $id), null, */
/* 'ACTION'); */
if (isset($lease['Lease']['moveout_date']) && $outstanding_balance > 0)
$this->sidemenu_links[] =
array('name' => 'Write-Off', 'url' => array('action' => 'bad_debt',
$id));
$this->addSideMenuLink('Write-Off',
array('action' => 'bad_debt', $id), null,
'ACTION');
if ($this->Lease->closeable($id))
$this->sidemenu_links[] =
array('name' => 'Close', 'url' => array('action' => 'close',
$id));
$this->addSideMenuLink('Close',
array('action' => 'close', $id), null,
'ACTION');
}
// Prepare to render

View File

@@ -2,19 +2,6 @@
class LedgerEntriesController extends AppController {
var $sidemenu_links = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
}
/**************************************************************************
**************************************************************************
@@ -130,8 +117,12 @@ class LedgerEntriesController extends AppController {
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['LedgerEntry'] = array('id');
$links['Transaction'] = array('id');
$links['Ledger'] = array('id');
$links['Account'] = array('controller' => 'accounts', 'name');
// REVISIT <AP>: 20090827
// Need to take 'level' into account
if ($this->Permission->allow('controller.accounts')) {
$links['Ledger'] = array('id');
$links['Account'] = array('name');
}
$links['Tender'] = array('name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}
@@ -157,12 +148,8 @@ class LedgerEntriesController extends AppController {
array('fields' => array('id', 'sequence', 'name'),
'Account' =>
array('fields' => array('id', 'name', 'type'),
'conditions' =>
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('Account.level >=' => 5),
),
),
),
),
'Tender' =>
array('fields' => array('id', 'name'),
@@ -202,6 +189,13 @@ class LedgerEntriesController extends AppController {
else
$entry['DoubleEntry'] = $entry['DebitDoubleEntry'];
// REVISIT <AP>: 20090816
// This page doesn't seem very useful, let's just keep it
// all to the double entry view.
$this->redirect(array('controller' => 'double_entries',
'action' => 'view',
$entry['DoubleEntry']['id']));
// Prepare to render.
$title = "Ledger Entry #{$entry['LedgerEntry']['id']}";
$this->set(compact('entry', 'title'));

View File

@@ -2,25 +2,29 @@
class LedgersController extends AppController {
var $sidemenu_links =
array(array('name' => 'Ledgers', 'header' => true),
array('name' => 'Current', 'url' => array('controller' => 'ledgers', 'action' => 'current')),
array('name' => 'Closed', 'url' => array('controller' => 'ledgers', 'action' => 'closed')),
array('name' => 'All', 'url' => array('controller' => 'ledgers', 'action' => 'all')),
);
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('Current',
array('controller' => 'ledgers', 'action' => 'current'), null,
'CONTROLLER');
$this->addSideMenuLink('Closed',
array('controller' => 'ledgers', 'action' => 'closed'), null,
'CONTROLLER');
$this->addSideMenuLink('All',
array('controller' => 'ledgers', 'action' => 'all'), null,
'CONTROLLER');
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -82,32 +86,32 @@ class LedgersController extends AppController {
$conditions[] = array('Ledger.close_transaction_id !=' => null);
}
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
$conditions[] = array('Account.level >=' => 10);
$conditions[] = array('Account.level >=' =>
$this->Permission->level('controller.accounts'));
return $conditions;
}
function gridDataOrder(&$params, &$model, $index, $direction) {
$id_sequence = false;
if ($index === 'id_sequence') {
$id_sequence = true;
$index = 'Ledger.account_id';
}
$order = parent::gridDataOrder($params, $model, $index, $direction);
if ($id_sequence) {
$order[] = 'Ledger.sequence ' . $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[] = 'Account.name ' . $direction;
$order[] = 'Ledger.sequence ' . $direction;
return $order;
}
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['Ledger'] = array('id_sequence');
$links['Account'] = array('name');
// REVISIT <AP>: 20090827
// Need to take 'level' into account
if ($this->Permission->allow('controller.accounts')) {
$links['Ledger'] = array('sequence');
$links['Account'] = array('name');
}
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}
@@ -127,9 +131,8 @@ class LedgersController extends AppController {
'Account',
),
'conditions' => array(array('Ledger.id' => $id),
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('Account.level >=' => 10),
array('Account.level >=' =>
$this->Permission->level('controller.accounts')),
),
)
);

View File

@@ -52,6 +52,7 @@ class MapsController extends AppController {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('action'=>'index'));
}
$this->sideMenuEnable('SITE', $this->op_area);
$this->set('info', $this->mapInfo($id, $requested_width));
$this->set('title', "Site Map");
}
@@ -95,8 +96,10 @@ class MapsController extends AppController {
array('fields' => array()),
'CurrentLease' =>
array('fields' => array($this->Map->Unit->CurrentLease->
delinquentField('CurrentLease'))),
array('fields' => array('id', 'paid_through_date',
$this->Map->Unit->CurrentLease->
delinquentField('CurrentLease')),
'Customer'),
'UnitSize' =>
array('fields' => array('id', 'depth', 'width',
@@ -166,12 +169,13 @@ class MapsController extends AppController {
'n-s' => $unit['MapsUnit']['transpose'] ? 0 : 1,
'status' => (($unit['Unit']['status'] === 'OCCUPIED' &&
!empty($unit[0]['delinquent']))
? 'LATE' : $unit['Unit']['status'])
? 'LATE' : $unit['Unit']['status']),
'data' => $unit,
);
}
/* pr($info); */
/* $this->render('/empty'); */
/* $this->render('/empty'); exit(); */
return $info;
}

View File

@@ -2,20 +2,7 @@
class StatementEntriesController extends AppController {
var $sidemenu_links = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* override: sideMenuLinks
* - Generates controller specific links for the side menu
*/
function sideMenuLinks() {
return array_merge(parent::sideMenuLinks(), $this->sidemenu_links);
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -24,6 +11,7 @@ class StatementEntriesController extends AppController {
*/
function index() { $this->gridView('All Statement Entries'); }
function unpaid() { $this->gridView('Unpaid Charges', 'unreconciled'); }
/**************************************************************************
@@ -60,7 +48,17 @@ class StatementEntriesController extends AppController {
if (!empty($params['post']['custom']['statement_entry_id'])) {
$link['ChargeEntry'] = array();
$link['DisbursementEntry'] = array();
// This query actually represents a union...
// Unpaid Charge/Surplus: ChargeID - NULL; DisbursementID - NULL
// Paid Charge/Refund: ChargeID - NULL; DisbursementID - !NULL
// Disbursement/Reversal: ChargeID - !NULL; DisbursementID - NULL
// <EMPTY SET>: ChargeID - !NULL; DisbursementID - !NULL
//
// The query is really slow unless we add the `id` condition to the join.
// A cleaner query would be nice, but we must work within the Cake framework.
$link['DisbursementEntry'] = array('conditions' =>
'`DisbursementEntry`.`id` = '
. $params['post']['custom']['statement_entry_id']);
}
return array('link' => $link);
@@ -121,23 +119,10 @@ class StatementEntriesController extends AppController {
if (isset($customer_id))
$conditions[] = array('StatementEntry.customer_id' => $customer_id);
if (isset($statement_entry_id)) {
if (isset($statement_entry_id))
$conditions[] = array('OR' =>
array(array('ChargeEntry.id' => $statement_entry_id),
array('DisbursementEntry.id' => $statement_entry_id)));
}
if ($params['action'] === 'unreconciled') {
$query = array('conditions' => $conditions);
$set = $this->StatementEntry->reconciledSet('CHARGE', $query, true);
$entries = array();
foreach ($set['entries'] AS $entry)
$entries[] = $entry['StatementEntry']['id'];
$conditions[] = array('StatementEntry.id' => $entries);
$params['userdata']['balance'] = $set['summary']['balance'];
}
return $conditions;
}
@@ -145,7 +130,10 @@ class StatementEntriesController extends AppController {
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['StatementEntry'] = array('id');
$links['Transaction'] = array('id');
$links['Account'] = array('name');
// REVISIT <AP>: 20090827
// Need to take 'level' into account
if ($this->Permission->allow('controller.accounts'))
$links['Account'] = array('name');
$links['Customer'] = array('name');
$links['Lease'] = array('number');
$links['Unit'] = array('name');
@@ -159,33 +147,48 @@ class StatementEntriesController extends AppController {
// 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[] = 'Transaction.stamp ' . $direction;
$order[] = 'StatementEntry.effective_date ' . $direction;
if ($index != 'Transaction.stamp' &&
$index != 'StatementEntry.effective_date') {
$order[] = 'Transaction.stamp ' . $direction;
$order[] = 'StatementEntry.effective_date ' . $direction;
}
$order[] = 'StatementEntry.id ' . $direction;
return $order;
}
function gridDataCountExecute(&$params, &$model, $query) {
if ($params['action'] === 'unreconciled') {
// REVISIT <AP> 20100413:
// This is a lame solution, as it runs the same queries twice
// (and causes code duplication). However, I'm not in the mood
// to flush out an actual "count" solution at the moment, and I
// also don't want to cache the results in $params (although
// that is probably the most sensible solution). So, I'll just
// calculate the reconciled set both times and live with the
// performance and maintenance penalty
$lquery = array('conditions' => $query['conditions']);
$set = $this->StatementEntry->reconciledSet('CHARGE', $lquery, true);
return count($set['entries']);
}
return parent::gridDataCountExecute($params, $model, $query);
}
function gridDataRecordsExecute(&$params, &$model, $query) {
/* if ($params['action'] === '???') { */
/* $tquery = array_diff_key($query, array('fields'=>1,'group'=>1,'limit'=>1,'order'=>1)); */
/* $tquery['fields'] = array("IF(StatementEntry.type = 'CHARGE'," . */
/* " SUM(COALESCE(DisbursementEntry.amount,0))," . */
/* " SUM(COALESCE(ChargeEntry.amount,0)))" . */
/* " AS 'applied'", */
/* "StatementEntry.amount - (" . */
/* "IF(StatementEntry.type = 'CHARGE'," . */
/* " SUM(COALESCE(DisbursementEntry.amount,0))," . */
/* " SUM(COALESCE(ChargeEntry.amount,0)))" . */
/* ") AS 'balance'", */
/* ); */
if ($params['action'] === 'unreconciled') {
$lquery = array('conditions' => $query['conditions']);
$set = $this->StatementEntry->reconciledSet('CHARGE', $lquery, true);
$entries = array();
foreach ($set['entries'] AS $entry)
$entries[] = $entry['StatementEntry']['id'];
$query['conditions'] = array('StatementEntry.id' => $entries);
$params['userdata']['balance'] = $set['summary']['balance'];
}
/* //pr(compact('tquery')); */
/* $total = $model->find('first', $tquery); */
/* $params['userdata']['total'] = $total[0]['applied']; */
/* $params['userdata']['balance'] = $total[0]['balance']; */
/* } */
if ($params['action'] === 'collected') {
$tquery = array_diff_key($query, array('fields'=>1,'group'=>1,'limit'=>1,'order'=>1));
$tquery['fields'] = array("SUM(COALESCE(StatementEntry.amount,0)) AS 'total'");
@@ -203,9 +206,42 @@ class StatementEntriesController extends AppController {
* action: reverse the ledger entry
*/
function reverse($id) {
$this->StatementEntry->reverse($id);
$this->redirect(array('action'=>'view', $id));
function reverse($id = null) {
if ($this->data) {
//pr($this->data); die();
$this->StatementEntry->reverse
($this->data['StatementEntry']['id'],
$this->data['Transaction']['stamp'],
$this->data['Transaction']['comment']);
$this->redirect(array('action'=>'view',
$this->data['StatementEntry']['id']));
$this->INTERNAL_ERROR('SHOULD HAVE REDIRECTED');
}
$this->StatementEntry->id = $id;
$entry = $this->StatementEntry->find
('first', array
('contain' => array('Customer', 'Transaction', 'Account'),
));
if (empty($entry)) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('controller' => 'customers',
'action'=>'index'));
}
if (!$this->StatementEntry->reversable($id)) {
$this->Session->setFlash(__('Item not reversable.', true));
$this->redirect(array('action'=>'view', $id));
}
// Prepare to render.
$title = ("Charge #{$entry['StatementEntry']['id']}" .
" : {$entry['StatementEntry']['amount']}" .
" : Reverse");
$this->set(compact('entry', 'title'));
}
@@ -221,6 +257,53 @@ class StatementEntriesController extends AppController {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: chargesbymonth
* - Displays charges by month
*/
function chargesbymonth($months = 12) {
$result = $this->StatementEntry->find
('all',
array('link' => array('Account' => array('fields' => 'name')),
'fields' => array_merge(array('MONTHNAME(effective_date) AS month',
'YEAR(effective_date) AS year'),
$this->StatementEntry->chargeDisbursementFields(true)),
'conditions' => array('Account.type' => 'INCOME',
'effective_date >= DATE(NOW() - INTERVAL '.($months-1).' MONTH - INTERVAL DAY(NOW())-1 DAY)',
'effective_date <= NOW()',
),
'group' => array('YEAR(effective_date)', 'MONTH(effective_date)', 'Account.id'),
'order' => array('YEAR(effective_date) DESC', 'MONTH(effective_date) DESC', 'Account.name'),
));
$overview = array('months' => array(), 'charges' => 0);
foreach ($result AS $row) {
$mname = $row[0]['month'] .', '. $row[0]['year'];
if (empty($overview['months'][$mname]))
$overview['months'][$mname] = array('name' => $mname,
'subs' => array(),
'charges' => 0);
$month = &$overview['months'][$mname];
$month['subs'][] = array('name' => $row['Account']['name'],
'charges' => $row[0]['balance']);
$month['charges'] += $row[0]['balance'];
$overview['charges'] += $row[0]['balance'];
}
// Enable the Reports menu section
$this->sideMenuAreaActivate('REPORT');
// Prepare to render.
$this->set('months', $months);
$this->set('title', 'Monthly Charges');
$this->set(compact('overview'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -233,15 +316,12 @@ class StatementEntriesController extends AppController {
('first',
array('contain' => array
('Transaction' => array('fields' => array('id', 'type', 'stamp')),
'Account' => array('id', 'name', 'type'),
'Account' => array('id', 'name', 'type', 'level'),
'Customer' => array('fields' => array('id', 'name')),
'Lease' => array('fields' => array('id')),
'Lease' => array('fields' => array('id', 'number')),
),
'conditions' => array(array('StatementEntry.id' => $id),
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('Account.level >=' => 5)
),
));
@@ -250,6 +330,10 @@ class StatementEntriesController extends AppController {
$this->redirect(array('controller' => 'accounts', 'action'=>'index'));
}
$entry['Account']['link'] =
$entry['Account']['level'] >=
$this->Permission->level('controller.accounts');
$stats = $this->StatementEntry->stats($id);
if (in_array(strtoupper($entry['StatementEntry']['type']), $this->StatementEntry->debitTypes()))
@@ -260,24 +344,16 @@ class StatementEntriesController extends AppController {
if (strtoupper($entry['StatementEntry']['type']) === 'CHARGE') {
$reversable = $this->StatementEntry->reversable($id);
// Set up dynamic menu items
if ($reversable || $stats['balance'] > 0)
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
if ($reversable)
$this->sidemenu_links[] =
array('name' => 'Reverse',
'url' => array('action' => 'reverse',
$id));
if ($this->StatementEntry->reversable($id))
$this->addSideMenuLink('Reverse',
array('action' => 'reverse', $id), null,
'ACTION');
if ($stats['balance'] > 0)
$this->sidemenu_links[] =
array('name' => 'Waive Balance',
'url' => array('action' => 'waive',
$id));
$this->addSideMenuLink('Waive Balance',
array('action' => 'waive', $id), null,
'ACTION');
}
// Prepare to render.

View File

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

View File

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

View File

@@ -0,0 +1,255 @@
<?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 gridDataOrder(&$params, &$model, $index, $direction) {
if ($index == 'UnitType.name')
$index = 'UnitType.code';
$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[] = 'UnitType.code ' . $direction;
$order[] = 'sqft ' . $direction;
$order[] = 'UnitSize.rent ' . $direction;
return $order;
}
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['UnitSize'] = array('name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: view
* - Displays information about a specific entry
*/
function view($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('controller' => 'accounts', 'action'=>'index'));
}
// Get the UnitSize and related fields
$this->UnitSize->id = $id;
$size = $this->UnitSize->find
('first', array
('contain' => array('UnitType'),
'fields' => array('UnitSize.*', 'UnitType.*',
'ROUND(UnitSize.width/12, 1) AS width',
'ROUND(UnitSize.depth/12, 1) AS depth',
'ROUND(UnitSize.height/12, 1) AS height',
'ROUND(UnitSize.width/12 * UnitSize.depth/12, 0) AS sqft',
'ROUND(UnitSize.width/12 * UnitSize.depth/12 * UnitSize.height/12, 0) AS cuft'),
));
$size['UnitSize'] = $size[0] + $size['UnitSize'];
unset($size[0]);
$this->set(compact('size'));
$this->set('stats', $this->UnitSize->stats($id));
// Prepare to render.
$title = "Unit Size : {$size['UnitSize']['name']}";
$this->set(compact('title'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: edit
* - Edit unit_size information
*/
function edit($id = null) {
$this->INTERNAL_ERROR('NOT READY');
if (isset($this->data)) {
// Check to see if the operation was cancelled.
if (isset($this->params['form']['cancel'])) {
if (empty($this->data['UnitSize']['id']))
$this->redirect(array('action'=>'index'));
$this->redirect(array('action'=>'view', $this->data['UnitSize']['id']));
}
// Make sure we have unit_size data
if (empty($this->data['UnitSize']) || empty($this->data['UnitSize']['id']))
$this->redirect(array('action'=>'index'));
// Save the unit_size and all associated data
$this->UnitSize->create();
$this->UnitSize->id = $this->data['UnitSize']['id'];
if (!$this->UnitSize->save($this->data, false)) {
$this->Session->setFlash("UNIT_SIZE SAVE FAILED", true);
pr("UNIT_SIZE SAVE FAILED");
}
$this->redirect(array('action'=>'view', $this->UnitSize->id));
}
if ($id) {
$this->data = $this->UnitSize->findById($id);
} else {
$this->redirect(array('action'=>'index'));
}
// Prepare to render.
$title = ('UnitSize ' . $this->data['UnitSize']['name'] .
" : Edit");
$this->set(compact('title'));
}
}

View File

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

View File

@@ -0,0 +1,76 @@
<?php
class UtilController extends AppController {
var $uses = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* function: reset_data
* - Development function. TO BE DELETED
*/
function reset_data() {
$this->layout = null;
$this->autoLayout = false;
$this->autoRender = false;
Configure::write('debug', '0');
$script = $_SERVER['DOCUMENT_ROOT'] . '/pmgr/build.cmd';
echo "<P>" . date('r') . "\n";
//echo "<P>Script: $script" . "\n";
$handle = popen($script . ' 2>&1', 'r');
//echo "<P>Handle: $handle; " . gettype($handle) . "\n";
echo "<P><PRE>\n";
while (($read = fread($handle, 2096))) {
echo $read;
}
echo "</PRE>\n";
pclose($handle);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: rebuild_box
*/
function rebuild_box($type) {
$this->layout = null;
$this->autoLayout = false;
$this->autoRender = false;
Configure::write('debug', '0');
$script = preg_replace('%/webroot/index.php$%',
'/build_'.$type.'box.cmd',
$_SERVER['SCRIPT_FILENAME']);
// REVISIT <AP>: 20090828
// Just use system call
$handle = popen($script . ' 2>&1', 'r');
while (($read = fread($handle, 2096))) {
// Do nothing
}
pclose($handle);
$url = $_SERVER['HTTP_REFERER'];
if (empty($url))
$url = "/";
$this->redirect($url);
}
function rebuild_sandbox() { $this->rebuild_box('sand'); }
function rebuild_devbox() { $this->rebuild_box('dev'); }
/**************************************************************************
**************************************************************************
**************************************************************************
* function: logmsg
* - action to allow posting log message data
*/
function logmsg() {
}
}

View File

@@ -121,25 +121,32 @@ class Account extends AppModel {
* - Returns the ID of the desired account
*/
function securityDepositAccountID() { return $this->nameToID('Security Deposit'); }
function rentAccountID() { return $this->nameToID('Rent'); }
function lateChargeAccountID() { return $this->nameToID('Late Charge'); }
function nsfAccountID() { return $this->nameToID('NSF'); }
function nsfChargeAccountID() { return $this->nameToID('NSF Charge'); }
function taxAccountID() { return $this->nameToID('Tax'); }
function accountReceivableAccountID() { return $this->nameToID('A/R'); }
function accountPayableAccountID() { return $this->nameToID('A/P'); }
function cashAccountID() { return $this->nameToID('Cash'); }
function checkAccountID() { return $this->nameToID('Check'); }
function moneyOrderAccountID() { return $this->nameToID('Money Order'); }
function achAccountID() { return $this->nameToID('ACH'); }
function concessionAccountID() { return $this->nameToID('Concession'); }
function waiverAccountID() { return $this->nameToID('Waiver'); }
function pettyCashAccountID() { return $this->nameToID('Petty Cash'); }
function invoiceAccountID() { return $this->nameToID('Invoice'); }
function receiptAccountID() { return $this->nameToID('Receipt'); }
function badDebtAccountID() { return $this->nameToID('Bad Debt'); }
function customerCreditAccountID() { return $this->nameToID(
function lookup($name, $check = true) {
$id = $this->nameToID($name);
if (empty($id) && $check)
$this->INTERNAL_ERROR("Missing Account '$name'");
return $id;
}
function securityDepositAccountID() { return $this->lookup('Security Deposit'); }
function rentAccountID() { return $this->lookup('Rent'); }
function lateChargeAccountID() { return $this->lookup('Late Charge'); }
function nsfAccountID() { return $this->lookup('NSF'); }
function nsfChargeAccountID() { return $this->lookup('NSF Charge'); }
function taxAccountID() { return $this->lookup('Tax'); }
function accountReceivableAccountID() { return $this->lookup('A/R'); }
function accountPayableAccountID() { return $this->lookup('A/P'); }
function cashAccountID() { return $this->lookup('Cash'); }
function checkAccountID() { return $this->lookup('Check'); }
function moneyOrderAccountID() { return $this->lookup('Money Order'); }
function achAccountID() { return $this->lookup('ACH'); }
function concessionAccountID() { return $this->lookup('Concession'); }
function waiverAccountID() { return $this->lookup('Waiver'); }
function pettyCashAccountID() { return $this->lookup('Petty Cash'); }
function invoiceAccountID() { return $this->lookup('Invoice'); }
function receiptAccountID() { return $this->lookup('Receipt'); }
function badDebtAccountID() { return $this->lookup('Bad Debt'); }
function customerCreditAccountID() { return $this->lookup(
// REVISIT <AP>: 20090816
// Use of A/R works, and saves an excess of accounts.
// However, a dedicated account is nice, since it can
@@ -181,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())
@@ -206,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'); }
/**************************************************************************
@@ -238,8 +233,8 @@ class Account extends AppModel {
$this->nsfAccountID(),
$this->waiverAccountID(),
$this->badDebtAccountID(),
//$this->nameToID('Closing'),
//$this->nameToID('Equity'),
//$this->lookup('Closing'),
//$this->lookup('Equity'),
)
AS $account_id) {
$accounts[$account_id] = $this->name($account_id);

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

@@ -20,15 +20,25 @@ class Customer extends AppModel {
),
'Lease',
'StatementEntry',
'ContactsCustomer',
'ContactsCustomer' => array(
// It would be nice to claim a dependency here, which would
// simplify deletion of a customer. However, for this to work
// Cake must have a primaryKey as a single field. This table
// makes use of a complex key, so we're out of luck.
/* 'dependent' => true, */
),
'Transaction',
'Tender',
);
var $hasAndBelongsToMany = array(
'Contact',
'Contact' => array(
'unique' => true,
),
);
//var $default_log_level = 20;
/**************************************************************************
**************************************************************************
@@ -54,17 +64,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;
@@ -101,12 +113,35 @@ class Customer extends AppModel {
$this->prEnter(compact('id', 'query'));
$this->queryInit($query);
$query['conditions'][] = array('StatementEntry.customer_id' => $id);
$query['conditions'][] = array('StatementEntry.account_id' =>
$this->StatementEntry->Account->securityDepositAccountID());
$sd_account_id =
$this->StatementEntry->Account->securityDepositAccountID();
$stats = $this->StatementEntry->stats(null, $query);
return $this->prReturn($stats['account_balance']);
$squery = $query;
$squery['conditions'][] = array('StatementEntry.customer_id' => $id);
$squery['conditions'][] = array('StatementEntry.account_id' => $sd_account_id);
$stats = $this->StatementEntry->stats(null, $squery);
$this->pr(26, compact('squery', 'stats'));
// OK, we know now how much we charged for a security
// deposit, as well as how much we received to pay for it.
// Now we need to know if any has been released.
// Yes... this sucks.
$lquery = $query;
$lquery['link'] = array('Transaction' =>
array('fields' => array(),
'Customer' =>
(empty($query['link'])
? array('fields' => array())
: $query['link'])));
$lquery['conditions'][] = array('Transaction.customer_id' => $id);
$lquery['conditions'][] = array('LedgerEntry.account_id' => $sd_account_id);
$lquery['conditions'][] = array('LedgerEntry.crdr' => 'DEBIT');
$lquery['fields'][] = 'SUM(LedgerEntry.amount) AS total';
$released = $this->StatementEntry->Transaction->LedgerEntry->find
('first', $lquery);
$this->pr(26, compact('lquery', 'released'));
return $this->prReturn($stats['Charge']['disbursement'] - $released[0]['total']);
}
@@ -167,6 +202,13 @@ class Customer extends AppModel {
}
$id = $this->id;
// Appears that $this->save() "helpfully" choses to add in
// any missing data fields, populated with default values.
// So, after saving is complete, the fields 'lease_count',
// 'past_lease_count', and 'current_lease_count' have all
// been reset to zero. Gee, thanks Cake...
$this->update($id);
// Remove all associated Customer Contacts, as it ensures
// any entries deleted by the user actually get deleted
// in the system. We'll recreate the needed ones anyway.
@@ -208,19 +250,152 @@ class Customer extends AppModel {
* - Update any cached or calculated fields
*/
function update($id) {
$this->prEnter(compact('id'));
// REVISIT <AP>: 20090812
// updateLeaseCount is handled directly when needed.
// Should we simplify by just doing it anyway?
//$this->updateLeaseCount($id);
if (empty($id)) {
$customers = $this->find('all', array('contain' => false, 'fields' => array('id')));
foreach ($customers AS $customer) {
// This SHOULDN'T happen, but check to be sure
// or we'll get infinite recursion.
if (empty($customer['Customer']['id']))
continue;
$this->update($customer['Customer']['id']);
}
return;
}
// updateLeaseCount is typically handled directly when needed.
// However, this function is used to _ensure_ customer info is
// current, so we're obligated to call it anyway.
$this->updateLeaseCount($id);
$current_leases =
$this->find('all',
array('link' => array('CurrentLease' => array('type' => 'INNER')),
// REVISIT <AP>: 20090816
// Do we need to update leases other than the current ones?
// It may be necessary. For example, a non-current lease
// can still be hit with an NSF item. In that case, it
// could have stale data if we look only to current leases.
//array('link' => array('CurrentLease' => array('type' => 'INNER')),
array('link' => array('Lease' => array('type' => 'INNER')),
'conditions' => array('Customer.id' => $id)));
foreach ($current_leases AS $lease)
$this->Lease->update($lease['CurrentLease']['id']);
foreach ($current_leases AS $lease) {
if (!empty($lease['CurrentLease']['id']))
$this->Lease->update($lease['CurrentLease']['id']);
if (!empty($lease['Lease']['id']))
$this->Lease->update($lease['Lease']['id']);
}
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: merge
* - Merges two customers into one
*/
function merge($dst_id, $src_id, $contacts) {
$this->prEnter(compact('dst_id', 'src_id', 'contacts'));
// Get the entire list of destination customer contacts
$dst_contacts = array();
$result = $this->find('all',
array('link' => array('ContactsCustomer'),
'fields' => array('ContactsCustomer.contact_id', 'ContactsCustomer.type'),
'conditions' => array(array('id' => $dst_id,
'ContactsCustomer.active' => true))));
foreach ($result AS $contact) {
$dst_contacts[$contact['ContactsCustomer']['contact_id']] = $contact['ContactsCustomer'];
}
$this->pr(17, compact('dst_contacts'));
// Get the entire list of source customer contacts
$src_contacts = array();
$result = $this->find('all',
array('link' => array('ContactsCustomer'),
'fields' => array('ContactsCustomer.contact_id', 'ContactsCustomer.type'),
'conditions' => array(array('id' => $src_id,
'ContactsCustomer.active' => true))));
foreach ($result AS $contact) {
$src_contacts[$contact['ContactsCustomer']['contact_id']] = $contact['ContactsCustomer'];
}
$this->pr(17, compact('src_contacts'));
// Verify the contacts list are all valid source customer contacts
foreach ($contacts AS $contact_id) {
if (!array_key_exists($contact_id, $src_contacts))
return $this->prReturn(false);
}
// Remove any contacts which are already destination customer contacts
$new_contacts = array_diff($contacts, array_keys($dst_contacts));
$all_contacts = array_merge($new_contacts, array_keys($dst_contacts));
$this->pr(17, compact('new_contacts', 'all_contacts'));
// For now, we'll assume the operation will succeed.
$ret = true;
// Add each desired source customer contact to the destination customer
foreach ($new_contacts AS $contact_id) {
$CM = new ContactsCustomer();
if (!$CM->save(array('customer_id' => $dst_id)
+ $src_contacts[$contact_id], false)) {
$ret = false;
}
}
$this->Lease->updateAll
(array('Lease.customer_id' => $dst_id),
array('Lease.customer_id' => $src_id)
);
$this->Tender->updateAll
(array('Tender.customer_id' => $dst_id),
array('Tender.customer_id' => $src_id)
);
$this->StatementEntry->updateAll
(array('StatementEntry.customer_id' => $dst_id),
array('StatementEntry.customer_id' => $src_id)
);
$this->Transaction->updateAll
(array('Transaction.customer_id' => $dst_id),
array('Transaction.customer_id' => $src_id)
);
// Make sure our lease counts, etc are correct
$this->update($dst_id);
// Delete the old customer
$this->pr(12, compact('src_id'), "Delete Customer");
$this->delete($src_id);
// Delete all the orphaned customers
foreach (array_diff(array_keys($src_contacts), $all_contacts) AS $contact_id) {
// Delete un-used or duplicate contacts
// REVISIT <AP> 20100702:
// Not sure if we really want to do this.
// On the one hand, they're probably really redundant,
// and only clutter up the list of all contacts. On the
// other hand, it destroys data, not only losing the
// history, but making it difficult to recover if the
// merge is a mistake. Additionally, we need to do
// extra checking to ensure that the contact is not
// in use by some other customer.
// We need some sort of Contact.deleted field...
$this->pr(12, compact('contact_id'), "Delete Contact");
$this->Contact->delete($contact_id);
}
// Finally, delete all customer contact relationships
$this->ContactsCustomer->deleteAll
(array('customer_id' => $src_id), false);
// Return the result
return $this->prReturn($ret);
}

View File

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

View File

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

View File

@@ -53,7 +53,7 @@ class DoubleEntry extends AppModel {
*/
function addDoubleEntry($entry1, $entry2, $entry1_tender = null) {
$this->prFunctionLevel(16);
//$this->prFunctionLevel(16);
$this->prEnter(compact('entry1', 'entry2', 'entry1_tender'));
$ret = array();

38
site/models/group.php Normal file
View File

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

View File

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

View File

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

View File

@@ -148,8 +148,11 @@ class Lease extends AppModel {
array('class' => 'StatementEntry',
'fields' => array(),
'conditions' => array
('SEx.effective_date = DATE_ADD(StatementEntry.through_date, INTERVAL 1 day)',
'SEx.lease_id = StatementEntry.lease_id',
('SEx.lease_id = StatementEntry.lease_id',
'SEx.type' => 'CHARGE',
'SEx.account_id' => $rent_account_id,
'SEx.reverse_transaction_id IS NULL',
'SEx.effective_date = DATE_ADD(StatementEntry.through_date, INTERVAL 1 day)',
),
),
),
@@ -159,6 +162,7 @@ class Lease extends AppModel {
'conditions' => array(array('Lease.id' => $id),
array('StatementEntry.type' => 'CHARGE'),
array('StatementEntry.account_id' => $rent_account_id),
array('StatementEntry.reverse_transaction_id IS NULL'),
array('SEx.id' => null),
),
)
@@ -259,7 +263,9 @@ class Lease extends AppModel {
'conditions' =>
array(array('StatementEntry.lease_id' => $id),
array('StatementEntry.account_id' => $rent_account_id)),
array('StatementEntry.account_id' => $rent_account_id),
array('StatementEntry.reverse_transaction_id IS NULL'),
),
'order' => array('StatementEntry.effective_date'),
),
@@ -278,7 +284,9 @@ class Lease extends AppModel {
('CHARGE',
array('conditions' =>
array(array('StatementEntry.lease_id' => $id),
array('StatementEntry.account_id' => $rent_account_id)),
array('StatementEntry.account_id' => $rent_account_id),
array('StatementEntry.reverse_transaction_id IS NULL'),
),
'order' => array('StatementEntry.through_date DESC'),
),
@@ -408,7 +416,6 @@ class Lease extends AppModel {
*/
function assessMonthlyLate($id, $date = null) {
$this->prFunctionLevel(25);
$this->prEnter(compact('id', 'date'));
$this->id = $id;
@@ -537,7 +544,7 @@ class Lease extends AppModel {
function conditionDelinquent($table_name = 'Lease') {
if (empty($table_name)) $t = ''; else $t = $table_name . '.';
return ("({$t}close_date IS NULL AND" .
" NOW() > DATE_ADD({$t}paid_through_date, INTERVAL 15 DAY))");
" NOW() > DATE_ADD({$t}paid_through_date, INTERVAL 1 DAY))");
}
function delinquentDaysSQL($table_name = 'Lease') {
@@ -792,6 +799,8 @@ class Lease extends AppModel {
* - Update any cached or calculated fields
*/
function update($id) {
$this->prEnter(compact('id'));
$this->id = $id;
$this->saveField('charge_through_date', $this->rentChargeThrough($id));
$this->saveField('paid_through_date', $this->rentPaidThrough($id));

View File

@@ -127,7 +127,7 @@ class LedgerEntry extends AppModel {
* - Inserts new Ledger Entry into the database
*/
function addLedgerEntry($entry, $tender = null) {
$this->prFunctionLevel(16);
//$this->prFunctionLevel(16);
$this->prEnter(compact('entry', 'tender'));
$ret = array('data' => $entry);
@@ -165,53 +165,13 @@ class LedgerEntry extends AppModel {
*/
function stats($id = null, $query = null, $set = null) {
$this->queryInit($query);
unset($query['group']);
if (!isset($query['link']['DoubleEntry']))
$query['link']['DoubleEntry'] = array();
/* if (!isset($query['link']['DoubleEntry']['fields'])) */
/* $query['link']['DoubleEntry']['fields'] = array(); */
if (isset($id))
$query['conditions'][] = array('Entry.id' => $id);
if (isset($set))
$set = strtoupper($set);
//pr(array('stats()', compact('id', 'query', 'set')));
$rtypes = array('charge', 'disbursement',
// 'debit', 'credit',
);
$stats = array();
foreach($rtypes AS $rtype) {
$Rtype = ucfirst($rtype);
if (($rtype == 'charge' && (!isset($set) || $set == 'DISBURSEMENT')) ||
($rtype == 'disbursement' && (!isset($set) || $set == 'CHARGE'))
) {
$rquery = $query;
$rquery['link'][$Rtype] =
array('fields' => array("SUM(COALESCE(Applied{$Rtype}.amount,0)) AS reconciled"));
$rquery['fields'] = array();
//$rquery['fields'][] = "SUM(DoubleEntry.amount) AS total";
$rquery['fields'][] = "SUM(DoubleEntry.amount) - SUM(COALESCE(Applied{$Rtype}.amount,0)) AS balance";
$rquery['conditions'][] = array("Applied{$Rtype}.id !=" => null);
$result = $this->find('first', $rquery);
//pr(compact('Rtype', 'rquery', 'result'));
$sumfld = $Rtype;
$stats[$sumfld] = $result[0];
/* if (!isset($stats[$sumfld]['applied'])) */
/* $stats[$sumfld]['applied'] = 0; */
}
}
return $stats;
// REVISIT <AP>: 20090816
// This function appeared to be dramatically broken,
// a throwback to an earlier time. I deleted its
// contents and added this error to ensure it does
// not get used.
$this->INTERNAL_ERROR('This function should not be used');
}
}

View File

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

76
site/models/option.php Normal file
View File

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

View File

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

105
site/models/permission.php Normal file
View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -23,7 +23,7 @@ class StatementEntry extends AppModel {
);
var $default_log_level = array('log' => 30, 'show' => 15);
//var $default_log_level = array('log' => 30, 'show' => 15);
var $max_log_level = 19;
/**************************************************************************
@@ -185,6 +185,9 @@ class StatementEntry extends AppModel {
function reversable($id) {
$this->prEnter(compact('id'));
if (empty($id))
return $this->prReturn(false);
// Verify the item is an actual charge
$this->id = $id;
$charge_type = $this->field('type');
@@ -205,7 +208,7 @@ class StatementEntry extends AppModel {
* function: reverse
* - Reverses the charges
*/
function reverse($id, $stamp = null) {
function reverse($id, $stamp = null, $comment) {
$this->prEnter(compact('id', 'stamp'));
// Verify the item can be reversed
@@ -222,7 +225,7 @@ class StatementEntry extends AppModel {
// Record the reversal transaction
$result = $this->Transaction->addReversal
($charge, $stamp, 'Charge Reversal');
($charge, $stamp, $comment ? $comment : 'Charge Reversal');
if (empty($result['error'])) {
// Mark the charge as reversed
@@ -258,7 +261,7 @@ class StatementEntry extends AppModel {
}
function reconciledSet($set, $query = null, $unrec = false, $if_rec_include_partial = false) {
$this->prFunctionLevel(array('log' => 16, 'show' => 10));
//$this->prFunctionLevel(array('log' => 16, 'show' => 10));
$this->prEnter(compact('set', 'query', 'unrec', 'if_rec_include_partial'));
$lquery = $this->reconciledSetQuery($set, $query);
$result = $this->find('all', $lquery);
@@ -291,7 +294,7 @@ class StatementEntry extends AppModel {
}
return $this->prReturn(array('entries' => $resultset,
'summary' => $this->stats(null, $query)));
'summary' => $this->stats(null, $query)));
}
@@ -335,6 +338,72 @@ class StatementEntry extends AppModel {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: outstandingDebits
* - Determines all debit types that have not yet been resolved.
* The name is a bit dumb, but it means any statement entry type
* that a positive customer balance could be used to offset. In
* other words, entries that are still in need of matching
* disbursements. Most notably, this means charges but could
* also mean things like refunds as well.
*/
function outstandingDebits($query = null, $customer_id = null,
$lease_id = null, $debit_types = null)
{
$this->prEnter(compact('query', 'lease_id',
'customer_id', 'charge_ids',
'debit_types'));
$this->queryInit($query);
if (empty($debit_types))
$debit_types = $this->debitTypes();
if (!empty($customer_id))
$query['conditions'][] = array('StatementEntry.customer_id' => $customer_id);
if (!empty($lease_id))
$query['conditions'][] = array('StatementEntry.lease_id' => $lease_id);
/* if (isset($charge_ids)) { */
/* // REVISIT <AP> 20100330: */
/* // Not using $query here, as this code was extracted from its */
/* // original location in assignCredits, and so I'm keeping the */
/* // logic consistent. It does seem, however, that we shouldn't */
/* // be ignoring $query if passed in. I'm sure this won't be */
/* // looked at until someone _does_ pass $query in (and it break), */
/* // so hopefully at that time, we can understand what needs to */
/* // happen in that case (requirements are not clear at present). */
/* $lquery = array('contain' => false, */
/* 'conditions' => array('StatementEntry.id' => $charge_ids)); */
/* } else { */
/* $lquery = $query; */
/* // If we're working with a specific lease, then limit charges to it */
/* if (!empty($lease_id)) */
/* $lquery['conditions'][] = array('StatementEntry.lease_id' => $lease_id); */
/* } */
if (empty($query['order']))
$query['order'] = 'StatementEntry.effective_date ASC';
$debits = array();
foreach ($debit_types AS $dtype) {
$rset = $this->reconciledSet($dtype, $query, true);
$entries = $rset['entries'];
$debits = array_merge($debits, $entries);
$this->pr(18, compact('dtype', 'entries'), "Outstanding Debit Entries");
}
return $this->prReturn($debits);
}
function outstandingCharges($query = null, $customer_id = null, $lease_id = null) {
return $this->outstandingDebits($query, $customer_id, $lease_id, array('CHARGE'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -356,9 +425,6 @@ class StatementEntry extends AppModel {
'customer_id', 'lease_id'));
$this->queryInit($query);
if (!empty($customer_id))
$query['conditions'][] = array('StatementEntry.customer_id' => $customer_id);
if (empty($disbursement_type))
$disbursement_type = 'DISBURSEMENT';
@@ -372,6 +438,9 @@ class StatementEntry extends AppModel {
$this->INTERNAL_ERROR("Charge IDs, yet no corresponding receipt");
$lquery = $query;
if (!empty($customer_id))
$lquery['conditions'][] = array('StatementEntry.customer_id' => $customer_id);
$lquery['conditions'][] = array('StatementEntry.type' => 'SURPLUS');
// REVISIT <AP>: 20090804
// We need to ensure that we're using surplus credits ONLY from either
@@ -420,23 +489,16 @@ class StatementEntry extends AppModel {
"Receipt Credit Added");
}
// Now find all unpaid charges
if (isset($charge_ids)) {
$lquery = array('contain' => false,
'conditions' => array('StatementEntry.id' => $charge_ids));
} else {
// Now find all unpaid charges, using either the specific set
// of charges given, or all outstanding charges based on the
// query, customer and/or lease
if (!empty($charge_ids)) {
$this->INTERNAL_ERROR("PERHAPS IMPLEMENTED - THOUGH NEVER TESTED");
$lquery = $query;
// If we're working with a specific lease, then limit charges to it
if (!empty($lease_id))
$lquery['conditions'][] = array('StatementEntry.lease_id' => $lease_id);
}
$lquery['order'] = 'StatementEntry.effective_date ASC';
$charges = array();
foreach ($this->debitTypes() AS $dtype) {
$rset = $this->reconciledSet($dtype, $lquery, true);
$entries = $rset['entries'];
$charges = array_merge($charges, $entries);
$this->pr(18, compact('dtype', 'entries'), "Outstanding Debit Entries");
$lquery['conditions'][] = array('StatementEntry.id' => $charge_ids);
$charges = $this->reconciledSet('CHARGE', $query, true);
} else {
$charges = $this->outstandingDebits($query, $customer_id, $lease_id);
}
// Work through all unpaid charges, applying disbursements as we go
@@ -480,14 +542,14 @@ class StatementEntry extends AppModel {
// Set the disbursement amount to the maximum amount
// possible without exceeding the charge or credit balance
$disbursement_amount = min($charge['balance'], $credit['balance']);
$disbursement_amount = round(min($charge['balance'], $credit['balance']), 2);
if (!isset($credit['applied']))
$credit['applied'] = 0;
$credit['applied'] += $disbursement_amount;
$credit['balance'] -= $disbursement_amount;
$credit['applied'] = round($credit['applied'] + $disbursement_amount, 2);
$credit['balance'] = round($credit['balance'] - $disbursement_amount, 2);
$this->pr(20, compact('credit'),
$this->pr(20, compact('credit', 'disbursement_amount'),
($credit['balance'] > 0 ? 'Utilized' : 'Exhausted') .
(empty($credit['receipt']) ? ' Credit' : ' Receipt'));
@@ -552,12 +614,12 @@ class StatementEntry extends AppModel {
}
// Adjust the charge balance to reflect the new disbursement
$charge['balance'] -= $disbursement_amount;
$charge['balance'] = round($charge['balance'] - $disbursement_amount, 2);
$this->pr(20, compact('charge', 'disbursement_amount'),
($charge['balance'] > 0 ? 'Unfinished' : 'Fully Paid') . ' Charge');
if ($charge['balance'] < 0)
die("HOW DID WE GET A NEGATIVE CHARGE AMOUNT?");
if ($charge['balance'] <= 0)
$this->pr(20, 'Fully Paid Charge');
}
// Break the $credit reference to avoid future problems
unset($credit);
@@ -645,7 +707,7 @@ class StatementEntry extends AppModel {
* - Returns summary data from the requested statement entry
*/
function stats($id = null, $query = null) {
$this->prFunctionLevel(array('log' => 16, 'show' => 10));
//$this->prFunctionLevel(array('log' => 16, 'show' => 10));
$this->prEnter(compact('id', 'query'));
$this->queryInit($query);

View File

@@ -8,6 +8,9 @@ class Tender extends AppModel {
'DepositTransaction' => array(
'className' => 'Transaction',
),
'DepositLedgerEntry' => array(
'className' => 'LedgerEntry',
),
'NsfTransaction' => array(
'className' => 'Transaction',
'dependent' => true,
@@ -131,6 +134,7 @@ class Tender extends AppModel {
('contain' =>
array('LedgerEntry',
'DepositTransaction',
'DepositLedgerEntry',
'NsfTransaction'),
));
$this->pr(20, compact('tender'));

View File

@@ -50,7 +50,7 @@ class Transaction extends AppModel {
);
var $default_log_level = array('log' => 30, 'show' => 15);
//var $default_log_level = array('log' => 30, 'show' => 15);
//var $max_log_level = 10;
/**************************************************************************
@@ -121,19 +121,114 @@ class Transaction extends AppModel {
'lease_id' => $lease_id,
);
// Go through the statement entries and flag as disbursements
foreach ($data['Entry'] AS &$entry)
$entry += array('type' => 'DISBURSEMENT', // not used
'account_id' =>
(isset($entry['Tender']['tender_type_id'])
? ($this->LedgerEntry->Tender->TenderType->
accountID($entry['Tender']['tender_type_id']))
: null),
);
// Go through the statement entries, making sure the tender
// is recorded into the correct account, and then performing
// an auto-deposit if necessary.
$deposit = array();
foreach ($data['Entry'] AS &$entry) {
if (empty($entry['Tender']['tender_type_id']))
continue;
$ttype = $this->LedgerEntry->Tender->TenderType->find
('first', array('contain' => false,
'conditions' =>
array('id' => $entry['Tender']['tender_type_id'])));
$ttype = $ttype['TenderType'];
// Set the account for posting.
$entry += array('account_id' => $ttype['account_id']);
/* // Check for auto deposit */
/* if (!empty($ttype['auto_deposit'])) { */
/* $deposit[] = array('id' => 0, */
/* 'account_id' => $ttype['deposit_account_id']); */
/* } */
}
unset($entry); // prevent trouble since $entry is reference
$ids = $this->addTransaction($data['control'], $data['Transaction'], $data['Entry']);
if (isset($ids['transaction_id']))
$ids['receipt_id'] = $ids['transaction_id'];
if (!empty($ids['error']))
return $this->prReturn(array('error' => true) + $ids);
$tender_ids = array();
foreach ($ids['entries'] AS $entry) {
$entry1 = $entry['DoubleEntry']['Entry1'];
if (!empty($entry1['Tender']['tender_id']))
$tender_ids[] = $entry1['Tender']['tender_id'];
}
$ids = $this->_autoDeposit($tender_ids, $ids);
return $this->prReturn($ids);
}
// REVISIT <AP>: 20090817
// Delete after rolling up the old items
function _autoDeposit($tender_ids, $ids) {
$deposit_tenders = $this->LedgerEntry->Tender->find
('all', array('contain' => array('TenderType' => array('fields' => array()),
'LedgerEntry' => array('fields' => array()),
),
'fields' => array('TenderType.deposit_account_id',
'TenderType.account_id',
'CONCAT("CREDIT") AS crdr',
'CONCAT("Auto Deposit") AS comment',
'SUM(LedgerEntry.amount) AS amount'),
'conditions' => array('Tender.id' => $tender_ids,
'TenderType.auto_deposit' => true,
),
'group' => 'TenderType.deposit_account_id',
));
if (!empty($deposit_tenders)) {
foreach ($deposit_tenders AS &$tender)
$tender = $tender[0] + array_diff_key($tender['TenderType'], array('id'=>1));
$this->pr(10, compact('tender_ids', 'deposit_tenders'));
// REVISIT <AP>: 20090817
// Multiple tenders could result in deposits to more than one
// account. We're already mucking with things by having a
// ledger entry that's not involved with the account_id of the
// transaction. We could handle this by not using the helper
// _splitEntries function, and just building or individual
// entries right here (which we should probably do anyway).
// However, I'm ignoring the issue for now...
if (count($deposit_tenders) > 1)
$this->INTERNAL_ERROR("Only expecting one tender type");
$deposit_ids = $this->addTransactionEntries
(array('include_ledger_entry' => true,
'include_statement_entry' => false,
),
array('id' => $ids['transaction_id'],
// REVISIT <AP>: 20090817
// This is an awful cheat, and we're going to
// get burned from it someday.
'type' => 'DEPOSIT',
'crdr' => 'DEBIT',
'account_id' => $deposit_tenders[0]['deposit_account_id'],
),
$deposit_tenders);
$ids['deposit'] = $deposit_ids;
if (!empty($deposit_ids['error']))
return $this->prReturn(array('error' => true) + $ids);
if (!empty($tender_ids)) {
$entry_id = $deposit_ids['entries'][0]['DoubleEntry']['Entry2']['ledger_entry_id'];
$this->pr(10, compact('tender_ids', 'entry_id'));
$this->LedgerEntry->Tender->updateAll
(array('Tender.deposit_transaction_id' => $ids['transaction_id'],
'Tender.deposit_ledger_entry_id' => $entry_id),
array('Tender.id' => $tender_ids)
);
}
}
return $this->prReturn($ids);
}
@@ -221,6 +316,7 @@ class Transaction extends AppModel {
array('assign' => false,
'include_ledger_entry' => true,
'include_statement_entry' => false,
'update_tender' => true,
);
// Establish the transaction as a deposit
@@ -239,12 +335,14 @@ class Transaction extends AppModel {
// Go through the statement entries and re-group by account id
$group = array();
foreach ($data['Entry'] AS &$entry) {
$tender_groups = array();
foreach ($data['Entry'] AS $entry) {
if (!isset($group[$entry['account_id']]))
$group[$entry['account_id']] =
array('account_id' => $entry['account_id'],
'amount' => 0);
$group[$entry['account_id']]['amount'] += $entry['amount'];
$tender_groups[$entry['account_id']][] = $entry['tender_id'];
}
$data['Entry'] = $group;
@@ -252,11 +350,20 @@ class Transaction extends AppModel {
if (isset($ids['transaction_id']))
$ids['deposit_id'] = $ids['transaction_id'];
if (!empty($ids['deposit_id'])) {
$this->LedgerEntry->Tender->updateAll
(array('Tender.deposit_transaction_id' => $ids['deposit_id']),
array('Tender.id' => $tender_ids)
);
$this->pr(21, array_intersect_key($ids, array('deposit_id'=>1))
+ array_intersect_key($data['control'], array('update_tender'=>1)));
if (!empty($ids['deposit_id']) && !empty($data['control']['update_tender'])) {
$this->pr(21, compact('tender_groups'));
foreach ($tender_groups AS $group => $tender_ids) {
$entry_id = $ids['entries'][$group]['DoubleEntry']['Entry2']['ledger_entry_id'];
$this->pr(19, compact('group', 'tender_ids', 'entry_id'));
$this->LedgerEntry->Tender->updateAll
(array('Tender.deposit_transaction_id' => $ids['deposit_id'],
'Tender.deposit_ledger_entry_id' => $entry_id),
array('Tender.id' => $tender_ids)
);
}
}
return $this->prReturn($ids);
@@ -279,6 +386,7 @@ class Transaction extends AppModel {
array('assign' => false,
'include_ledger_entry' => true,
'include_statement_entry' => false,
'allow_no_entries' => true,
);
// Establish the transaction as a close
@@ -426,6 +534,8 @@ class Transaction extends AppModel {
(in_array($transaction['type'], array('INVOICE', 'RECEIPT'))
&& empty($transaction['customer_id']))
) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Transaction verification failed');
return $this->prReturn(false);
}
@@ -441,6 +551,8 @@ class Transaction extends AppModel {
}
if (!empty($se) &&
!$this->StatementEntry->verifyStatementEntry($se)) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Transaction entry verification failed');
return $this->prReturn(false);
}
}
@@ -480,8 +592,11 @@ class Transaction extends AppModel {
// Save transaction to the database
$this->create();
if (!$this->save($transaction))
if (!$this->save($transaction)) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Failed to save Transaction');
return $this->prReturn(array('error' => true) + $ret);
}
$ret['transaction_id'] = $transaction['id'] = $this->id;
// Add the entries
@@ -554,7 +669,14 @@ class Transaction extends AppModel {
$ret['error'] = true;
}
$this->Customer->update($transaction['customer_id']);
if (!empty($transaction['customer_id'])) {
$this->Customer->update($transaction['customer_id']);
}
if (!empty($ret['error']))
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Failed to save Transaction');
return $this->prReturn($ret);
}
@@ -575,8 +697,11 @@ class Transaction extends AppModel {
$this->prEnter(compact('control', 'transaction', 'entries', 'split'));
// Verify that we have a transaction
if (empty($transaction['id']))
if (empty($transaction['id'])) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Invalid Transaction ID for adding entries');
return $this->prReturn(array('error' => true));
}
// If the entries are not already split, do so now.
if ($split) {
@@ -636,6 +761,10 @@ class Transaction extends AppModel {
}
}
if (!empty($ret['error']))
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Failed to save Transaction Entries');
return $this->prReturn($ret);
}
@@ -656,8 +785,11 @@ class Transaction extends AppModel {
// Verify that we have a transaction and entries
if (empty($transaction) ||
($transaction['type'] !== 'CLOSE' && empty($entries)))
(empty($entries) && empty($control['allow_no_entries']))) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Split Entries failed to validate');
return $this->prReturn(array('error' => true));
}
// set ledger ID as the current ledger of the specified account
if (empty($transaction['ledger_id']))
@@ -820,7 +952,13 @@ class Transaction extends AppModel {
// and recording it in the NSF account. It has nothing to do
// with the customer statement (charges, disbursements, credits, etc).
$bounce_result = $this->addDeposit
(array('Transaction' =>
(array('control' =>
// This is not a "normal" deposit, so we don't
// want to update the tender deposit transaction id
// (it already has the correct one).
array('update_tender' => false),
'Transaction' =>
array('stamp' => $stamp,
'type' => 'WITHDRAWAL',
'crdr' => 'CREDIT'),
@@ -830,7 +968,7 @@ class Transaction extends AppModel {
'account_id' => $this->Account->nsfAccountID(),
'amount' => $tender['LedgerEntry']['amount'],
))),
$tender['Transaction']['account_id']);
$tender['DepositLedgerEntry']['account_id']);
$this->pr(20, compact('bounce_result'));
$ret['bounce'] = $bounce_result;
@@ -860,8 +998,11 @@ class Transaction extends AppModel {
));
$this->pr(20, compact('nsf_ledger_entry'));
if (!$nsf_ledger_entry)
if (!$nsf_ledger_entry) {
// REVISIT <AP>: 20090828; Callers are not yet able to handle errors
$this->INTERNAL_ERROR('Failed to locate NSF ledger entry');
return $this->prReturn(array('error' => true) + $ret);
}
// Build a transaction to adjust all of the statement entries
$rollback =
@@ -902,16 +1043,20 @@ class Transaction extends AppModel {
}
}
// Add the sole ledger entry for this transaction
$rollback['Entry'][] =
array('include_ledger_entry' => true,
'include_statement_entry' => false,
'amount' => $rollback['Transaction']['amount'],
'account_id' => $this->Account->accountReceivableAccountID(),
);
// Add the sole ledger entry for this transaction. If there
// is not a transaction amount, then there is no point in
// recording a ledger entry of $0.00
if (!empty($rollback['Transaction']['amount'])) {
$rollback['Entry'][] =
array('include_ledger_entry' => true,
'include_statement_entry' => false,
'amount' => $rollback['Transaction']['amount'],
'account_id' => $this->Account->accountReceivableAccountID(),
);
// Set the transaction amount to be negative
$rollback['Transaction']['amount'] *= -1;
// Set the transaction amount to be negative
$rollback['Transaction']['amount'] *= -1;
}
// Record the transaction, which will un-pay previously paid
// charges, void any credits, and other similar work.
@@ -966,8 +1111,12 @@ class Transaction extends AppModel {
}
}
}
if (empty($ret['rollback']['error']) && empty($ret['nsf_ledger_entry_id']))
$this->INTERNAL_ERROR("NSF LE ID not found under rollback entries");
if (empty($ret['rollback']['error']) && empty($ret['nsf_ledger_entry_id'])) {
//$this->INTERNAL_ERROR("NSF LE ID not found under rollback entries");
// Actually, this can happen if an item is NSF without having ever
// been applied to any charges.
$ret['nsf_ledger_entry_id'] = null;
}
$ret['nsf_transaction_id'] = $ret['bounce']['transaction_id'];
return $this->prReturn($ret + array('error' => false));

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

39
site/models/user.php Normal file
View File

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

View File

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

View File

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

View File

@@ -1,471 +1,471 @@
<?php
/* SVN FILE: $Id$ */
/**
* DebugKit DebugToolbar Component
*
*
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.
* @since CakePHP v 1.2.0.4487
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
class ToolbarComponent extends Object {
/**
* Controller instance reference
*
* @var object
*/
var $controller;
/**
* Components used by DebugToolbar
*
* @var array
*/
var $components = array('RequestHandler');
/**
* The default panels the toolbar uses.
* which panels are used can be configured when attaching the component
*
* @var array
*/
var $_defaultPanels = array('session', 'request', 'sqlLog', 'timer', 'log', 'memory', 'variables');
/**
* Loaded panel objects.
*
* @var array
*/
var $panels = array();
/**
* fallback for javascript settings
*
* @var array
**/
var $_defaultJavascript = array(
'behavior' => '/debug_kit/js/js_debug_toolbar'
);
/**
* javascript files component will be using.
*
* @var array
**/
var $javascript = array();
/**
* initialize
*
* If debug is off the component will be disabled and not do any further time tracking
* or load the toolbar helper.
*
* @return bool
**/
function initialize(&$controller, $settings) {
if (Configure::read('debug') == 0) {
$this->enabled = false;
return false;
}
App::import('Vendor', 'DebugKit.DebugKitDebugger');
DebugKitDebugger::startTimer('componentInit', __('Component initialization and startup', true));
if (!isset($settings['panels'])) {
$settings['panels'] = $this->_defaultPanels;
}
if (isset($settings['javascript'])) {
$settings['javascript'] = $this->_setJavascript($settings['javascript']);
} else {
$settings['javascript'] = $this->_defaultJavascript;
}
$this->_loadPanels($settings['panels']);
unset($settings['panels']);
$this->_set($settings);
$this->controller =& $controller;
return false;
}
/**
* Component Startup
*
* @return bool
**/
function startup(&$controller) {
$currentViewClass = $controller->view;
$this->_makeViewClass($currentViewClass);
$controller->view = 'DebugKit.Debug';
if (!isset($controller->params['url']['ext']) || (isset($controller->params['url']['ext']) && $controller->params['url']['ext'] == 'html')) {
$format = 'Html';
} else {
$format = 'FirePhp';
}
$controller->helpers['DebugKit.Toolbar'] = array('output' => sprintf('DebugKit.%sToolbar', $format));
$panels = array_keys($this->panels);
foreach ($panels as $panelName) {
$this->panels[$panelName]->startup($controller);
}
DebugKitDebugger::stopTimer('componentInit');
DebugKitDebugger::startTimer('controllerAction', __('Controller Action', true));
}
/**
* beforeRender callback
*
* Calls beforeRender on all the panels and set the aggregate to the controller.
*
* @return void
**/
function beforeRender(&$controller) {
DebugKitDebugger::stopTimer('controllerAction');
$vars = array();
$panels = array_keys($this->panels);
foreach ($panels as $panelName) {
$panel =& $this->panels[$panelName];
$vars[$panelName]['content'] = $panel->beforeRender($controller);
$elementName = Inflector::underscore($panelName) . '_panel';
if (isset($panel->elementName)) {
$elementName = $panel->elementName;
}
$vars[$panelName]['elementName'] = $elementName;
$vars[$panelName]['plugin'] = $panel->plugin;
$vars[$panelName]['disableTimer'] = true;
}
$controller->set(array('debugToolbarPanels' => $vars, 'debugToolbarJavascript' => $this->javascript));
DebugKitDebugger::startTimer('controllerRender', __('Render Controller Action', true));
}
/**
* Load Panels used in the debug toolbar
*
* @return void
* @access protected
**/
function _loadPanels($panels) {
foreach ($panels as $panel) {
$className = $panel . 'Panel';
if (!class_exists($className) && !App::import('Vendor', $className)) {
trigger_error(sprintf(__('Could not load DebugToolbar panel %s', true), $panel), E_USER_WARNING);
continue;
}
$panelObj =& new $className();
if (is_subclass_of($panelObj, 'DebugPanel') || is_subclass_of($panelObj, 'debugpanel')) {
$this->panels[$panel] =& $panelObj;
}
}
}
/**
* Set the javascript to user scripts.
*
* Set either script key to false to exclude it from the rendered layout.
*
* @param array $scripts Javascript config information
* @return array
* @access protected
**/
function _setJavascript($scripts) {
$behavior = false;
if (!is_array($scripts)) {
$scripts = (array)$scripts;
}
if (isset($scripts[0])) {
$behavior = $scripts[0];
}
if (isset($scripts['behavior'])) {
$behavior = $scripts['behavior'];
}
if (!$behavior) {
return array();
} elseif ($behavior === true) {
$behavior = 'js';
}
if (strpos($behavior, '/') !== 0) {
$behavior .= '_debug_toolbar';
}
$pluginFile = APP . 'plugins' . DS . 'debug_kit' . DS . 'vendors' . DS . 'js' . DS . $behavior . '.js';
if (file_exists($pluginFile)) {
$behavior = '/debug_kit/js/' . $behavior . '.js';
}
return compact('behavior');
}
/**
* Makes the DoppleGangerView class if it doesn't already exist.
* This allows DebugView to be compatible with all view classes.
*
* @param string $baseClassName
* @access protected
* @return void
*/
function _makeViewClass($baseClassName) {
if (!class_exists('DoppelGangerView')) {
App::import('View', $baseClassName);
if (strpos('View', $baseClassName) === false) {
$baseClassName .= 'View';
}
$class = "class DoppelGangerView extends $baseClassName {}";
eval($class);
}
}
}
/**
* Debug Panel
*
* Abstract class for debug panels.
*
* @package cake.debug_kit
*/
class DebugPanel extends Object {
/**
* Defines which plugin this panel is from so the element can be located.
*
* @var string
*/
var $plugin = null;
/**
* startup the panel
*
* Pull information from the controller / request
*
* @param object $controller Controller reference.
* @return void
**/
function startup(&$controller) { }
/**
* Prepare output vars before Controller Rendering.
*
* @param object $controller Controller reference.
* @return void
**/
function beforeRender(&$controller) { }
}
/**
* Variables Panel
*
* Provides debug information on the View variables.
*
* @package cake.debug_kit.panels
**/
class VariablesPanel extends DebugPanel {
var $plugin = 'debug_kit';
}
/**
* Session Panel
*
* Provides debug information on the Session contents.
*
* @package cake.debug_kit.panels
**/
class SessionPanel extends DebugPanel {
var $plugin = 'debug_kit';
/**
* beforeRender callback
*
* @param object $controller
* @access public
* @return array
*/
function beforeRender(&$controller) {
return $controller->Session->read();
}
}
/**
* Request Panel
*
* Provides debug information on the Current request params.
*
* @package cake.debug_kit.panels
**/
class RequestPanel extends DebugPanel {
var $plugin = 'debug_kit';
/**
* beforeRender callback - grabs request params
*
* @return array
**/
function beforeRender(&$controller) {
$out = array();
$out['params'] = $controller->params;
if (isset($controller->Cookie)) {
$out['cookie'] = $controller->Cookie->read();
}
$out['get'] = $_GET;
$out['currentRoute'] = Router::currentRoute();
return $out;
}
}
/**
* Timer Panel
*
* Provides debug information on all timers used in a request.
*
* @package cake.debug_kit.panels
**/
class TimerPanel extends DebugPanel {
var $plugin = 'debug_kit';
/**
* startup - add in necessary helpers
*
* @return void
**/
function startup(&$controller) {
if (!in_array('Number', $controller->helpers)) {
$controller->helpers[] = 'Number';
}
}
}
/**
* Memory Panel
*
* Provides debug information on the memory consumption.
*
* @package cake.debug_kit.panels
**/
class MemoryPanel extends DebugPanel {
var $plugin = 'debug_kit';
/**
* startup - add in necessary helpers
*
* @return void
**/
function startup(&$controller) {
if (!in_array('Number', $controller->helpers)) {
$controller->helpers[] = 'Number';
}
}
}
/**
* sqlLog Panel
*
* Provides debug information on the SQL logs and provides links to an ajax explain interface.
*
* @package cake.debug_kit.panels
**/
class sqlLogPanel extends DebugPanel {
var $plugin = 'debug_kit';
var $dbConfigs = array();
/**
* get db configs.
*
* @param string $controller
* @access public
* @return void
*/
function startUp(&$controller) {
if (!class_exists('ConnectionManager')) {
$this->dbConfigs = array();
return false;
}
$this->dbConfigs = ConnectionManager::sourceList();
return true;
}
/**
* Get Sql Logs for each DB config
*
* @param string $controller
* @access public
* @return void
*/
function beforeRender(&$controller) {
$queryLogs = array();
if (!class_exists('ConnectionManager')) {
return array();
}
foreach ($this->dbConfigs as $configName) {
$db =& ConnectionManager::getDataSource($configName);
if ($db->isInterfaceSupported('showLog')) {
ob_start();
$db->showLog();
$queryLogs[$configName] = ob_get_clean();
}
}
return $queryLogs;
}
}
/**
* Log Panel - Reads log entries made this request.
*
* @package cake.debug_kit.panels
*/
class LogPanel extends DebugPanel {
var $plugin = 'debug_kit';
/**
* Log files to scan
*
* @var array
*/
var $logFiles = array('error.log', 'debug.log');
/**
* startup
*
* @return void
**/
function startup(&$controller) {
if (!class_exists('CakeLog')) {
App::import('Core', 'Log');
}
}
/**
* beforeRender Callback
*
* @return array
**/
function beforeRender(&$controller) {
$this->startTime = DebugKitDebugger::requestStartTime();
$this->currentTime = DebugKitDebugger::requestTime();
$out = array();
foreach ($this->logFiles as $log) {
$file = LOGS . $log;
if (!file_exists($file)) {
continue;
}
$out[$log] = $this->_parseFile($file);
}
return $out;
}
/**
* parse a log file and find the relevant entries
*
* @param string $filename Name of file to read
* @access protected
* @return array
*/
function _parseFile($filename) {
$file =& new File($filename);
$contents = $file->read();
$timePattern = '/(\d{4}-\d{2}\-\d{2}\s\d{1,2}\:\d{1,2}\:\d{1,2})/';
$chunks = preg_split($timePattern, $contents, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0, $len = count($chunks); $i < $len; $i += 2) {
if (strtotime($chunks[$i]) < $this->startTime) {
unset($chunks[$i], $chunks[$i + 1]);
}
}
return array_values($chunks);
}
}
<?php
/* SVN FILE: $Id$ */
/**
* DebugKit DebugToolbar Component
*
*
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.
* @since CakePHP v 1.2.0.4487
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
class ToolbarComponent extends Object {
/**
* Controller instance reference
*
* @var object
*/
var $controller;
/**
* Components used by DebugToolbar
*
* @var array
*/
var $components = array('RequestHandler');
/**
* The default panels the toolbar uses.
* which panels are used can be configured when attaching the component
*
* @var array
*/
var $_defaultPanels = array('session', 'request', 'sqlLog', 'timer', 'log', 'memory', 'variables');
/**
* Loaded panel objects.
*
* @var array
*/
var $panels = array();
/**
* fallback for javascript settings
*
* @var array
**/
var $_defaultJavascript = array(
'behavior' => '/debug_kit/js/js_debug_toolbar'
);
/**
* javascript files component will be using.
*
* @var array
**/
var $javascript = array();
/**
* initialize
*
* If debug is off the component will be disabled and not do any further time tracking
* or load the toolbar helper.
*
* @return bool
**/
function initialize(&$controller, $settings) {
if (Configure::read('debug') == 0) {
$this->enabled = false;
return false;
}
App::import('Vendor', 'DebugKit.DebugKitDebugger');
DebugKitDebugger::startTimer('componentInit', __('Component initialization and startup', true));
if (!isset($settings['panels'])) {
$settings['panels'] = $this->_defaultPanels;
}
if (isset($settings['javascript'])) {
$settings['javascript'] = $this->_setJavascript($settings['javascript']);
} else {
$settings['javascript'] = $this->_defaultJavascript;
}
$this->_loadPanels($settings['panels']);
unset($settings['panels']);
$this->_set($settings);
$this->controller =& $controller;
return false;
}
/**
* Component Startup
*
* @return bool
**/
function startup(&$controller) {
$currentViewClass = $controller->view;
$this->_makeViewClass($currentViewClass);
$controller->view = 'DebugKit.Debug';
if (!isset($controller->params['url']['ext']) || (isset($controller->params['url']['ext']) && $controller->params['url']['ext'] == 'html')) {
$format = 'Html';
} else {
$format = 'FirePhp';
}
$controller->helpers['DebugKit.Toolbar'] = array('output' => sprintf('DebugKit.%sToolbar', $format));
$panels = array_keys($this->panels);
foreach ($panels as $panelName) {
$this->panels[$panelName]->startup($controller);
}
DebugKitDebugger::stopTimer('componentInit');
DebugKitDebugger::startTimer('controllerAction', __('Controller Action', true));
}
/**
* beforeRender callback
*
* Calls beforeRender on all the panels and set the aggregate to the controller.
*
* @return void
**/
function beforeRender(&$controller) {
DebugKitDebugger::stopTimer('controllerAction');
$vars = array();
$panels = array_keys($this->panels);
foreach ($panels as $panelName) {
$panel =& $this->panels[$panelName];
$vars[$panelName]['content'] = $panel->beforeRender($controller);
$elementName = Inflector::underscore($panelName) . '_panel';
if (isset($panel->elementName)) {
$elementName = $panel->elementName;
}
$vars[$panelName]['elementName'] = $elementName;
$vars[$panelName]['plugin'] = $panel->plugin;
$vars[$panelName]['disableTimer'] = true;
}
$controller->set(array('debugToolbarPanels' => $vars, 'debugToolbarJavascript' => $this->javascript));
DebugKitDebugger::startTimer('controllerRender', __('Render Controller Action', true));
}
/**
* Load Panels used in the debug toolbar
*
* @return void
* @access protected
**/
function _loadPanels($panels) {
foreach ($panels as $panel) {
$className = $panel . 'Panel';
if (!class_exists($className) && !App::import('Vendor', $className)) {
trigger_error(sprintf(__('Could not load DebugToolbar panel %s', true), $panel), E_USER_WARNING);
continue;
}
$panelObj = new $className();
if (is_subclass_of($panelObj, 'DebugPanel') || is_subclass_of($panelObj, 'debugpanel')) {
$this->panels[$panel] =& $panelObj;
}
}
}
/**
* Set the javascript to user scripts.
*
* Set either script key to false to exclude it from the rendered layout.
*
* @param array $scripts Javascript config information
* @return array
* @access protected
**/
function _setJavascript($scripts) {
$behavior = false;
if (!is_array($scripts)) {
$scripts = (array)$scripts;
}
if (isset($scripts[0])) {
$behavior = $scripts[0];
}
if (isset($scripts['behavior'])) {
$behavior = $scripts['behavior'];
}
if (!$behavior) {
return array();
} elseif ($behavior === true) {
$behavior = 'js';
}
if (strpos($behavior, '/') !== 0) {
$behavior .= '_debug_toolbar';
}
$pluginFile = APP . 'plugins' . DS . 'debug_kit' . DS . 'vendors' . DS . 'js' . DS . $behavior . '.js';
if (file_exists($pluginFile)) {
$behavior = '/debug_kit/js/' . $behavior . '.js';
}
return compact('behavior');
}
/**
* Makes the DoppleGangerView class if it doesn't already exist.
* This allows DebugView to be compatible with all view classes.
*
* @param string $baseClassName
* @access protected
* @return void
*/
function _makeViewClass($baseClassName) {
if (!class_exists('DoppelGangerView')) {
App::import('View', $baseClassName);
if (strpos('View', $baseClassName) === false) {
$baseClassName .= 'View';
}
$class = "class DoppelGangerView extends $baseClassName {}";
eval($class);
}
}
}
/**
* Debug Panel
*
* Abstract class for debug panels.
*
* @package cake.debug_kit
*/
class DebugPanel extends Object {
/**
* Defines which plugin this panel is from so the element can be located.
*
* @var string
*/
var $plugin = null;
/**
* startup the panel
*
* Pull information from the controller / request
*
* @param object $controller Controller reference.
* @return void
**/
function startup(&$controller) { }
/**
* Prepare output vars before Controller Rendering.
*
* @param object $controller Controller reference.
* @return void
**/
function beforeRender(&$controller) { }
}
/**
* Variables Panel
*
* Provides debug information on the View variables.
*
* @package cake.debug_kit.panels
**/
class VariablesPanel extends DebugPanel {
var $plugin = 'debug_kit';
}
/**
* Session Panel
*
* Provides debug information on the Session contents.
*
* @package cake.debug_kit.panels
**/
class SessionPanel extends DebugPanel {
var $plugin = 'debug_kit';
/**
* beforeRender callback
*
* @param object $controller
* @access public
* @return array
*/
function beforeRender(&$controller) {
return $controller->Session->read();
}
}
/**
* Request Panel
*
* Provides debug information on the Current request params.
*
* @package cake.debug_kit.panels
**/
class RequestPanel extends DebugPanel {
var $plugin = 'debug_kit';
/**
* beforeRender callback - grabs request params
*
* @return array
**/
function beforeRender(&$controller) {
$out = array();
$out['params'] = $controller->params;
if (isset($controller->Cookie)) {
$out['cookie'] = $controller->Cookie->read();
}
$out['get'] = $_GET;
$out['currentRoute'] = Router::currentRoute();
return $out;
}
}
/**
* Timer Panel
*
* Provides debug information on all timers used in a request.
*
* @package cake.debug_kit.panels
**/
class TimerPanel extends DebugPanel {
var $plugin = 'debug_kit';
/**
* startup - add in necessary helpers
*
* @return void
**/
function startup(&$controller) {
if (!in_array('Number', $controller->helpers)) {
$controller->helpers[] = 'Number';
}
}
}
/**
* Memory Panel
*
* Provides debug information on the memory consumption.
*
* @package cake.debug_kit.panels
**/
class MemoryPanel extends DebugPanel {
var $plugin = 'debug_kit';
/**
* startup - add in necessary helpers
*
* @return void
**/
function startup(&$controller) {
if (!in_array('Number', $controller->helpers)) {
$controller->helpers[] = 'Number';
}
}
}
/**
* sqlLog Panel
*
* Provides debug information on the SQL logs and provides links to an ajax explain interface.
*
* @package cake.debug_kit.panels
**/
class sqlLogPanel extends DebugPanel {
var $plugin = 'debug_kit';
var $dbConfigs = array();
/**
* get db configs.
*
* @param string $controller
* @access public
* @return void
*/
function startUp(&$controller) {
if (!class_exists('ConnectionManager')) {
$this->dbConfigs = array();
return false;
}
$this->dbConfigs = ConnectionManager::sourceList();
return true;
}
/**
* Get Sql Logs for each DB config
*
* @param string $controller
* @access public
* @return void
*/
function beforeRender(&$controller) {
$queryLogs = array();
if (!class_exists('ConnectionManager')) {
return array();
}
foreach ($this->dbConfigs as $configName) {
$db =& ConnectionManager::getDataSource($configName);
if ($db->isInterfaceSupported('showLog')) {
ob_start();
$db->showLog();
$queryLogs[$configName] = ob_get_clean();
}
}
return $queryLogs;
}
}
/**
* Log Panel - Reads log entries made this request.
*
* @package cake.debug_kit.panels
*/
class LogPanel extends DebugPanel {
var $plugin = 'debug_kit';
/**
* Log files to scan
*
* @var array
*/
var $logFiles = array('error.log', 'debug.log');
/**
* startup
*
* @return void
**/
function startup(&$controller) {
if (!class_exists('CakeLog')) {
App::import('Core', 'Log');
}
}
/**
* beforeRender Callback
*
* @return array
**/
function beforeRender(&$controller) {
$this->startTime = DebugKitDebugger::requestStartTime();
$this->currentTime = DebugKitDebugger::requestTime();
$out = array();
foreach ($this->logFiles as $log) {
$file = LOGS . $log;
if (!file_exists($file)) {
continue;
}
$out[$log] = $this->_parseFile($file);
}
return $out;
}
/**
* parse a log file and find the relevant entries
*
* @param string $filename Name of file to read
* @access protected
* @return array
*/
function _parseFile($filename) {
$file = new File($filename);
$contents = $file->read();
$timePattern = '/(\d{4}-\d{2}\-\d{2}\s\d{1,2}\:\d{1,2}\:\d{1,2})/';
$chunks = preg_split($timePattern, $contents, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0, $len = count($chunks); $i < $len; $i += 2) {
if (strtotime($chunks[$i]) < $this->startTime) {
unset($chunks[$i], $chunks[$i + 1]);
}
}
return array_values($chunks);
}
}
?>

View File

@@ -1,144 +1,144 @@
<?php
/* SVN FILE: $Id$ */
/**
* DebugView test Case
*
*
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.
* @since CakePHP v 1.2.0.4487
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
App::import('Core', 'View');
if (!class_exists('DoppelGangerView')) {
class DoppelGangerView extends View {}
}
App::import('View', 'DebugKit.Debug');
App::import('Vendor', 'DebugKit.DebugKitDebugger');
/**
* Debug View Test Case
*
* @package debug_kit.tests
*/
class DebugViewTestCase extends CakeTestCase {
/**
* set Up test case
*
* @return void
**/
function setUp() {
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::parse('/');
$this->Controller =& ClassRegistry::init('Controller');
$this->View =& new DebugView($this->Controller, false);
$this->_debug = Configure::read('debug');
}
/**
* start Case - switch view paths
*
* @return void
**/
function startCase() {
$this->_viewPaths = Configure::read('viewPaths');
Configure::write('viewPaths', array(
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS,
APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS,
ROOT . DS . LIBS . 'view' . DS
));
}
/**
* test that element timers are working
*
* @return void
**/
function testElementTimers() {
$result = $this->View->element('test_element');
$this->assertPattern('/^this is the test element$/', $result);
$result = DebugKitDebugger::getTimers();
$this->assertTrue(isset($result['render_test_element.ctp']));
}
/**
* test rendering and ensure that timers are being set.
*
* @access public
* @return void
*/
function testRenderTimers() {
$this->Controller->viewPath = 'posts';
$this->Controller->action = 'index';
$this->Controller->params = array(
'action' => 'index',
'controller' => 'posts',
'plugin' => null,
'url' => array('url' => 'posts/index'),
'base' => null,
'here' => '/posts/index',
);
$this->Controller->layout = 'default';
$View =& new DebugView($this->Controller, false);
$View->render('index');
$result = DebugKitDebugger::getTimers();
$this->assertEqual(count($result), 3);
$this->assertTrue(isset($result['viewRender']));
$this->assertTrue(isset($result['render_default.ctp']));
$this->assertTrue(isset($result['render_index.ctp']));
}
/**
* Test for correct loading of helpers into custom view
*
* @return void
*/
function testLoadHelpers() {
$loaded = array();
$result = $this->View->_loadHelpers($loaded, array('Html', 'Javascript', 'Number'));
$this->assertTrue(is_object($result['Html']));
$this->assertTrue(is_object($result['Javascript']));
$this->assertTrue(is_object($result['Number']));
}
/**
* reset the view paths
*
* @return void
**/
function endCase() {
Configure::write('viewPaths', $this->_viewPaths);
}
/**
* tear down function
*
* @return void
**/
function tearDown() {
unset($this->View, $this->Controller);
DebugKitDebugger::clearTimers();
Configure::write('debug', $this->_debug);
}
}
<?php
/* SVN FILE: $Id$ */
/**
* DebugView test Case
*
*
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.
* @since CakePHP v 1.2.0.4487
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
App::import('Core', 'View');
if (!class_exists('DoppelGangerView')) {
class DoppelGangerView extends View {}
}
App::import('View', 'DebugKit.Debug');
App::import('Vendor', 'DebugKit.DebugKitDebugger');
/**
* Debug View Test Case
*
* @package debug_kit.tests
*/
class DebugViewTestCase extends CakeTestCase {
/**
* set Up test case
*
* @return void
**/
function setUp() {
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::parse('/');
$this->Controller =& ClassRegistry::init('Controller');
$this->View = new DebugView($this->Controller, false);
$this->_debug = Configure::read('debug');
}
/**
* start Case - switch view paths
*
* @return void
**/
function startCase() {
$this->_viewPaths = Configure::read('viewPaths');
Configure::write('viewPaths', array(
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS,
APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS,
ROOT . DS . LIBS . 'view' . DS
));
}
/**
* test that element timers are working
*
* @return void
**/
function testElementTimers() {
$result = $this->View->element('test_element');
$this->assertPattern('/^this is the test element$/', $result);
$result = DebugKitDebugger::getTimers();
$this->assertTrue(isset($result['render_test_element.ctp']));
}
/**
* test rendering and ensure that timers are being set.
*
* @access public
* @return void
*/
function testRenderTimers() {
$this->Controller->viewPath = 'posts';
$this->Controller->action = 'index';
$this->Controller->params = array(
'action' => 'index',
'controller' => 'posts',
'plugin' => null,
'url' => array('url' => 'posts/index'),
'base' => null,
'here' => '/posts/index',
);
$this->Controller->layout = 'default';
$View = new DebugView($this->Controller, false);
$View->render('index');
$result = DebugKitDebugger::getTimers();
$this->assertEqual(count($result), 3);
$this->assertTrue(isset($result['viewRender']));
$this->assertTrue(isset($result['render_default.ctp']));
$this->assertTrue(isset($result['render_index.ctp']));
}
/**
* Test for correct loading of helpers into custom view
*
* @return void
*/
function testLoadHelpers() {
$loaded = array();
$result = $this->View->_loadHelpers($loaded, array('Html', 'Javascript', 'Number'));
$this->assertTrue(is_object($result['Html']));
$this->assertTrue(is_object($result['Javascript']));
$this->assertTrue(is_object($result['Number']));
}
/**
* reset the view paths
*
* @return void
**/
function endCase() {
Configure::write('viewPaths', $this->_viewPaths);
}
/**
* tear down function
*
* @return void
**/
function tearDown() {
unset($this->View, $this->Controller);
DebugKitDebugger::clearTimers();
Configure::write('debug', $this->_debug);
}
}
?>

View File

@@ -1,137 +1,137 @@
<?php
/* SVN FILE: $Id$ */
/**
* Toolbar Abstract Helper Test Case
*
*
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage debug_kit.tests.views.helpers
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
App::import('Helper', 'DebugKit.FirePhpToolbar');
App::import('Core', array('View', 'Controller'));
require_once APP . 'plugins' . DS . 'debug_kit' . DS . 'tests' . DS . 'cases' . DS . 'test_objects.php';
FireCake::getInstance('TestFireCake');
class FirePhpToolbarHelperTestCase extends CakeTestCase {
/**
* setUp
*
* @return void
**/
function setUp() {
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::parse('/');
$this->Toolbar =& new ToolbarHelper(array('output' => 'DebugKit.FirePhpToolbar'));
$this->Toolbar->FirePhpToolbar =& new FirePhpToolbarHelper();
$this->Controller =& ClassRegistry::init('Controller');
if (isset($this->_debug)) {
Configure::write('debug', $this->_debug);
}
}
/**
* start Case - switch view paths
*
* @return void
**/
function startCase() {
$this->_viewPaths = Configure::read('viewPaths');
Configure::write('viewPaths', array(
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS,
APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS,
ROOT . DS . LIBS . 'view' . DS
));
$this->_debug = Configure::read('debug');
$this->firecake =& FireCake::getInstance();
}
/**
* test neat array (dump)creation
*
* @return void
*/
function testMakeNeatArray() {
$this->Toolbar->makeNeatArray(array(1,2,3));
$result = $this->firecake->sentHeaders;
$this->assertTrue(isset($result['X-Wf-1-1-1-1']));
$this->assertPattern('/\[1,2,3\]/', $result['X-Wf-1-1-1-1']);
}
/**
* testAfterlayout element rendering
*
* @return void
*/
function testAfterLayout(){
$this->Controller->viewPath = 'posts';
$this->Controller->action = 'index';
$this->Controller->params = array(
'action' => 'index',
'controller' => 'posts',
'plugin' => null,
'url' => array('url' => 'posts/index', 'ext' => 'xml'),
'base' => null,
'here' => '/posts/index',
);
$this->Controller->layout = 'default';
$this->Controller->uses = null;
$this->Controller->components = array('DebugKit.Toolbar');
$this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render();
$this->assertNoPattern('/debug-toolbar/', $result);
$result = $this->firecake->sentHeaders;
$this->assertTrue(is_array($result));
}
/**
* endTest()
*
* @return void
*/
function endTest() {
TestFireCake::reset();
}
/**
* reset the view paths
*
* @return void
**/
function endCase() {
Configure::write('viewPaths', $this->_viewPaths);
}
/**
* tearDown
*
* @access public
* @return void
*/
function tearDown() {
unset($this->Toolbar, $this->Controller);
ClassRegistry::removeObject('view');
ClassRegistry::flush();
Router::reload();
}
}
<?php
/* SVN FILE: $Id$ */
/**
* Toolbar Abstract Helper Test Case
*
*
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage debug_kit.tests.views.helpers
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
App::import('Helper', 'DebugKit.FirePhpToolbar');
App::import('Core', array('View', 'Controller'));
require_once APP . 'plugins' . DS . 'debug_kit' . DS . 'tests' . DS . 'cases' . DS . 'test_objects.php';
FireCake::getInstance('TestFireCake');
class FirePhpToolbarHelperTestCase extends CakeTestCase {
/**
* setUp
*
* @return void
**/
function setUp() {
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::parse('/');
$this->Toolbar = new ToolbarHelper(array('output' => 'DebugKit.FirePhpToolbar'));
$this->Toolbar->FirePhpToolbar = new FirePhpToolbarHelper();
$this->Controller =& ClassRegistry::init('Controller');
if (isset($this->_debug)) {
Configure::write('debug', $this->_debug);
}
}
/**
* start Case - switch view paths
*
* @return void
**/
function startCase() {
$this->_viewPaths = Configure::read('viewPaths');
Configure::write('viewPaths', array(
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS,
APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS,
ROOT . DS . LIBS . 'view' . DS
));
$this->_debug = Configure::read('debug');
$this->firecake =& FireCake::getInstance();
}
/**
* test neat array (dump)creation
*
* @return void
*/
function testMakeNeatArray() {
$this->Toolbar->makeNeatArray(array(1,2,3));
$result = $this->firecake->sentHeaders;
$this->assertTrue(isset($result['X-Wf-1-1-1-1']));
$this->assertPattern('/\[1,2,3\]/', $result['X-Wf-1-1-1-1']);
}
/**
* testAfterlayout element rendering
*
* @return void
*/
function testAfterLayout(){
$this->Controller->viewPath = 'posts';
$this->Controller->action = 'index';
$this->Controller->params = array(
'action' => 'index',
'controller' => 'posts',
'plugin' => null,
'url' => array('url' => 'posts/index', 'ext' => 'xml'),
'base' => null,
'here' => '/posts/index',
);
$this->Controller->layout = 'default';
$this->Controller->uses = null;
$this->Controller->components = array('DebugKit.Toolbar');
$this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render();
$this->assertNoPattern('/debug-toolbar/', $result);
$result = $this->firecake->sentHeaders;
$this->assertTrue(is_array($result));
}
/**
* endTest()
*
* @return void
*/
function endTest() {
TestFireCake::reset();
}
/**
* reset the view paths
*
* @return void
**/
function endCase() {
Configure::write('viewPaths', $this->_viewPaths);
}
/**
* tearDown
*
* @access public
* @return void
*/
function tearDown() {
unset($this->Toolbar, $this->Controller);
ClassRegistry::removeObject('view');
ClassRegistry::flush();
Router::reload();
}
}
?>

View File

@@ -1,358 +1,358 @@
<?php
/* SVN FILE: $Id$ */
/**
* Toolbar HTML Helper Test Case
*
*
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage debug_kit.tests.views.helpers
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
App::import('Helper', array('DebugKit.HtmlToolbar', 'Html', 'Javascript'));
App::import('Core', array('View', 'Controller'));
class HtmlToolbarHelperTestCase extends CakeTestCase {
/**
* setUp
*
* @return void
**/
function setUp() {
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::parse('/');
$this->Toolbar =& new ToolbarHelper(array('output' => 'DebugKit.HtmlToolbar'));
$this->Toolbar->HtmlToolbar =& new HtmlToolbarHelper();
$this->Toolbar->HtmlToolbar->Html =& new HtmlHelper();
$this->Toolbar->HtmlToolbar->Javascript =& new JavascriptHelper();
$this->Controller =& ClassRegistry::init('Controller');
if (isset($this->_debug)) {
Configure::write('debug', $this->_debug);
}
}
/**
* start Case - switch view paths
*
* @return void
**/
function startCase() {
$this->_viewPaths = Configure::read('viewPaths');
Configure::write('viewPaths', array(
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS,
APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS,
ROOT . DS . LIBS . 'view' . DS
));
$this->_debug = Configure::read('debug');
}
/**
* test Neat Array formatting
*
* @return void
**/
function testMakeNeatArray() {
$in = false;
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', '0' , '/strong', '(false)', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = null;
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', '0' , '/strong', '(null)', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = true;
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', '0' , '/strong', '(true)', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array('key' => 'value');
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array('key' => null);
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', '(null)', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array('key' => 'value', 'foo' => 'bar');
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong', 'bar', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array(
'key' => 'value',
'foo' => array(
'this' => 'deep',
'another' => 'value'
)
);
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong',
array('ul' => array('class' => 'neat-array depth-1')),
'<li', '<strong', 'this', '/strong', 'deep', '/li',
'<li', '<strong', 'another', '/strong', 'value', '/li',
'/ul',
'/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array(
'key' => 'value',
'foo' => array(
'this' => 'deep',
'another' => 'value'
),
'lotr' => array(
'gandalf' => 'wizard',
'bilbo' => 'hobbit'
)
);
$result = $this->Toolbar->makeNeatArray($in, 1);
$expected = array(
'ul' => array('class' => 'neat-array depth-0 expanded'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong',
array('ul' => array('class' => 'neat-array depth-1')),
'<li', '<strong', 'this', '/strong', 'deep', '/li',
'<li', '<strong', 'another', '/strong', 'value', '/li',
'/ul',
'/li',
'<li', '<strong', 'lotr', '/strong',
array('ul' => array('class' => 'neat-array depth-1')),
'<li', '<strong', 'gandalf', '/strong', 'wizard', '/li',
'<li', '<strong', 'bilbo', '/strong', 'hobbit', '/li',
'/ul',
'/li',
'/ul'
);
$this->assertTags($result, $expected);
$result = $this->Toolbar->makeNeatArray($in, 2);
$expected = array(
'ul' => array('class' => 'neat-array depth-0 expanded'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong',
array('ul' => array('class' => 'neat-array depth-1 expanded')),
'<li', '<strong', 'this', '/strong', 'deep', '/li',
'<li', '<strong', 'another', '/strong', 'value', '/li',
'/ul',
'/li',
'<li', '<strong', 'lotr', '/strong',
array('ul' => array('class' => 'neat-array depth-1 expanded')),
'<li', '<strong', 'gandalf', '/strong', 'wizard', '/li',
'<li', '<strong', 'bilbo', '/strong', 'hobbit', '/li',
'/ul',
'/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array('key' => 'value', 'array' => array());
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'array', '/strong', '(empty)', '/li',
'/ul'
);
$this->assertTags($result, $expected);
}
/**
* Test injection of toolbar
*
* @return void
**/
function testInjectToolbar() {
$this->Controller->viewPath = 'posts';
$this->Controller->action = 'index';
$this->Controller->params = array(
'action' => 'index',
'controller' => 'posts',
'plugin' => null,
'url' => array('url' => 'posts/index'),
'base' => null,
'here' => '/posts/index',
);
$this->Controller->helpers = array('Html', 'Javascript', 'DebugKit.Toolbar');
$this->Controller->layout = 'default';
$this->Controller->uses = null;
$this->Controller->components = array('DebugKit.Toolbar');
$this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render();
$result = str_replace(array("\n", "\r"), '', $result);
$this->assertPattern('#<div id\="debug-kit-toolbar">.+</div></body>#', $result);
}
/**
* test injection of javascript
*
* @return void
**/
function testJavascriptInjection() {
$this->Controller->viewPath = 'posts';
$this->Controller->uses = null;
$this->Controller->action = 'index';
$this->Controller->params = array(
'action' => 'index',
'controller' => 'posts',
'plugin' => null,
'url' => array('url' => 'posts/index'),
'base' => '/',
'here' => '/posts/index',
);
$this->Controller->helpers = array('Javascript', 'Html');
$this->Controller->components = array('DebugKit.Toolbar');
$this->Controller->layout = 'default';
$this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render();
$result = str_replace(array("\n", "\r"), '', $result);
$this->assertPattern('#<script\s*type="text/javascript"\s*src="/debug_kit/js/js_debug_toolbar.js"\s*>\s?</script>#', $result);
}
/**
* test Injection of user defined javascript
*
* @return void
**/
function testCustomJavascriptInjection() {
$this->Controller->viewPath = 'posts';
$this->Controller->uses = null;
$this->Controller->action = 'index';
$this->Controller->params = array(
'action' => 'index',
'controller' => 'posts',
'plugin' => null,
'url' => array('url' => 'posts/index'),
'base' => '/',
'here' => '/posts/index',
);
$this->Controller->helpers = array('Javascript', 'Html');
$this->Controller->components = array('DebugKit.Toolbar' => array('javascript' => array('my_custom')));
$this->Controller->layout = 'default';
$this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render();
$result = str_replace(array("\n", "\r"), '', $result);
$this->assertPattern('#<script\s*type="text/javascript"\s*src="js/my_custom_debug_toolbar.js"\s*>\s?</script>#', $result);
}
/**
* test message creation
*
* @return void
*/
function testMessage() {
$result = $this->Toolbar->message('test', 'one, two');
$expected = array(
'<p',
'<strong', 'test', '/strong',
' one, two',
'/p',
);
$this->assertTags($result, $expected);
}
/**
* Test Table generation
*
* @return void
*/
function testTable() {
$rows = array(
array(1,2),
array(3,4),
);
$result = $this->Toolbar->table($rows);
$expected = array(
'table' => array('class' =>'debug-table'),
array('tr' => array('class' => 'odd')),
'<td', '1', '/td',
'<td', '2', '/td',
'/tr',
array('tr' => array('class' => 'even')),
'<td', '3', '/td',
'<td', '4', '/td',
'/tr',
'/table'
);
$this->assertTags($result, $expected);
}
/**
* reset the view paths
*
* @return void
**/
function endCase() {
Configure::write('viewPaths', $this->_viewPaths);
}
/**
* tearDown
*
* @access public
* @return void
*/
function tearDown() {
unset($this->Toolbar, $this->Controller);
ClassRegistry::removeObject('view');
ClassRegistry::flush();
}
}
<?php
/* SVN FILE: $Id$ */
/**
* Toolbar HTML Helper Test Case
*
*
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage debug_kit.tests.views.helpers
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
App::import('Helper', array('DebugKit.HtmlToolbar', 'Html', 'Javascript'));
App::import('Core', array('View', 'Controller'));
class HtmlToolbarHelperTestCase extends CakeTestCase {
/**
* setUp
*
* @return void
**/
function setUp() {
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::parse('/');
$this->Toolbar = new ToolbarHelper(array('output' => 'DebugKit.HtmlToolbar'));
$this->Toolbar->HtmlToolbar = new HtmlToolbarHelper();
$this->Toolbar->HtmlToolbar->Html = new HtmlHelper();
$this->Toolbar->HtmlToolbar->Javascript = new JavascriptHelper();
$this->Controller =& ClassRegistry::init('Controller');
if (isset($this->_debug)) {
Configure::write('debug', $this->_debug);
}
}
/**
* start Case - switch view paths
*
* @return void
**/
function startCase() {
$this->_viewPaths = Configure::read('viewPaths');
Configure::write('viewPaths', array(
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS,
APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS,
ROOT . DS . LIBS . 'view' . DS
));
$this->_debug = Configure::read('debug');
}
/**
* test Neat Array formatting
*
* @return void
**/
function testMakeNeatArray() {
$in = false;
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', '0' , '/strong', '(false)', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = null;
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', '0' , '/strong', '(null)', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = true;
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', '0' , '/strong', '(true)', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array('key' => 'value');
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array('key' => null);
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', '(null)', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array('key' => 'value', 'foo' => 'bar');
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong', 'bar', '/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array(
'key' => 'value',
'foo' => array(
'this' => 'deep',
'another' => 'value'
)
);
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong',
array('ul' => array('class' => 'neat-array depth-1')),
'<li', '<strong', 'this', '/strong', 'deep', '/li',
'<li', '<strong', 'another', '/strong', 'value', '/li',
'/ul',
'/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array(
'key' => 'value',
'foo' => array(
'this' => 'deep',
'another' => 'value'
),
'lotr' => array(
'gandalf' => 'wizard',
'bilbo' => 'hobbit'
)
);
$result = $this->Toolbar->makeNeatArray($in, 1);
$expected = array(
'ul' => array('class' => 'neat-array depth-0 expanded'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong',
array('ul' => array('class' => 'neat-array depth-1')),
'<li', '<strong', 'this', '/strong', 'deep', '/li',
'<li', '<strong', 'another', '/strong', 'value', '/li',
'/ul',
'/li',
'<li', '<strong', 'lotr', '/strong',
array('ul' => array('class' => 'neat-array depth-1')),
'<li', '<strong', 'gandalf', '/strong', 'wizard', '/li',
'<li', '<strong', 'bilbo', '/strong', 'hobbit', '/li',
'/ul',
'/li',
'/ul'
);
$this->assertTags($result, $expected);
$result = $this->Toolbar->makeNeatArray($in, 2);
$expected = array(
'ul' => array('class' => 'neat-array depth-0 expanded'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong',
array('ul' => array('class' => 'neat-array depth-1 expanded')),
'<li', '<strong', 'this', '/strong', 'deep', '/li',
'<li', '<strong', 'another', '/strong', 'value', '/li',
'/ul',
'/li',
'<li', '<strong', 'lotr', '/strong',
array('ul' => array('class' => 'neat-array depth-1 expanded')),
'<li', '<strong', 'gandalf', '/strong', 'wizard', '/li',
'<li', '<strong', 'bilbo', '/strong', 'hobbit', '/li',
'/ul',
'/li',
'/ul'
);
$this->assertTags($result, $expected);
$in = array('key' => 'value', 'array' => array());
$result = $this->Toolbar->makeNeatArray($in);
$expected = array(
'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'array', '/strong', '(empty)', '/li',
'/ul'
);
$this->assertTags($result, $expected);
}
/**
* Test injection of toolbar
*
* @return void
**/
function testInjectToolbar() {
$this->Controller->viewPath = 'posts';
$this->Controller->action = 'index';
$this->Controller->params = array(
'action' => 'index',
'controller' => 'posts',
'plugin' => null,
'url' => array('url' => 'posts/index'),
'base' => null,
'here' => '/posts/index',
);
$this->Controller->helpers = array('Html', 'Javascript', 'DebugKit.Toolbar');
$this->Controller->layout = 'default';
$this->Controller->uses = null;
$this->Controller->components = array('DebugKit.Toolbar');
$this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render();
$result = str_replace(array("\n", "\r"), '', $result);
$this->assertPattern('#<div id\="debug-kit-toolbar">.+</div></body>#', $result);
}
/**
* test injection of javascript
*
* @return void
**/
function testJavascriptInjection() {
$this->Controller->viewPath = 'posts';
$this->Controller->uses = null;
$this->Controller->action = 'index';
$this->Controller->params = array(
'action' => 'index',
'controller' => 'posts',
'plugin' => null,
'url' => array('url' => 'posts/index'),
'base' => '/',
'here' => '/posts/index',
);
$this->Controller->helpers = array('Javascript', 'Html');
$this->Controller->components = array('DebugKit.Toolbar');
$this->Controller->layout = 'default';
$this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render();
$result = str_replace(array("\n", "\r"), '', $result);
$this->assertPattern('#<script\s*type="text/javascript"\s*src="/debug_kit/js/js_debug_toolbar.js"\s*>\s?</script>#', $result);
}
/**
* test Injection of user defined javascript
*
* @return void
**/
function testCustomJavascriptInjection() {
$this->Controller->viewPath = 'posts';
$this->Controller->uses = null;
$this->Controller->action = 'index';
$this->Controller->params = array(
'action' => 'index',
'controller' => 'posts',
'plugin' => null,
'url' => array('url' => 'posts/index'),
'base' => '/',
'here' => '/posts/index',
);
$this->Controller->helpers = array('Javascript', 'Html');
$this->Controller->components = array('DebugKit.Toolbar' => array('javascript' => array('my_custom')));
$this->Controller->layout = 'default';
$this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render();
$result = str_replace(array("\n", "\r"), '', $result);
$this->assertPattern('#<script\s*type="text/javascript"\s*src="js/my_custom_debug_toolbar.js"\s*>\s?</script>#', $result);
}
/**
* test message creation
*
* @return void
*/
function testMessage() {
$result = $this->Toolbar->message('test', 'one, two');
$expected = array(
'<p',
'<strong', 'test', '/strong',
' one, two',
'/p',
);
$this->assertTags($result, $expected);
}
/**
* Test Table generation
*
* @return void
*/
function testTable() {
$rows = array(
array(1,2),
array(3,4),
);
$result = $this->Toolbar->table($rows);
$expected = array(
'table' => array('class' =>'debug-table'),
array('tr' => array('class' => 'odd')),
'<td', '1', '/td',
'<td', '2', '/td',
'/tr',
array('tr' => array('class' => 'even')),
'<td', '3', '/td',
'<td', '4', '/td',
'/tr',
'/table'
);
$this->assertTags($result, $expected);
}
/**
* reset the view paths
*
* @return void
**/
function endCase() {
Configure::write('viewPaths', $this->_viewPaths);
}
/**
* tearDown
*
* @access public
* @return void
*/
function tearDown() {
unset($this->Toolbar, $this->Controller);
ClassRegistry::removeObject('view');
ClassRegistry::flush();
}
}
?>

View File

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

View File

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

View File

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

View File

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

View File

@@ -17,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

@@ -0,0 +1,176 @@
<?php /* -*- mode:PHP -*- */ ?>
<div class="customer merge">
<?php
; // Editor alignment
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Javascript
*/
// Warnings _really_ screw up javascript
$saved_debug_state = Configure::read('debug');
Configure::write('debug', '0');
?>
<script type="text/javascript"><!--
// pre-submit callback
function verifyRequest() {
if (!$("#src-customer-id").val()) {
alert("Must select source customer");
return false;
}
rows = $('#<?php echo "contacts-jqGrid"; ?>').getGridParam('selarrrow');
$('#<?php echo "contact-ids"; ?>').val(serialize(rows));
// return false to prevent the form from being submitted;
// anything other than false will allow submission.
return true;
}
function updateContacts() {
$('#contacts-jqGrid').clearGridData();
var filter = new Array();
filter['ContactsCustomer.customer_id'] = $("#src-customer-id").val();
var dynamic_post = new Array();
dynamic_post['filter'] = filter;
$('#contacts-jqGrid').setPostDataItem('dynamic_post_replace', serialize(dynamic_post));
$('#contacts-jqGrid')
.setGridParam({ page: 1 })
.trigger("reloadGrid");
}
function onRowSelect(grid_id, customer_id) {
//$('#output-debug').append("select: "+grid_id+"; "+customer_id+"<BR>\n");
// Set the item id that will be returned with the form
$("#src-customer-id").val(customer_id);
// Get the item name from the grid
$("#src-customer-name").html($(grid_id).getCell(customer_id, "Customer-name"));
updateContacts();
$("#customers-list .HeaderButton").click();
}
function onGridState(grid_id, state) {
//$('#output-debug').append("state: "+grid_id+"; "+state+"<BR>\n");
if (state == 'visible') {
$(".customer-selection-invalid").hide();
$(".customer-selection-valid").hide();
}
else {
if ($("#src-customer-id").val() > 0) {
$(".customer-selection-invalid").hide();
$(".customer-selection-valid").show();
} else {
$(".customer-selection-invalid").show();
$(".customer-selection-valid").hide();
}
}
}
--></script>
<?php
; // align
// Re-Enable warnings
Configure::write('debug', $saved_debug_state);
echo $form->create(null, array('id' => 'customer-merge-form',
'onsubmit' => 'return verifyRequest();',
'url' => array('controller' => 'customers',
'action' => 'mergeFinal')))."\n";
echo '<input type="hidden" id="src-customer-id" name="src-id" value="0" />'."\n";
echo '<input type="hidden" id="dst-customer-id" name="dst-id" value="'.$dst_id.'" />'."\n";
echo $this->element('customers', array
('config' => array
('grid_div_id' => 'customers-list',
'grid_div_class' => 'text-below',
'caption' => ('<A HREF="#" ONCLICK="$(\'#customers-list .HeaderButton\').click();'.
' return false;">Select Customer</A>'),
'grid_events' => array('onSelectRow' =>
array('ids' =>
'if (ids != null){onRowSelect("#"+$(this).attr("id"), ids);}'),
'onHeaderClick' =>
array('gridstate' =>
'onGridState("#"+$(this).attr("id"), gridstate)'),
),
'filter' => array('Customer.id !=' => $dst_id),
//'nolinks' => true,
'limit' => 10,
)));
echo ('<DIV CLASS="customer-merge grid-selection-text">' .
'<DIV CLASS="customer-selection-valid" style="display:none">' .
'Destination Customer: <SPAN id="src-customer-name"></SPAN>' .
'</DIV>' .
'<DIV CLASS="customer-selection-invalid" style="display:none">' .
'Please select customer to merge into' .
'</DIV>' .
'</DIV>' . "\n");
echo $this->element('contacts', array
(// Grid configuration
'config' => array
(
'grid_div_id' => 'contacts',
'grid_setup' => array('multiselect' => true),
'caption' => 'Source contacts to keep',
'filter' => array('ContactsCustomer.customer_id' => 0),
'include' => array('Relationship', 'License', 'Comment'),
),
));
// Add a hidden item to hold the jqGrid selection,
// which we'll populate prior to form submission.
echo "\n";
echo '<input type="hidden" id="contact-ids" name="contact-ids" value="" />'."\n";
?>
<H3>WARNING!</H3>
The above selected customer is about to be deleted, and all related data (leases, transactions, etc) will be merged into customer #<?php echo $dst_id ?>: <?php echo $dst_name ?>. This process is NOT reversible, so please ensure the selections are correct before proceeding.<BR>
<?php
echo $form->end('Merge Customers') . "\n";
?>
<div id="output-debug" style="display:none"></div>
<?php
// Warnings _really_ screw up javascript
Configure::write('debug', '0');
?>
<script type="text/javascript"><!--
$(document).ready(function(){
$("#src-customer-id").val(0);
$("#src-customer-name").html("INTERNAL ERROR");
//onGridState(null, 'visible');
<?php if ($this->params['dev']): ?>
$('#output-debug').show();
<?php endif; ?>
});
--></script>
</div>

View File

@@ -28,17 +28,61 @@ Configure::write('debug', '0');
// other available options:
//clearForm: true, // clear all form fields after successful submit
//resetForm: true, // reset the form after successful submit
url: "<?php echo $html->url(array('controller' => 'transactions',
'action' => 'postReceipt', 0)); ?>"
};
// bind form using 'ajaxForm'
$('#receipt-form').ajaxForm(options);
if ($('#receipt-form').ajaxForm != null)
$('#receipt-form').ajaxForm(options);
else
$('#repeat, label[for=repeat]').remove();
});
// pre-submit callback
function verifyRequest(formData, jqForm, options) {
function verifyRequest(formData, jqForm, options) {
//$("#debug").html('');
for (var i = 0; i < formData.length; ++i) {
//$("#debug").append(i + ') ' + dump(formData[i]) + '<BR>');
if (formData[i]['name'] == "data[Customer][id]" &&
!(formData[i]['value'] > 0)) {
//$("#debug").append('<P>Missing Customer ID');
alert("Please select a customer first.");
return false;
}
if (formData[i]['name'] == "data[Transaction][stamp]" &&
formData[i]['value'] == '') {
//$("#debug").append('<P>Bad Stamp');
if (formData[i]['value'] != '')
alert(formData[i]['value'] + " is not valid date stamp. Please correct it.");
else
alert("Please enter a valid date stamp first.");
return false;
}
// Terrible way to accomplish this...
for (var j = 0; j < 20; ++j) {
if (formData[i]['name'] == "data[Entry]["+j+"][amount]") {
var val = formData[i]['value'].replace(/\$/,'');
//$("#debug").append('<P>Bad Amount');
if (!(val > 0)) {
if (formData[i]['value'] == '')
alert("Please enter an amount first.");
else
alert('"'+formData[i]['value']+'"' + " is not valid amount. Please correct it.");
return false;
}
}
}
}
//$("#debug").append('OK');
//return false;
$('#results').html('Working <BLINK>...</BLINK>');
// here we could return false to prevent the form from being submitted;
// returning anything other than false will allow the form submit to continue
return true;
}
@@ -86,11 +130,11 @@ function updateCharges(id) {
$("#receipt-balance").html("Calculating...");
$("#receipt-charges-caption").html("Please Wait...");
var custom = new Array();
custom['customer_id'] = id;
var filter = new Array();
filter['StatementEntry.customer_id'] = id;
var dynamic_post = new Array();
dynamic_post['custom'] = custom;
dynamic_post['filter'] = filter;
$('#charge-entries-jqGrid').setPostDataItem('dynamic_post_replace', serialize(dynamic_post));
$('#charge-entries-jqGrid')
@@ -111,21 +155,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
@@ -265,6 +296,7 @@ echo $this->element('customers', array
array('gridstate' =>
'onGridState("#"+$(this).attr("id"), gridstate)'),
),
'action' => 'current',
'nolinks' => true,
'limit' => 10,
)));
@@ -272,8 +304,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>' . */
@@ -302,7 +333,7 @@ echo $this->element('statement_entries', array
'action' => 'unreconciled',
'exclude' => array('Customer', 'Type', 'Debit', 'Credit'),
'include' => array('Applied', 'Balance'),
'remap' => array('Applied' => 'Paid'),
'remap' => array('Received' => 'Paid'),
'limit' => 8,
),
));
@@ -376,29 +407,15 @@ Configure::write('debug', '0');
<script type="text/javascript"><!--
$(document).ready(function(){
$("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker('TransactionStamp');
$("#receipt-customer-id").html("INTERNAL ERROR");
$("#customer-id").val(0);
$("#receipt-customer-name").html("INTERNAL ERROR");
$("#receipt-balance").html("INTERNAL ERROR");
$("#receipt-charges-caption").html("Outstanding Charges");
<?php if (isset($customer['id'])): ?>
$("#customer-id").val(<?php echo $customer['id']; ?>);
//$("#receipt-customer-id").html("<?php echo '#'.$customer['id']; ?>");
$("#receipt-customer-id").html('<A HREF="' +
"<?php echo $html->url(array('controller' => 'customers',
'action' => 'view')); ?>"
+ "/" +
"<?php echo $customer['id']; ?>" +
'">#' +
"<?php echo $customer['id']; ?>" +
'</A>');
$("#receipt-customer-name").html("<?php echo $customer['name']; ?>");
$("#receipt-balance").html(fmtCurrency("<?php echo $stats['balance']; ?>"));
onGridState(null, 'hidden');

View File

@@ -53,15 +53,55 @@ echo '<div CLASS="detail supporting">' . "\n";
/**********************************************************************
* Contacts
* Unpaid Charges
*/
echo $this->element('contacts', array
echo $this->element('statement_entries', array
(// Grid configuration
'config' => array
('caption' => 'Customer Contacts',
'filter' => array('Customer.id' => $customer['Customer']['id']),
'include' => array('Type', 'Active'),
('caption' => 'Outstanding Charges',
'limit' => 10,
'action' => 'unreconciled',
'filter' => array('StatementEntry.customer_id' => $customer['Customer']['id']),
'exclude' => array('Customer'),
)));
/**********************************************************************
* Customer Credits
*/
echo $this->element('statement_entries', array
(// Grid configuration
'config' => array
('caption' => 'Oustanding Credits',
'grid_div_id' => 'surplus',
'limit' => 10,
'filter' => array('Customer.id' => $customer['Customer']['id'],
'StatementEntry.type' => 'SURPLUS'),
'exclude' => array('Entry', 'Effective', 'Customer', 'Unit', 'Account', 'Debit', 'Credit'),
'include' => array('Transaction', 'Amount'),
'remap' => array('Transaction' => 'Receipt'),
)));
/**********************************************************************
* Receipt History
*/
echo $this->element('ledger_entries', array
(// Grid configuration
'config' => array
('caption' => 'Receipts',
'limit' => 5,
'filter' => array('Customer.id' => $customer['Customer']['id'],
'Transaction.type' => 'RECEIPT',
'Tender.id !=' => null,
//'Account.id !=' => '-AR-'
),
'include' => array('Transaction'),
'exclude' => array('Entry', 'Account', 'Cr/Dr'),
'remap' => array('Transaction' => 'Receipt'),
)));
@@ -73,8 +113,25 @@ echo $this->element('leases', array
(// Grid configuration
'config' => array
('caption' => 'Lease History',
'filter' => array('Customer.id' => $customer['Customer']['id']),
'limit' => 5,
'filter' => array('Customer.id' => $customer['Customer']['id']),
'exclude' => array('Customer'),
'sort_column' => 'Move-In',
'sort_order' => 'DESC',
)));
/**********************************************************************
* Contacts
*/
echo $this->element('contacts', array
(// Grid configuration
'config' => array
('caption' => 'Customer Contacts',
'limit' => 5,
'filter' => array('Customer.id' => $customer['Customer']['id']),
'include' => array('Relationship'),
)));
@@ -88,28 +145,8 @@ echo $this->element('statement_entries', array
('caption' => 'Customer Statement',
'filter' => array('Customer.id' => $customer['Customer']['id'],
'type !=' => 'VOID'),
//'include' => array('Sub-Total'),
'exclude' => array('Customer'),
'sort_column' => 'Effective',
'sort_order' => 'DESC',
)));
/**********************************************************************
* Receipt History
*/
echo $this->element('ledger_entries', array
(// Grid configuration
'config' => array
('caption' => 'Receipts',
'filter' => array('Customer.id' => $customer['Customer']['id'],
'Transaction.type' => 'RECEIPT',
'Tender.id !=' => null,
//'Account.id !=' => '-AR-'
),
'exclude' => array('Account', 'Cr/Dr'),
'sort_column' => 'Date',
'sort_order' => 'DESC',
)));

View File

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

View File

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

View File

@@ -2,19 +2,19 @@
// Define the table columns
$cols = array();
$cols['ID'] = array('index' => 'Contact.id', 'formatter' => 'id');
$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' => 'name');
$cols['First Name'] = array('index' => 'Contact.first_name', 'formatter' => 'name');
$cols['License'] = array('index' => 'Contact.id_local', 'formatter' => 'name');
$cols['Company'] = array('index' => 'Contact.company_name', 'formatter' => 'longname');
$cols['Comment'] = array('index' => 'Contact.comment', 'formatter' => 'comment');
// Render the grid
$grid
->columns($cols)
->sortField('Last Name')
->defaultFields(array('ID', 'Last Name', 'First Name'))
->defaultFields(array('Last Name', 'First Name'))
->searchFields(array('Last Name', 'First Name', 'Company'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Type', 'Active', 'Comment')));
array_diff(array_keys($cols), array('Relationship', 'License', 'Comment')));

View File

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

View File

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

View File

@@ -32,8 +32,8 @@ foreach ($fields AS $field => $config) {
$include_after = true;
}
$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

@@ -19,6 +19,7 @@ if (!isset($limitOptions)) {
}
sort($limitOptions, SORT_NUMERIC);
$limitOptions = array_unique($limitOptions, SORT_NUMERIC);
//$limitOptions[] = 'ALL'; // Would be nice... jqGrid shows 'NaN of NaN'
if (!isset($height))
$height = 'auto';
@@ -46,12 +47,9 @@ if (!isset($grid_setup))
$grid_setup = array();
// Do some prework to bring in the appropriate libraries
$imgpath = '/pmgr/site/css/jqGrid/basic/images';
$html->css('jqGrid/basic/grid', null, null, false);
$html->css('jqGrid/jqModal', null, null, false);
$javascript->link('jqGrid/jquery.jqGrid.js', false);
$javascript->link('jqGrid/js/jqModal', false);
$javascript->link('jqGrid/js/jqDnR', false);
$html->css('ui.jqgrid', null, null, false);
$javascript->link('jqGrid/grid.locale-en', false);
$javascript->link('jqGrid/jquery.jqGrid.min', false);
$javascript->link('pmgr_jqGrid', false);
@@ -123,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');
@@ -145,8 +148,14 @@ foreach ($jqGridColumns AS $header => &$col) {
// No special formatting for name
unset($col['formatter']);
}
elseif ($col['formatter'] === 'enum') {
elseif (preg_match("/^(long|short)?enum$/",
$col['formatter'], $matches)) {
$default['width'] = 60;
if (!empty($matches[1]) && $matches[1] === 'long')
$default['width'] *= 1.5;
if (!empty($matches[1]) && $matches[1] === 'short')
$default['width'] *= 0.7;
//$default['align'] = 'right';
// No special formatting for enum
@@ -163,7 +172,8 @@ foreach ($jqGridColumns AS $header => &$col) {
// Just a rough approximation to ensure columns
// are wide enough to fully display their header.
$min_width = strlen($header) * 10;
$min_width = strlen($header) * 7;
$min_width = 0; // REVISIT <AP>: 20090829; if/while jqGrid is fixed width
if ((!isset($default['width']) || $default['width'] < $min_width) && !$default['force'])
$default['width'] = $min_width;
}
@@ -187,9 +197,12 @@ if (isset($sort_order)) {
$sortorder = 'ASC';
}
if (1) { // debug
$debug = !empty($this->params['dev']);
if ($debug)
$caption .= '<span class="debug grid-query"> :: <span id="'.$grid_id.'-query"></span></span>';
}
$caption .= ('<span class="grid-error" id="'.$grid_id.'-error"' .
' style="display:none"> :: Error (Please Reload)</span>');
foreach (array_merge(array('loadComplete' => '', 'loadError' => ''),
$grid_events) AS $event => $statement) {
@@ -199,14 +212,22 @@ foreach (array_merge(array('loadComplete' => '', 'loadError' => ''),
$statement = current($statement);
}
if ($event == 'loadComplete') {
if ($event == 'loadComplete' && $debug) {
$grid_events[$event] =
array('--special' => "function($params) {url=jQuery('#{$grid_id}').getGridParam('url');url=url+'/debug:1?'; pd=jQuery('#{$grid_id}').getPostData();$.each(pd,function(i){ url+=i+'='+escape(pd[i])+'&'; }); jQuery('#{$grid_id}-query').html('<A HREF=\"'+url+'\">Grid Query</A><BR>'); $statement;}");
}
elseif ($event == 'loadError') {
elseif ($event == 'loadError' && $debug) {
$grid_events[$event] =
array('--special' => "function($params) {url=jQuery('#{$grid_id}').getGridParam('url');url=url+'/debug:1?'; pd=jQuery('#{$grid_id}').getPostData();$.each(pd,function(i){ url+=i+'='+escape(pd[i])+'&'; }); jQuery('#{$grid_id}-query').html('<A HREF=\"'+url+'\">Grid Error Query</A><BR>'); $statement;}");
}
elseif ($event == 'loadComplete' && !$debug) {
$grid_events[$event] =
array('--special' => "function($params) {jQuery('#{$grid_id}-error').hide(); $statement;}");
}
elseif ($event == 'loadError' && !$debug) {
$grid_events[$event] =
array('--special' => "function($params) {jQuery('#{$grid_id}-error').show(); $statement;}");
}
else {
$grid_events[$event] =
array('--special' => "function($params) { $statement; }");
@@ -225,13 +246,14 @@ $jqGrid_setup = array_merge
'colNames' => array_keys($jqGridColumns),
'colModel' => array('--special' => $jqGridColumns),
'height' => $height,
'width' => 700,
'rowNum' => $limit,
'rowList' => $limitOptions,
'sortname' => $sortname,
'sortorder' => $sortorder,
'caption' => $caption,
'imgpath' => $imgpath,
'viewrecords' => true,
'gridview' => true,
'pager' => $grid_id.'-pager',
),
$grid_events,
@@ -244,67 +266,46 @@ $jqGrid_setup = array_merge
// to kick this thing off.
?>
<?php if ($first_grid): ?>
<script type="text/javascript"><!--
var currencyFormatter = function(cellval, opts, rowObject) {
if (!cellval)
return "";
return fmtCurrency(cellval);
}
var percentageFormatter = function(cellval, opts, rowObject) {
var precision;
if (typeof(opts.colModel) != 'undefined' &&
typeof(opts.colModel.formatoptions) != 'undefined' &&
typeof(opts.colModel.formatoptions.precision) != 'undefined')
precision = opts.colModel.formatoptions.precision;
else
precision = 0;
amount = cellval.toString().replace(/\%/g,'');
amount = (amount*100).toFixed(precision);
return amount+'%';
}
var idFormatter = function(cellval, opts, rowObject) {
if (!cellval)
return cellval;
return '#'+cellval;
}
--></script>
<?php endif; ?>
<DIV ID="<?php echo $grid_div_id; ?>" CLASS="<?php echo $grid_div_class; ?>">
<table id="<?php echo $grid_id; ?>" class="scroll"></table>
<div id="<?php echo $grid_id; ?>-pager" class="scroll" style="text-align:right"></div>
<script type="text/javascript"><!--
jQuery(document).ready(function(){
currencyFormatter = function(el, cellval, opts) {
if (!cellval)
return;
$(el).html(fmtCurrency(cellval));
}
idFormatter = function(el, cellval, opts) {
if (!cellval)
return;
$(el).html('#'+cellval);
}
jQuery('#<?php echo $grid_id; ?>').jqGrid(
<?php echo FormatHelper::phpVarToJavascript($jqGrid_setup); ?>
).navGrid('#<?php echo $grid_id; ?>-pager',
{ view:false,
edit:false,
add:false,
del:false,
search:true,
refresh:true});
<?php
/* jQuery('#t_<?php echo $grid_id; ?>').height(25).hide() */
/* .filterGrid('#<?php echo $grid_id; ?>', { */
/* gridModel:true, */
/* gridToolbar:true, */
/* autosearch:true, */
/* }); */
/* jQuery('#<?php echo $grid_id; ?>').navGrid('#<?php echo $grid_id; ?>-pager', */
/* { view:false, */
/* edit:false, */
/* add:false, */
/* del:false, */
/* search:false, */
/* refresh:false}) */
/* .navButtonAdd('#<?php echo $grid_id; ?>-pager',{ */
/* caption:"Search", */
/* title:"Toggle Search", */
/* buttonimg:'<?php echo $imgpath; ?>' + '/find.gif', */
/* onClickButton:function(){ */
/* if(jQuery('#t_<?php echo $grid_id; ?>').css("display")=="none") { */
/* jQuery('#t_<?php echo $grid_id; ?>').css("display",""); */
/* } else { */
/* jQuery('#t_<?php echo $grid_id; ?>').css("display","none"); */
/* } */
/* } */
/* }); */
?>
<?php echo FormatHelper::phpVarToJavascript($jqGrid_setup) . "\n"; ?>
).navGrid('#<?php echo $grid_id; ?>-pager', { view:false,edit:false,add:false,del:false,search:true,refresh:true});
});
--></script>
<?php
if (count($search_fields) > 0) {
echo('<div>Search By:<BR>' . "\n");

View File

@@ -2,24 +2,25 @@
// Define the table columns
$cols = array();
$cols['LeaseID'] = array('index' => 'Lease.id', 'hidden' => true);
$cols['Lease'] = array('index' => 'Lease.number', 'formatter' => 'id');
$cols['Unit'] = array('index' => 'Unit.name', 'width' => '50', 'align' => 'center');
$cols['Unit'] = array('index' => 'Unit.name', 'formatter' => 'shortname', 'align' => 'center');
$cols['Customer id'] = array('index' => 'Customer.id', 'hidden' => true);
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Rent'] = array('index' => 'Lease.rent', 'formatter' => 'currency', 'hiddenz' => true);
$cols['Deposit'] = array('index' => 'Lease.deposit', 'formatter' => 'currency', 'hiddenz' => true);
$cols['Rent'] = array('index' => 'Lease.rent', 'formatter' => 'currency');
$cols['Deposit'] = array('index' => 'Lease.deposit', 'formatter' => 'currency');
$cols['Signed'] = array('index' => 'Lease.lease_date', 'formatter' => 'date');
$cols['Move-In'] = array('index' => 'Lease.movein_date', 'formatter' => 'date');
$cols['Move-Out'] = array('index' => 'Lease.moveout_date', 'formatter' => 'date');
$cols['Closed'] = array('index' => 'Lease.close_date', 'formatter' => 'date');
$cols['Charge-Thru'] = array('index' => 'Lease.charge_through_date', 'formatter' => 'date');
$cols['Paid-Thru'] = array('index' => 'Lease.paid_through_date', 'formatter' => 'date');
$cols['Status'] = array('index' => 'status', 'formatter' => 'enum', 'width' => 100);
$cols['Status'] = array('index' => 'status', 'formatter' => 'longenum');
$cols['Balance'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Comment'] = array('index' => 'Lease.comment', 'formatter' => 'comment');
if (!empty($this->params['action'])) {
if ($this->params['action'] === 'closed')
$grid->invalidFields(array('Paid-Thru', 'Status'));
$grid->invalidFields(array('Charge-Thru', 'Paid-Thru', 'Status'));
elseif ($this->params['action'] === 'active')
$grid->invalidFields(array('Closed'));
elseif ($this->params['action'] === 'delinquent')
@@ -29,8 +30,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')));
array_diff(array_keys($cols), array('Signed', 'Charge-Thru', 'Status', 'Comment')));

View File

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

View File

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

View File

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

View File

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

View File

@@ -9,20 +9,19 @@ $cols['Date'] = array('index' => 'Transaction.stamp', 'formatter' =>
$cols['Effective'] = array('index' => 'StatementEntry.effective_date', 'formatter' => 'date');
$cols['Through'] = array('index' => 'StatementEntry.through_date', 'formatter' => 'date');
$cols['Account'] = array('index' => 'Account.name', 'formatter' => 'name');
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Lease'] = array('index' => 'Lease.number', 'formatter' => 'id');
$cols['Unit'] = array('index' => 'Unit.name', 'formatter' => 'shortname');
$cols['Comment'] = array('index' => 'StatementEntry.comment', 'formatter' => 'comment', 'width'=>150);
$cols['Type'] = array('index' => 'StatementEntry.type', 'formatter' => 'enum', 'width'=>120);
$cols['Type'] = array('index' => 'StatementEntry.type', 'formatter' => 'longenum');
$cols['Account'] = array('index' => 'Account.name', 'formatter' => 'name');
$cols['Debit'] = array('index' => 'charge', 'formatter' => 'currency');
$cols['Credit'] = array('index' => 'disbursement', 'formatter' => 'currency');
$cols['Amount'] = array('index' => "StatementEntry.amount", 'formatter' => 'currency');
$cols['Applied'] = array('index' => "applied", 'formatter' => 'currency');
$cols['Received'] = array('index' => "applied", 'formatter' => 'currency');
// 'balance' is already in use as part of charge/disbursement/balance.
// 'unapplied' isn't quite the right term, but it's not customer visible.
$cols['Balance'] = array('index' => "unapplied", 'formatter' => 'currency');
@@ -33,17 +32,30 @@ if (isset($subtotal_column))
$cols['Sub-Total']['index'] =
'subtotal-' . $cols[$subtotal_column]['index'];
if ((isset($action) && $action == 'unreconciled') ||
(isset($config) && isset($config['action']) && $config['action'] == 'unreconciled')) {
if (isset($config) && !isset($config['grid_div_id']))
$config['grid_div_id'] = 'unpaid';
$include_columns = array('Entry', 'Date',
'Effective', 'Customer', 'Unit',
'Account', 'Amount', 'Received', 'Balance');
}
else {
$include_columns =
array_diff(array_keys($cols),
array('Transaction', 'Through', 'Lease',
'Amount', 'Received', 'Balance', 'Sub-Total',
'Comment'));
}
// Include custom data
$grid->customData(compact('statement_entry_id'));
// Render the grid
$grid
->columns($cols)
->sortField('Date')
->sortField('Date', 'DESC')
->defaultFields(array('Entry', 'Date', 'Charge', 'Payment'))
->searchFields(array('Customer', 'Unit'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Through', 'Lease',
'Amount', 'Applied', 'Balance', 'Sub-Total',
'Comment')));
->render($this, isset($config) ? $config : null, $include_columns);

View File

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

View File

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

View File

@@ -1,20 +1,25 @@
<?php /* -*- mode:PHP -*- */
if (isset($include))
$include = is_array($include) ? $include : array($include);
else
$include = array();
// Define the table columns
$cols = array();
$cols['ID'] = array('index' => 'Transaction.id', 'formatter' => 'id');
$cols['Type'] = array('index' => 'Transaction.type', 'formatter' => 'enum');
//$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Timestamp'] = array('index' => 'Transaction.stamp', 'formatter' => 'date');
$cols['Amount'] = array('index' => 'Transaction.amount', 'formatter' => 'currency');
$cols['entries'] = array('index' => 'entries', 'formatter' => 'number');
$cols['Entries'] = array('index' => 'entries', 'formatter' => 'number');
$cols['Comment'] = array('index' => 'Transaction.comment', 'formatter' => 'comment');
// 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,
array_diff(array_keys($cols), array('Comment')));
array_merge($include, array_diff(array_keys($cols), array('Customer', 'Comment'))));

View File

@@ -0,0 +1,40 @@
<?php /* -*- mode:PHP -*- */
// Define the table columns
$cols = array();
$cols['Size'] = array('index' => 'UnitSize.name', 'formatter' => 'shortname');
$cols['Type'] = array('index' => 'UnitType.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['Per Foot'] = array('index' => 'sqcost', 'formatter' => 'currency');
$cols['Per Cubic Ft'] = 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('Width', 'Depth',
'Deposit',
'Height', 'Volume',
//'Per Foot',
'Per Cubic Ft',
'Occupied',
//'Total',
'Occupancy',
//'Vacancy',
'Comment')));

View File

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

View File

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

View File

@@ -47,6 +47,13 @@ class FormatHelper extends AppHelper {
return $currency;
}
function percent($amount, $precision = 2) {
if (!isset($amount))
return '-';
return self::$number->toPercentage($amount*100, $precision);
}
function date($date, $age = false, $class = null, $time = false) {
if (!$date) return null;
@@ -61,7 +68,7 @@ class FormatHelper extends AppHelper {
$date_html = '<span class="fmt-date '.$class.'">'.$date_html.'</span>';
if ($age) {
$date_html .= ' (' . self::age($date, $class, $time ? 0 : 60*60*24) . ')';
$date_html .= ' (' . self::age($date, $class, true, $time ? 0 : 60*60*24) . ')';
$date_html = '<span class="fmt-dateage '.$class.'">'.$date_html.'</span>';
}
@@ -100,7 +107,7 @@ class FormatHelper extends AppHelper {
return $comment;
}
function age($datetime, $class, $min_span = 0) {
function age($datetime, $class, $suffix = false, $min_span = 0) {
if (!isset($datetime))
return null;
@@ -207,9 +214,12 @@ class FormatHelper extends AppHelper {
$age .= ' ' . self::_n($approx, $unit);
if ($backwards)
$age .= ' ago';
if ($suffix) {
if ($backwards)
$age .= ' from now';
else
$age .= ' ago';
}
}
$age = '<span class="fmt-age '.$class.'">'.__($age, true).'</span>';
@@ -265,14 +275,21 @@ class FormatHelper extends AppHelper {
// Helper function to convert PHP vars to javascript
function phpVarToJavascript($var, $name = '', $depth='', $special = false) {
function phpVarToJavascript($var, $name = '', $depth='', $special = false, $pretty = false) {
// Establish a prefix to use before printing $var
$prefix = $depth;
if ($pretty) {
$prefix = $depth;
$pretty_sp = " ";
$pretty_nl = "\n";
}
else {
$prefix = $pretty_sp = $pretty_nl = '';
}
// If given a name, set it up JS style
if ($name)
$prefix .= $name . ": ";
$prefix .= $name . ":" . $pretty_sp;
if (!isset($var))
return $prefix . 'null';
@@ -325,22 +342,22 @@ class FormatHelper extends AppHelper {
// PHP array indices can be a mix of integer and string based.
// Just guess here, unless flagged as a special case.
if (isset($var[0]) || $special)
return ($prefix . "[\n"
. implode(",\n",
return ($prefix . "[" . $pretty_nl
. implode("," . $pretty_nl,
array_map(array('FormatHelper', 'phpVarToJavascript'),
array_values($var),
array(),
array_fill(0, count($var), $depth.' ')
))
. "\n$depth]");
. ($pretty ? "\n$depth" : '') . "]");
return ($prefix . "{\n"
. implode(",\n",
return ($prefix . "{" . $pretty_nl
. implode("," . $pretty_nl,
array_map(array('FormatHelper', 'phpVarToJavascript'),
array_values($var), array_keys($var),
array_fill(0, count($var), $depth.' ')
))
. "\n$depth}");
. ($pretty ? "\n$depth" : '') . "}");
}
}

View File

@@ -6,6 +6,7 @@ class GridHelper extends AppHelper {
var $included, $invalid;
var $columns;
var $controller;
static $first_grid = true;
function __construct() {
$this->reset();
@@ -214,12 +215,22 @@ class GridHelper extends AppHelper {
}
$this->jqGrid_options['controller'] = $controller;
// Add in any custom variables requested
if (isset($config['custom'])) {
$this->customData($config['custom']);
unset($config['custom']);
}
// Incorporate all other user options
if (isset($config))
$this->jqGrid_options = array_merge($this->jqGrid_options, $config);
// Set flag whether or not this is the first grid
$this->jqGrid_options['first_grid'] = self::$first_grid;
//pr(compact('config') + array('jqGrid_options' => $this->jqGrid_options));
echo $view->element('jqGrid', $this->jqGrid_options);
self::$first_grid = false;
// Since we only have one instance of this class
// as a helper, we must assume it could be used

View File

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

View File

@@ -10,6 +10,7 @@ $customer = $lease['Customer'];
if (isset($lease['Lease']))
$lease = $lease['Lease'];
//pr(compact('unit', 'customer', 'lease', 'movein'));
/**********************************************************************
**********************************************************************
@@ -25,27 +26,72 @@ Configure::write('debug', '0');
<script type="text/javascript"><!--
var lease_charge_through;
// prepare the form when the DOM is ready
$(document).ready(function() {
var options = {
var options = {
target: '#output-debug', // target element(s) to be updated with server response
beforeSubmit: verifyRequest, // pre-submit callback
success: showResponse, // post-submit callback
// other available options:
//clearForm: true, // clear all form fields after successful submit
//resetForm: true, // reset the form after successful submit
};
// bind form using 'ajaxForm'
url: "<?php echo $html->url(array('controller' => 'transactions',
'action' => 'postInvoice', 0)); ?>"
};
// bind form using 'ajaxForm'
if ($('#invoice-form').ajaxForm != null)
$('#invoice-form').ajaxForm(options);
});
else
$('#repeat, label[for=repeat]').remove();
});
// pre-submit callback
function verifyRequest(formData, jqForm, options) {
//$("#debug").html('');
for (var i = 0; i < formData.length; ++i) {
//$("#debug").append(i + ') ' + dump(formData[i]) + '<BR>');
if (formData[i]['name'] == "data[Lease][id]" &&
!(formData[i]['value'] > 0)) {
//$("#debug").append('<P>Missing Lease ID');
alert("Must select a lease first");
return false;
}
if (formData[i]['name'] == "data[Transaction][stamp]" &&
formData[i]['value'] == '') {
//$("#debug").append('<P>Bad Stamp');
if (formData[i]['value'] != '')
alert(formData[i]['value'] + " is not valid date stamp. Please correct it.");
else
alert("Please enter a valid date stamp first.");
return false;
}
// Terrible way to accomplish this...
for (var j = 0; j < 20; ++j) {
if (formData[i]['name'] == "data[Entry]["+j+"][amount]") {
var val = formData[i]['value'].replace(/\$/,'');
//$("#debug").append('<P>Bad Amount');
if (!(val > 0)) {
if (formData[i]['value'] == '')
alert("Please enter an amount for Charge #"+j+", or remove the Charge completely.");
else
alert('"'+formData[i]['value']+'"' + " is not a valid amount for Charge #"+j+". Please correct it.");
return false;
}
}
}
}
//$("#debug").append('OK');
//return false;
$('#results').html('Working <BLINK>...</BLINK>');
// here we could return false to prevent the form from being submitted;
// returning anything other than false will allow the form submit to continue
return true;
}
@@ -65,13 +111,13 @@ function showResponse(responseText, statusText) {
if (!$("#repeat").attr("checked")) {
window.location.href =
<?php if (empty($movein)): ?>
"<?php echo $html->url(array('controller' => 'leases',
"<?php echo $html->url(array('controller' => 'customers',
'action' => 'view')); ?>"
+ "/" + $("#lease-id").val();
+ "/" + $("#customer-id").val();
<?php else: ?>
"<?php echo $html->url(array('controller' => 'customers',
'action' => 'receipt')); ?>"
+ "/" + $("#lease-id").val();
+ "/" + $("#customer-id").val();
<?php endif; ?>
return;
}
@@ -98,21 +144,9 @@ function resetForm(nocharge) {
function onRowSelect(grid_id, lease_id) {
// Set the item id that will be returned with the form
$("#lease-id").val(lease_id);
$("#customer-id").val($(grid_id).getCell(lease_id, 'Customer-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'));
@@ -120,6 +154,7 @@ function onRowSelect(grid_id, lease_id) {
$("#invoice-deposit").html($(grid_id).getCell(lease_id, 'Lease-deposit')
? $(grid_id).getCell(lease_id, 'Lease-deposit')
: '-');
lease_charge_through = $(grid_id).getCell(lease_id, 'Lease-charge_through_date')
// Hide the "no lease" message and show the current lease
$(".lease-selection-invalid").hide();
@@ -145,6 +180,78 @@ function onGridState(grid_id, state) {
}
}
function setNextRent(id) {
var chg_thru;
$('.ChargeForm').each( function(i) {
if ($('.ChargeFormThroughDate', this).attr('id') == 'Entry'+id+'ThroughDate')
return;
if ($('.ChargeFormAccount option:selected', this).val() == <?php echo $rentAccount ?>
&& $('.ChargeFormThroughDate', this).val()) {
var dt = new Date($('.ChargeFormThroughDate', this).val());
//$('#debug').append('Rent in ' + i + '; date ' + dt + '<BR>');
if (chg_thru == null || dt > chg_thru)
chg_thru = dt;
}
});
if (!chg_thru)
chg_thru = new Date(lease_charge_through);
if (chg_thru < dateEOM(chg_thru)) {
// Add a charge to finish out the month
datepickerSet('Entry'+id+'EffectiveDate', dateTomorrow(chg_thru));
datepickerSet('Entry'+id+'ThroughDate', dateEOM(chg_thru));
} else {
// Add a whole month's charge for next month
datepickerSet('Entry'+id+'EffectiveDate', dateNextBOM(chg_thru));
datepickerSet('Entry'+id+'ThroughDate', dateNextEOM(chg_thru));
}
// Now add in the amount owed based on the calculated
// effective and through dates.
prorate(id);
}
function prorate(id) {
var edt = datepickerGet('Entry'+id+'EffectiveDate');
var tdt = datepickerGet('Entry'+id+'ThroughDate');
var rent = $('#invoice-rent').html().replace(/\$/,'');
// Reset the comment. It might wipe out a user comment,
// but it's probably low risk/concern
$('#Entry'+id+'Comment').val('');
if (edt == null || tdt == null) {
alert('Can only prorate with both effective and through dates');
rent = 0;
}
else if (edt > tdt) {
alert('Effective date is later than the Through date');
rent = 0;
}
else if (tdt.getMonth() == edt.getMonth() + 1 &&
edt.getDate() == tdt.getDate() + 1) {
// appears to be anniversary billing, one full cycle
}
else if (edt.getTime() == dateBOM(edt).getTime() &&
tdt.getTime() == dateEOM(edt).getTime()) {
// appears to be one full month
}
else {
var one_day=1000*60*60*24;
var days = Math.ceil((tdt.getTime()-edt.getTime()+1)/(one_day));
var dim =
((edt.getMonth() == tdt.getMonth())
? dateEOM(edt).getDate() // prorated within the month.
: 30); // prorated across months.
rent *= days / dim;
$('#Entry'+id+'Comment').val('Rent proration: '+days+'/'+dim+' days');
}
$('#Entry'+id+'Amount').val(fmtCurrency(rent));
}
function addChargeSource(flash) {
var id = $("#charge-entry-id").val();
addDiv('charge-entry-id', 'charge', 'charges', flash,
@@ -156,26 +263,32 @@ function addChargeSource(flash) {
echo FormatHelper::phpVarToJavascript
($this->element('form_table',
array('id' => 'Entry%{id}Form',
'class' => "item invoice ledger-entry entry",
'class' => "ChargeForm item invoice ledger-entry entry",
//'with_name_after' => ':',
'field_prefix' => 'Entry.%{id}',
'fields' => array
("account_id" => array('name' => 'Account',
'opts' =>
array('options' => $chargeAccounts,
array('class' => 'ChargeFormAccount',
'options' => $chargeAccounts,
'value' => $defaultAccount,
),
'between' => '<A HREF="#" ONCLICK="setNextRent(\'%{id}\'); return false;">Rent</A>',
),
"effective_date" => array('opts' =>
array('type' => 'text'),
array('class' => 'ChargeFormEffectiveDate',
'type' => 'text'),
'between' => '<A HREF="#" ONCLICK="datepickerBOM(\'TransactionStamp\',\'Entry%{id}EffectiveDate\'); return false;">BOM</A>',
),
"through_date" => array('opts' =>
array('type' => 'text'),
array('class' => 'ChargeFormThroughDate',
'type' => 'text'),
'between' => '<A HREF="#" ONCLICK="datepickerEOM(\'Entry%{id}EffectiveDate\',\'Entry%{id}ThroughDate\'); return false;">EOM</A>',
),
"amount" => array('opts' => array('class' => 'invoice amount')),
"comment" => array('opts' => array('size' => 50)),
"amount" => array('opts' => array('class' => 'ChargeFormAmount invoice amount'),
'between' => '<A HREF="#" ONCLICK="prorate(\'%{id}\'); return false;">Prorate</A>',
),
"comment" => array('opts' => array('class' => 'ChargeFormComment', 'size' => 50)),
),
))) . "+\n";
?>
@@ -183,19 +296,8 @@ function addChargeSource(flash) {
'</FIELDSET>'
);
$("#Entry"+id+"EffectiveDate")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
$("#Entry"+id+"ThroughDate")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
datepicker("Entry"+id+"EffectiveDate");
datepicker("Entry"+id+"ThroughDate");
return id;
}
@@ -222,6 +324,9 @@ if (empty($movein))
array('gridstate' =>
'onGridState("#"+$(this).attr("id"), gridstate)'),
),
'include' => array('Charge-Thru'),
'exclude' => array('Closed', 'Paid-Thru'),
'action' => 'active',
'nolinks' => true,
'limit' => 10,
)));
@@ -258,6 +363,11 @@ echo $form->input("Lease.id",
'type' => 'hidden',
'value' => 0));
echo $form->input("Customer.id",
array('id' => 'customer-id',
'type' => 'hidden',
'value' => 0));
/* echo '<fieldset CLASS="invoice">' . "\n"; */
/* echo ' <legend>Invoice</legend>' . "\n"; */
@@ -311,20 +421,46 @@ Configure::write('debug', '0');
$('tr td:nth-child('+col+'), tr th:nth-child('+col+')', this).remove();
};
$(document).ready(function(){
$("#TransactionStamp")
.attr('autocomplete', 'off')
.datepicker({ constrainInput: true,
numberOfMonths: [1, 1],
showCurrentAtPos: 0,
dateFormat: 'mm/dd/yy' });
function addHidden(id, fld, name) {
$('#Entry'+id+fld).after
('<input type="hidden"' +
' name="data[Entry]['+id+']['+name+']"' +
' value="' + $('#Entry'+id+fld).val() + '">');
}
$(document).ready(function(){
datepicker('TransactionStamp');
<?php if (isset($lease['id'])): ?>
$("#lease-id").val(<?php echo $lease['id']; ?>);
$("#customer-id").val(<?php echo $customer['id']; ?>);
$("#invoice-lease").html("<?php echo '#'.$lease['number']; ?>");
$("#invoice-unit").html("<?php echo $unit['name']; ?>");
$("#invoice-customer").html("<?php echo $customer['name']; ?>");
$("#invoice-rent").html("<?php echo FormatHelper::currency($lease['rent']); ?>");
$("#invoice-late").html("<?php echo FormatHelper::currency($defaultLate); ?>");
$("#invoice-deposit").html("<?php echo FormatHelper::currency($lease['deposit']); ?>");
lease_charge_through = <?php
if ($lease['charge_through_date'])
echo 'new Date("'.date('m/d/Y', strtotime($lease['charge_through_date'])).'")';
elseif ($lease['paid_through_date'])
echo 'new Date("'.date('m/d/Y', strtotime($lease['paid_through_date'])).'")';
else
echo 'dateYesterday("'.date('m/d/Y', strtotime($lease['movein_date'])).'")';
?>;
<?php else: ?>
$("#lease-id").val(0);
$("#customer-id").val(<?php echo empty($movein) ? 0 : $customer['id']; ?>);
$("#invoice-lease").html("INTERNAL ERROR");
$("#invoice-unit").html("INTERNAL ERROR");
$("#invoice-customer").html("INTERNAL ERROR");
$("#invoice-rent").html("INTERNAL ERROR");
$("#invoice-late").html("INTERNAL ERROR");
$("#invoice-deposit").html("INTERNAL ERROR");
<?php endif; ?>
<?php if (empty($movein)): ?>
@@ -336,12 +472,12 @@ Configure::write('debug', '0');
var id;
resetForm(true);
$("#TransactionStamp").datepicker('disable');
$("#TransactionStamp").attr('disabled', true);
$("#TransactionStamp").val("<?php echo date('m/d/Y', $movein['time']); ?>");
$('#TransactionStamp').after
('<input type="hidden"' +
' name="data[Transaction][stamp]"' +
' value="<?php echo date('m/d/Y', $movein['time']); ?>">');
' value="' + $("#TransactionStamp").val() + '">');
$("#TransactionComment").val('Move-In Charges');
<?php if ($movein['deposit'] != 0): ?>
@@ -349,69 +485,28 @@ Configure::write('debug', '0');
$('#Entry'+id+'Form').removeCol(2);
$('#Entry'+id+'Form input, #Entry'+id+'Form select').attr('disabled', true);
$('#Entry'+id+'EffectiveDate').val("<?php echo date('m/d/Y', $movein['effective_time']); ?>");
$('#Entry'+id+'EffectiveDate').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][effective_date]"' +
' value="<?php echo date('m/d/Y', $movein['effective_time']); ?>">');
addHidden(id, 'EffectiveDate', 'effective_date');
$('#Entry'+id+'AccountId').val(<?php echo $securityDepositAccount; ?>);
$('#Entry'+id+'AccountId').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][account_id]"' +
' value="<?php echo $securityDepositAccount; ?>">');
addHidden(id, 'AccountId', 'account_id');
$('#Entry'+id+'Amount').val("<?php echo FormatHelper::currency($movein['deposit']); ?>");
$('#Entry'+id+'Amount').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][amount]"' +
' value="<?php echo FormatHelper::currency($movein['deposit']); ?>">');
//$('#Entry'+id+'Comment').val('Move-In Security Deposit');
addHidden(id, 'Amount', 'amount');
$('#Entry'+id+'Comment').removeAttr('disabled');
<?php endif; ?>
id = addChargeSource(false);
$('#Entry'+id+'Form').removeCol(2);
$('#Entry'+id+'Form input, #Entry'+id+'Form select').attr('disabled', true);
$('#Entry'+id+'EffectiveDate').val("<?php echo date('m/d/Y', $movein['effective_time']); ?>");
$('#Entry'+id+'EffectiveDate').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][effective_date]"' +
' value="<?php echo date('m/d/Y', $movein['effective_time']); ?>">');
$('#Entry'+id+'ThroughDate').val("<?php echo date('m/d/Y', $movein['through_time']); ?>");
$('#Entry'+id+'ThroughDate').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][through_date]"' +
' value="<?php echo date('m/d/Y', $movein['through_time']); ?>">');
$('#Entry'+id+'AccountId').val(<?php echo $rentAccount; ?>);
$('#Entry'+id+'AccountId').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][account_id]"' +
' value="<?php echo $rentAccount; ?>">');
$('#Entry'+id+'Amount').val("<?php echo FormatHelper::currency($movein['prorated_rent']); ?>");
$('#Entry'+id+'Amount').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][amount]"' +
' value="<?php echo FormatHelper::currency($movein['prorated_rent']); ?>">');
$('#Entry'+id+'Comment').val("<?php echo($movein['prorated'] ? 'Move-In Rent (Prorated)' : ''); ?>");
setNextRent(id);
addHidden(id, 'EffectiveDate', 'effective_date');
addHidden(id, 'ThroughDate', 'through_date');
addHidden(id, 'AccountId', 'account_id');
addHidden(id, 'Amount', 'amount');
$('#Entry'+id+'Comment').removeAttr('disabled');
<?php endif; ?>
<?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-unit").html("<?php echo $unit['name']; ?>");
$("#invoice-customer").html("<?php echo $customer['name']; ?>");
$("#invoice-rent").html("<?php echo FormatHelper::currency($lease['rent']); ?>");
$("#invoice-late").html("<?php echo FormatHelper::currency($defaultLate); ?>");
$("#invoice-deposit").html("<?php echo FormatHelper::currency($lease['deposit']); ?>");
onGridState(null, 'hidden');
<?php else: ?>
onGridState(null, 'visible');

View File

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

View File

@@ -0,0 +1,74 @@
<?php /* -*- mode:PHP -*- */
echo '<div class="lease overview">' . "\n";
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Overview Main Section
*/
/*
$rows = array();
$rows[] = array('', FormatHelper::currency($overview['']));
echo $this->element('table',
array('class' => 'item lease detail',
'caption' => '',
'rows' => $rows,
'column_class' => array('field', 'value')));
*/
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Supporting Elements Section
*/
echo '<div CLASS="detail supporting">' . "\n";
$headers = array('', 'Count');
$row_class = array();
$rows = array();
foreach ($overview['months'] AS $month) {
$row_class[] = 'subheader';
$rows[] = array($month['name']);
$odd = 1;
$row_class[] = array('subitem', $odd ? 'oddrow' : 'evenrow');
$rows[] = array('Beginning of Month', $month['start']); $odd = !$odd;
$row_class[] = array('subitem', $odd ? 'oddrow' : 'evenrow');
$rows[] = array('+ Move-Ins', $month['movein']); $odd = !$odd;
$row_class[] = array('subitem', $odd ? 'oddrow' : 'evenrow');
$rows[] = array('- Move-Outs', $month['moveout']); $odd = !$odd;
$row_class[] = 'grand';
$rows[] = array('End of ' . $month['name'], $month['finish']);
}
echo $this->element('table',
array('class' => 'item lease-overview overview list',
'caption' => 'Leased Units By Month',
'headers' => $headers,
'rows' => $rows,
'row_class' => $row_class,
'suppress_alternate_rows' => true
));
?>
<script type="text/javascript"><!--
jQuery(document).ready(function(){
jQuery('table.overview td.subheader').attr('colSpan', 2);
});
--></script>
<?php
/* End "detail supporting" div */
echo '</div>' . "\n";
/* End page div */
echo '</div>' . "\n";

View File

@@ -18,7 +18,6 @@ if (isset($lease['Lease']))
$rows = array();
$rows[] = array('ID', $lease['id']);
$rows[] = array('Number', $lease['number']);
$rows[] = array('Lease Type', $lease_type['name']);
$rows[] = array('Unit', $html->link($unit['name'],
@@ -79,6 +78,21 @@ echo '</div>' . "\n";
echo '<div CLASS="detail supporting">' . "\n";
/**********************************************************************
* Unpaid Charges
*/
echo $this->element('statement_entries', array
(// Grid configuration
'config' => array
('caption' => 'Outstanding Charges',
'limit' => 10,
'action' => 'unreconciled',
'filter' => array('StatementEntry.lease_id' => $lease['id']),
'exclude' => array('Customer', 'Unit'),
)));
/**********************************************************************
* Lease Account History
*/
@@ -87,30 +101,9 @@ echo $this->element('statement_entries', array
(// Grid configuration
'config' => array
('caption' => 'Lease Statement',
'filter' => array('Lease.id' => $lease['id']),
'filter' => array('Lease.id' => $lease['id']),
'include' => array('Through'),
'exclude' => array('Customer', 'Lease', 'Unit'),
'sort_column' => 'Effective',
'sort_order' => 'DESC',
)));
/**********************************************************************
* Receipt History
*/
echo $this->element('ledger_entries', array
(// Grid configuration
'config' => array
('caption' => 'Customer Receipts',
'filter' => array('Customer.id' => $customer['id'],
'Transaction.type' => 'RECEIPT',
'Tender.id !=' => null,
//'Account.id !=' => '-AR-'
),
'exclude' => array('Account', 'Cr/Dr'),
'sort_column' => 'Date',
'sort_order' => 'DESC',
)));

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,69 @@
<?php /* -*- mode:PHP -*- */
echo '<div class="statement_entry overview">' . "\n";
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Overview Main Section
*/
$rows = array();
$rows[] = array("$months Month Charges", FormatHelper::currency($overview['charges']));
echo $this->element('table',
array('class' => 'item statement_entry detail',
'caption' => 'Monthly Charges',
'rows' => $rows,
'column_class' => array('field', 'value')));
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Supporting Elements Section
*/
echo '<div CLASS="detail supporting">' . "\n";
$headers = array('Account', 'Amount');
$row_class = array();
$rows = array();
foreach ($overview['months'] AS $month) {
$row_class[] = 'subheader';
$rows[] = array($month['name']);
$odd = 1;
foreach ($month['subs'] AS $sub) {
$row_class[] = array('subitem', $odd ? 'oddrow' : 'evenrow');
$rows[] = array($sub['name'], FormatHelper::currency($sub['charges']));
$odd = !$odd;
}
$row_class[] = 'grand';
$rows[] = array('Total for '.$month['name'], FormatHelper::currency($month['charges']));
}
echo $this->element('table',
array('class' => 'item statement_entry-overview overview list',
'caption' => 'Months',
'headers' => $headers,
'rows' => $rows,
'row_class' => $row_class,
'suppress_alternate_rows' => true
));
?>
<script type="text/javascript"><!--
jQuery(document).ready(function(){
jQuery('table.overview td.subheader').attr('colSpan', 2);
});
--></script>
<?php
/* End "detail supporting" div */
echo '</div>' . "\n";
/* End page div */
echo '</div>' . "\n";

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