Compare commits

..

494 Commits

Author SHA1 Message Date
abijah 011d1208e8 Initial thoughts on the charge reversal. It's obviously not working yet, or I wouldn't leave it hanging on a branch.
git-svn-id: file:///svn-source/pmgr/branches/alt_reversal_20090806@502 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-07 04:20:20 +00:00
abijah 9dd09c4d2e Branch created to save some changes/thoughts on charge reversals. As of branch creation, we're just deleting the current disbursements on the charge, and deletion is never good, since we lose information by definition. For example, the collected rents report will be adversely affected. So, we need to figure out how to keep the disbursement, and yet still have everything work out correctly. That work will be started on this branch.
git-svn-id: file:///svn-source/pmgr/branches/alt_reversal_20090806@501 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-07 04:18:13 +00:00
abijah 2e36d46329 Minor tweaks, a shame for checkin r500 :-(
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@500 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-07 03:55:01 +00:00
abijah 1dd0b14861 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@499 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-07 00:10:28 +00:00
abijah d75cd10f49 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@498 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 20:17:02 +00:00
abijah a69a56c715 Fixed the button text for new customers
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@497 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 18:08:55 +00:00
abijah 8f7cf202e5 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@496 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 18:08:21 +00:00
abijah 58c4f28956 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@495 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 18:06:57 +00:00
abijah f3eaa40ea5 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@494 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 09:27:09 +00:00
abijah e784931fa8 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@493 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 05:11:58 +00:00
abijah 5a7b087ddc 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@492 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 05:04:34 +00:00
abijah 4d62d7da73 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@491 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-06 02:52:45 +00:00
abijah cca698d437 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@490 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-05 07:54:57 +00:00
abijah 5247bb8db6 Modified to use toggle for 'this' debug pr block, instead of independent show/hide
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@489 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-05 02:59:09 +00:00
abijah cb969ba340 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@488 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-05 01:00:09 +00:00
abijah 094e15ddf9 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@487 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-05 00:06:46 +00:00
abijah 670f0894ea 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@486 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 23:25:31 +00:00
abijah 9e20473b3b 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@485 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 22:12:32 +00:00
abijah 11d5deac85 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@484 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 22:09:18 +00:00
abijah 67280c89e7 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@483 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 21:19:20 +00:00
abijah 1afed6a6e0 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@482 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 20:26:33 +00:00
abijah 0ff91bf4d8 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@481 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 19:25:39 +00:00
abijah 4d4e96fe1c 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@480 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-04 03:12:09 +00:00
abijah 32a98b4b6e 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@479 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 21:50:21 +00:00
abijah 817b74b085 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@478 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 21:47:24 +00:00
abijah dc1bb56188 Fixed cut/paste error causing invalid customer security deposit balance.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@477 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 21:44:36 +00:00
abijah 4707f3314d 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@476 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 20:17:14 +00:00
abijah ac2b1530fc 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@475 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 20:13:48 +00:00
abijah a5d3ff0b70 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@474 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 19:41:49 +00:00
abijah adc87c0763 Added stack tracing to each model::pr print
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@473 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 18:38:35 +00:00
abijah 7d81b9766b Added ability to waive a partial charge.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@472 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 04:14:44 +00:00
abijah 1aa6273ade 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@471 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 03:46:58 +00:00
abijah 2c08405d5a 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@470 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 03:45:51 +00:00
abijah e2ed6ed1c7 Left r466 with syntax error... fixed that
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@469 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-03 02:30:29 +00:00
abijah cb716b06b7 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@466 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-02 22:44:55 +00:00
abijah 35d7656bc5 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@465 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-01 01:48:07 +00:00
abijah 8818ad7a80 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@464 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-08-01 01:47:11 +00:00
abijah 15a4528e75 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@463 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 21:11:00 +00:00
abijah 44e4477d38 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@462 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 21:07:00 +00:00
abijah c4cc3ea812 Left a syntax error on the last checkin :-/
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@461 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 19:23:19 +00:00
abijah 1e10fbbf38 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@460 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 19:20:35 +00:00
abijah 53a279a6db Added logging
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@459 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 18:35:39 +00:00
abijah 8e0270cc82 Removed the ability to NSF items like Cash
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@458 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 18:19:20 +00:00
abijah 3a95a994cf Updated todo and requirements
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@457 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 18:13:26 +00:00
abijah 00c99ea60a Added a way to associate the meaningful part of NSF with the corresponding tender.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@456 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 18:10:48 +00:00
abijah e09fb7d258 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@455 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 17:57:30 +00:00
abijah 37e7212abe 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@454 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 17:43:51 +00:00
abijah 655e0c3940 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@453 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 17:15:17 +00:00
abijah e47a2cc7aa Some cleanup from the last checkin
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@452 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 16:48:27 +00:00
abijah 0cdcb6252e 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@451 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 16:41:56 +00:00
abijah bbec6ccbb6 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@450 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 03:46:59 +00:00
abijah 91fdef9997 Must have had a brain freeze to be placing closing monies directly in Equity, since it is a credit account and doing so only ran the account into a negative balance. Transfers out of A/R need to go to an asset account, and so I reverted this back to Closing.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@449 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 03:36:11 +00:00
abijah 3e2d219c8d 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@448 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 03:29:17 +00:00
abijah 57d593fc38 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@447 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 03:07:34 +00:00
abijah 65b7137f21 Modified to use the logging mechanism
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@446 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 02:09:45 +00:00
abijah 323519ab75 Modified to use the logging mechanism
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@445 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:45:57 +00:00
abijah a1a9c7800b 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@444 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:40:16 +00:00
abijah fe17f87f7d 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@443 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:38:53 +00:00
abijah 6b9279f5b0 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@442 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:35:45 +00:00
abijah 2882b1917c 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@441 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:34:45 +00:00
abijah f707448b05 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@440 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:31:45 +00:00
abijah 5247139fe8 Changed prints to use the new logging system
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@439 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 01:23:27 +00:00
abijah d2a4021d6f 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@438 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-31 00:00:10 +00:00
abijah b759f29d91 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@437 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 23:32:10 +00:00
abijah c0d26a8e95 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@436 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 23:20:47 +00:00
abijah a1f30804a7 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@435 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 21:40:38 +00:00
abijah 55b3ec947e Logged a new bug
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@434 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 21:39:07 +00:00
abijah 876d9b3d33 The conditions were clamped down too tight, as they prevented something like 'Table.field !='
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@433 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 21:34:03 +00:00
abijah d33bf24958 Included a possible mechanism for including the nsf ledger entries when viewing a tender
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@432 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 21:06:02 +00:00
abijah 424cb0ea4f Tweaked filtering to allow for non-trivial conditions
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@431 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 20:59:33 +00:00
abijah 63de30d392 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@430 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 19:45:19 +00:00
abijah 07232c77d5 Moved the filtering split to a virtual function.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@429 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 19:07:21 +00:00
abijah 1e7557de71 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@428 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 18:23:37 +00:00
abijah d91957faed 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@427 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 07:30:50 +00:00
abijah 56e6aa1f34 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@426 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 06:29:41 +00:00
abijah 6e759e8589 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@425 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 06:09:05 +00:00
abijah 9733226dfd 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@424 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 02:47:43 +00:00
abijah be2865b4d7 Cleanup of old lingering functions and some comment blocks
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@423 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 02:39:09 +00:00
abijah adddfecada Fixed the problem with zero dollar balance forward entries when closing a ledger.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@422 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 02:17:49 +00:00
abijah 55c5c9e9e6 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@421 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-30 01:59:10 +00:00
abijah 42677ae2f4 Disabled submission of tender types that have no items
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@420 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 23:25:26 +00:00
abijah ec8f540107 This is the remainder of the previous, invalid, partial checkin.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@419 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 23:25:03 +00:00
abijah 393c0dbb3f 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@418 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 23:17:00 +00:00
abijah f8413b8784 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@417 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 23:16:26 +00:00
abijah e1217cd185 Updated requirements (and unfortunately, had to back some completed items off the list since our latest rework.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@416 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 10:23:08 +00:00
abijah 37d0fe7f3f Removed all the debug comments added to the database by the sitelink script. Noted another defect in the todo list.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@415 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 10:18:13 +00:00
abijah 13f97e5770 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@414 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 10:10:11 +00:00
abijah b789ed62b7 Added customer association to each tender
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@413 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 09:33:29 +00:00
abijah 2ffe04e3e4 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@412 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 08:55:09 +00:00
abijah cdba179d79 Fixed problem with grid display when part of a form
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@411 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 08:50:44 +00:00
abijah 5ba6438b77 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@410 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 02:43:30 +00:00
abijah a4459ef0de 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@409 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 02:41:50 +00:00
abijah e7b71e0abb Fixed the pluralization of cash
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@408 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 02:39:31 +00:00
abijah 0c06ef6d71 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@407 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 01:51:34 +00:00
abijah 0f42ad9b07 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@406 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 01:50:33 +00:00
abijah c20b287c53 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@405 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 01:43:08 +00:00
abijah ef4d8d4d30 Increased font size for the page number input at the bottom of each jqGrid
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@404 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 01:42:16 +00:00
abijah e7a659a690 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@403 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-29 01:41:34 +00:00
abijah f6ee56501d 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@402 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 16:08:15 +00:00
abijah 826eb63da1 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@401 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 16:07:34 +00:00
abijah 6cf6dda3f8 Fixed a bug that was causing multiple tender types to have a name like 'Check #'
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@400 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 16:06:03 +00:00
abijah 5446f6a266 Removed Brenda Harmon test code.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@399 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 02:41:11 +00:00
abijah b225775a91 Suppressed all the debug print statements from transaction insertion.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@398 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 02:40:42 +00:00
abijah a5565546d1 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@397 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 02:39:44 +00:00
abijah f0b65dcf74 Bug fixes to get lease security deposit and balance information working.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@396 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 01:18:02 +00:00
abijah ad1758a5dc Added a rent column to the units list
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@395 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 01:17:09 +00:00
abijah b3389652fd 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@394 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 01:16:42 +00:00
abijah ba62eed027 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@393 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-28 01:11:27 +00:00
abijah 3dc751c863 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@392 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-27 04:18:38 +00:00
abijah 68fe787209 Playing with different means for determining stats. Nothing decided yet.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@391 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-26 23:23:19 +00:00
abijah d4292a85a0 Added ability to toggle between one big closing ledger entry, and one per house
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@390 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-25 08:08:47 +00:00
abijah f9635419dd Added transaction stats. Added (possibly unwanted) columns.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@389 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-25 08:06:50 +00:00
abijah d8f10bfd13 Fixed yet another bug in the merging of actions & options
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@388 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-25 07:57:56 +00:00
abijah 25b7da57f3 Made progress adapting the receipt code onto the latest db changes.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@387 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 07:43:42 +00:00
abijah 29fe265daa 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@386 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 05:01:29 +00:00
abijah 769c02a5f1 Reverted back to r383.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@385 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 04:16:33 +00:00
abijah 476a179e7b 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@384 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 04:15:39 +00:00
abijah df8ebe45ef 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@383 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 03:58:57 +00:00
abijah 0bf458f243 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@382 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 03:58:12 +00:00
abijah 18c4f5ea48 Forgot this file on the last checkin, since it was using the trackable field
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@381 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 03:55:54 +00:00
abijah a0f33054cb 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@380 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 03:22:56 +00:00
abijah 0f00b42d1f Modified the closing sum to be a single receipt, and a single debit/credit to the ledger of choice (presently Equity). This was mostly a test to check the logic of multiple payments having only a single accounting transaction. It seems to work, but I suspect we'll have trouble when we start to figure out customer account balances, since the receipt has NULL for the customer_id (since it is a receipt for many customers). Depending on the customer balance / reconciliation logic, this may or may not fly.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@379 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 03:12:18 +00:00
abijah 1e0b96953e 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@378 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 02:07:43 +00:00
abijah b408d86a98 Added Concession as a form of tender (which clearly isn't legal tender, and might not even be tender... who knows).
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@377 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 01:48:58 +00:00
abijah e739282d17 Modified tenders to use a tender_type_id, not only for the ability to dynamically add types later, but primarily so that a type could be associated with an account, instead of hardcoding it in the application. With this, I changed several of the account field names, but they shouldn't be in too heavy use in the application.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@376 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-24 01:43:41 +00:00
abijah c73016ecf2 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@375 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 23:54:40 +00:00
abijah 122dfb10a0 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@374 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 23:52:59 +00:00
abijah 9a32800170 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@373 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 23:45:04 +00:00
abijah 04bc284a76 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@372 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 21:24:49 +00:00
abijah 708759765f 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@371 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 16:53:33 +00:00
abijah 9dccbfeda8 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@370 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 16:51:32 +00:00
abijah f8c60ec265 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@369 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 16:35:53 +00:00
abijah 234999b4d2 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@368 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 01:49:46 +00:00
abijah 0ba5007438 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@367 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-23 01:11:30 +00:00
abijah 8cf8f65474 Changed 'payment' to 'tender', since the payment term has been heavily overloaded. Tender represents legal tender, and replaces what used to be monetary source. I'm not terribly fond of the name, especially the plural form. However, for now at least, it can be distinct from other types of 'payment' and we can change it later if we come up with a better name. Also, added a name to ledger, since one was being manually created at runtime in several spots. This should allow us to consolidate the naming convention to a single spot.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@366 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 23:35:41 +00:00
abijah c596dfa5f0 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@365 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 23:31:41 +00:00
abijah 8331be454c 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@364 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 23:12:04 +00:00
abijah 8b65bc5159 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@363 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 22:54:02 +00:00
abijah 634f0f5423 Fixed the Linkable behavior from polluting the query fields when performing a count query.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@362 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 22:27:55 +00:00
abijah 7aa026f4e0 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@361 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-22 17:06:44 +00:00
abijah 93ebc450fe 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@360 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-21 10:23:52 +00:00
abijah fd856323a5 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@359 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-21 09:40:51 +00:00
abijah 59e6379977 Definitely not perfect, but the database changes seem to be OK, along with the sitelink script. Certainly workable if not yet complete.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@358 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-21 04:16:54 +00:00
abijah ae5d4763f9 Adjusted formatting only
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@357 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-21 02:55:43 +00:00
abijah c002f3f3ba Another snapshot
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@356 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-20 23:35:11 +00:00
abijah f8d4dcef94 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@355 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-20 20:22:06 +00:00
abijah a7671e76fe Minor logic and formatting changes. Considering making Linkable operate recursively.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@354 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-20 19:00:54 +00:00
abijah fc30dfa2e8 Another snapshot. I think I'll be taking the CREDIT/DEBIT reconcile functionality out.
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@353 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-20 02:17:54 +00:00
abijah 6ac0204baf 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@352 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-19 23:35:25 +00:00
abijah e303898a95 D:\bin\svnbranch.pl: Branch from /branches/invoice_receipt_20090629 to /branches/yafr_20090716
git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@351 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-16 18:52:28 +00:00
abijah 3313a18407 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@350 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-16 07:27:18 +00:00
abijah b2ab134996 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@349 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-16 07:12:18 +00:00
abijah fbb751d054 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@348 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 18:37:51 +00:00
abijah fff6eaeeca Added a couple helper functions to Ledger.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@347 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 18:33:30 +00:00
abijah 1408a3dcb3 Eliminated the LedgerEntry::nsf code, which was replaced with MonetarySource::nsf.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@346 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 18:32:14 +00:00
abijah 9507bfddc8 We're now able to determine when a lease is paid through.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@345 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 09:24:53 +00:00
abijah aa682c9bb2 minor cleanup of the paid through function
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@344 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 09:22:19 +00:00
abijah 0c8649d1c5 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@343 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 09:18:56 +00:00
abijah 405e20f37f 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@342 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 08:01:56 +00:00
abijah 75ff8a2a40 Fixed bug preventing customer links from working
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@341 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 07:55:40 +00:00
abijah 20c1284788 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@340 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 07:47:13 +00:00
abijah 116b014332 Added a 'Calculating...' message before the grid has rendered.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@339 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 07:45:23 +00:00
abijah 8fcecb7092 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@338 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 07:44:51 +00:00
abijah 8a36b441de Layout manipulation to the collected page.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@337 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 07:13:41 +00:00
abijah b1914f7cca 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@336 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 06:21:55 +00:00
abijah 0649329dde 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@335 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 05:42:10 +00:00
abijah 50c4ee225f 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@334 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 03:06:59 +00:00
abijah d1075a2ea2 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@333 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 01:33:06 +00:00
abijah 6210838b22 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@332 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 01:05:44 +00:00
abijah f5b87fa6b0 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@331 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-15 00:21:23 +00:00
abijah 1d8ef76efa 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@330 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-14 21:44:19 +00:00
abijah 60f43efdb7 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@329 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-14 20:48:16 +00:00
abijah abc5f1feff 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@328 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-13 10:14:38 +00:00
abijah 8b7c27b5db Added a ledger entry listing on the monetary source view page.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@327 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-13 09:54:49 +00:00
abijah 865d9ee617 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@326 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-13 04:41:18 +00:00
abijah 059dbd3190 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@325 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-13 04:40:21 +00:00
abijah 8a3c6ae21b 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@324 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-13 02:24:31 +00:00
abijah 03af4e731f 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@323 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 21:00:38 +00:00
abijah 2cd73ed9e8 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@322 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 20:23:46 +00:00
abijah b97d071bb4 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@321 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 20:15:56 +00:00
abijah 6a0a77c116 More todo items
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@320 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 18:36:22 +00:00
abijah d6be905c08 Added a couple more virtual functions for more controller flexibility.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@319 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 18:34:24 +00:00
abijah 6e1c684a06 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@318 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-12 18:01:01 +00:00
abijah 0c13ef5cda captured another requirement and a todo
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@317 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 16:50:52 +00:00
abijah 9529431be2 Eliminated the unnecessary $A Account variable in the actual Account model (duh)
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@316 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 16:50:13 +00:00
abijah d2ac8019ee Not sure why I haven't already checked in the 'To Do' notes file that I've been using, but here it is.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@315 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 15:56:54 +00:00
abijah 1994512d6e 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@314 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 15:54:44 +00:00
abijah a462e9be1c Accidentally checked in refundable stub on the last change set, so here is the database changes to go with it. Nothing has been done yet for refunds.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@313 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 15:51:52 +00:00
abijah ccf0138eee 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@312 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 15:50:48 +00:00
abijah 288e4c05de Added debug link to create all new ledgers
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@311 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 15:37:52 +00:00
abijah b3ca719517 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@310 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 15:37:17 +00:00
abijah b8fd17efcf 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@309 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 09:06:36 +00:00
abijah ece7ab25ae 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@308 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 08:23:55 +00:00
abijah 860006ed38 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@307 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 08:10:23 +00:00
abijah e067af589c 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@306 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 07:26:17 +00:00
abijah 546766d9be Fixed stupid syntax error
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@305 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 07:24:14 +00:00
abijah 4b43433d2d 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@304 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 01:52:32 +00:00
abijah 5a1fdedad0 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@303 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 01:44:46 +00:00
abijah 6ce9eec1a4 clean up lingering comments.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@302 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 00:46:31 +00:00
abijah d44007a358 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@301 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 00:45:17 +00:00
abijah 8d2a544042 More changes to the ledger_entry view
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@300 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-11 00:34:43 +00:00
abijah d9297d89ab 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@299 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 21:21:49 +00:00
abijah 46db9c8341 Fixed bug with undefined Lease.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@298 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 10:51:57 +00:00
abijah ad17023570 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@297 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 10:49:19 +00:00
abijah 9cac8c26a9 Added another requirement
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@296 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 10:09:34 +00:00
abijah 90d990e0a5 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@295 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 10:06:56 +00:00
abijah 1cb56894ce Forgot to add apply_deposit.ctp to the last checkin.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@294 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 09:35:50 +00:00
abijah f2f389ee45 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@293 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 09:28:29 +00:00
abijah 5877874e82 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@292 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-10 07:25:55 +00:00
abijah de5f4208eb Added petty cash and a couple higher security accounts, Equity and Loan
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@291 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 16:37:16 +00:00
abijah 6507009acc 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@290 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 16:07:19 +00:00
abijah 6e1eba03a0 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@289 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 09:20:04 +00:00
abijah 7a31f5cbd2 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@288 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 08:28:34 +00:00
abijah 112aa7cf59 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@287 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 07:50:44 +00:00
abijah 372578f171 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@286 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 07:22:38 +00:00
abijah 645458c081 Added some special cases
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@285 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 06:20:59 +00:00
abijah 1afaede12a 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@284 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 06:10:00 +00:00
abijah 5a4cfb0581 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@283 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 06:08:31 +00:00
abijah 17b6986758 Fixed problem when nameToID returns no results.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@282 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 05:27:13 +00:00
abijah 00b473ee4f Noted the need to perform bank deposits
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@281 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 05:07:33 +00:00
abijah 3463ae329b Captured notes on functional requirements to just get this thing out the door.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@280 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 03:41:21 +00:00
abijah b3bceef570 Copied this requirements file from a different repository. For history, see http://localhost/svn/domain/branches/rent_manager_20090510/requirements.txt.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@279 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 03:29:24 +00:00
abijah 80ddeeed6f Implemented more around lease closings.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@278 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 02:57:43 +00:00
abijah 43787d6434 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@277 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 02:57:29 +00:00
abijah 72c55459ca 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@276 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 02:19:14 +00:00
abijah 977b21ed96 Got rid of the massive variable dump to stdout, and so moved all of the STDERR prints back to STDIN. Also hooked up root_transaction_id, although it's not being used yet (and may never be).
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@275 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 01:21:21 +00:00
abijah e4132237b9 Trimmed down my contact information and fixed the .com / .info typo
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@274 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 00:45:16 +00:00
abijah c2d2a1c400 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@273 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 00:40:24 +00:00
abijah 208aaaa504 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@272 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 00:31:56 +00:00
abijah 21aa2c1d26 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@271 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 00:21:48 +00:00
abijah d3959e92e5 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@270 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-09 00:00:29 +00:00
abijah 60c4d950fa Fixed bug for receipt linking to lease ID instead of customer ID
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@269 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 23:55:22 +00:00
abijah d7db5a32d6 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@268 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 23:30:13 +00:00
abijah 1932a9c316 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@267 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 21:53:30 +00:00
abijah d09af4f475 More work to make the db scripts general
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@266 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 21:49:00 +00:00
abijah 437ebabfd3 Removed the hardcoded script location, and added some extra debug information
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@265 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 21:33:52 +00:00
abijah 686c58afea Modified the sitelink2pmgr script to print debug information about where it's connecting, and to no longer have schema.sql reference the database. This will create an issue if we delete tables from the file, but we'll deal with that as it comes.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@264 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 21:25:07 +00:00
abijah 754e2327c7 Modified which columns are displayed for ledger entries
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@263 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 20:57:11 +00:00
abijah aca9d13a7d 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@262 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 20:40:44 +00:00
abijah 311d8be646 Moved the leases element onto the new grid helper.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@261 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 19:22:22 +00:00
abijah f77281835d Minor tweak to allow more size selections in the drop down list.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@260 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 19:19:42 +00:00
abijah 1ed98b5e39 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@259 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 19:19:05 +00:00
abijah a2cb53a83b 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@258 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 17:35:36 +00:00
abijah dff8394e91 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@257 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 17:33:43 +00:00
abijah 014fa0feb9 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@256 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 16:04:53 +00:00
abijah 3aacbb94aa 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@255 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 14:48:34 +00:00
abijah 5f9b9e15cb Fixed bug with security deposits after I did away with sitelinks use of ledger number some time back
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@254 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 00:52:33 +00:00
abijah 1f95e835f8 Updated the balance algorithm for units and customers as was done for leases.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@253 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 00:34:03 +00:00
abijah f7f9da92f3 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@252 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-08 00:32:22 +00:00
abijah 3f275b127b 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@251 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 16:08:56 +00:00
abijah f4319364f2 Added mechanism for user to know the rent amount on the invoice screen.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@250 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 09:00:54 +00:00
abijah 54ded6173a 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@249 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 08:09:51 +00:00
abijah b36d3117a3 Removed lingering debug prints
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@248 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 08:08:36 +00:00
abijah 06b8ff2ae9 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@247 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 07:52:41 +00:00
abijah 40264d3c39 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@246 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 07:21:22 +00:00
abijah 5007890d09 Added a petty cash account
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@245 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 07:14:28 +00:00
abijah aab8a994c8 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@244 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 07:14:18 +00:00
abijah a8c91d8b22 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@243 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 04:37:04 +00:00
abijah d5d2d07894 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@242 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 04:34:18 +00:00
abijah 7b3f774304 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@241 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 04:33:06 +00:00
abijah e17cf21351 Removed the debug comments for each invoice/receipt/payment/charge/etc
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@240 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 04:29:34 +00:00
abijah 807dc48375 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@239 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 02:55:55 +00:00
abijah 8491d81496 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@238 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 01:29:03 +00:00
abijah 1c164cebc1 Fixed late charge cut/paste error
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@237 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 01:28:03 +00:00
abijah db5eed24f6 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@236 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 00:43:41 +00:00
abijah c7d7c9e7e4 Now that we have a default customer name automatically provided, we've made 'name' a required field
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@235 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-07 00:42:05 +00:00
abijah eba1267f00 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@234 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 23:17:53 +00:00
abijah 240a16367b 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@233 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 22:23:40 +00:00
abijah cb39f6f0eb 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@232 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 19:22:27 +00:00
abijah cd07f51ff9 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@231 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 18:34:44 +00:00
abijah cba8e16be7 Moved the contact save logic into the model and out of the controller.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@230 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 17:25:05 +00:00
abijah fbeed43e61 Fixed comment block
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@229 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 16:59:13 +00:00
abijah 1d82e263ad 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@228 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 16:57:23 +00:00
abijah aa12a1efa4 Moved the customer save logic into the model
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@227 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 15:45:49 +00:00
abijah 758a5f700c Added empty view for debugging.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@226 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 15:40:32 +00:00
abijah 9aa598f81f 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@225 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 04:32:14 +00:00
abijah e953f2709d Changed leases element to understand some common fields
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@224 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 04:30:03 +00:00
abijah 96dd06b58a 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@223 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 03:35:09 +00:00
abijah 5fd783dc50 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@222 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 03:34:33 +00:00
abijah 689a6dc7aa 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@221 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 03:09:54 +00:00
abijah 3e60f8d45e 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@220 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 03:01:28 +00:00
abijah 09cb297dc7 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@219 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 02:06:23 +00:00
abijah ab0e85824b 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@218 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-06 00:42:57 +00:00
abijah 6def9cbb02 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@217 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 23:43:35 +00:00
abijah c7d772be53 Changed order to Phone/Address/Email to be consistent with other areas
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@216 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 23:33:47 +00:00
abijah e584997805 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@215 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 23:33:07 +00:00
abijah b7e0ea8313 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@214 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 20:01:06 +00:00
abijah bb61de60ad 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@213 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 20:00:02 +00:00
abijah bc3bcd8312 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@212 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 18:32:54 +00:00
abijah c59f48fb84 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@211 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 17:30:59 +00:00
abijah 6844513253 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@210 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 15:04:09 +00:00
abijah dc850f4e8e 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@209 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 15:01:18 +00:00
abijah dea1454dcd 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@208 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-05 02:48:23 +00:00
abijah 6a8d21dad7 Changed the relationship between grid visibility and text of the selected item.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@207 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-04 17:38:22 +00:00
abijah 27503ac4f9 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@206 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-04 04:42:11 +00:00
abijah f6401c92be 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@205 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-04 04:13:09 +00:00
abijah d77dcfca75 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@204 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-03 06:53:41 +00:00
abijah a796e9e82d Added some revisit comments for move-out.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@203 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 20:05:56 +00:00
abijah 504f1e7cc0 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@202 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 20:00:50 +00:00
abijah 591e1db81d 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@201 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 09:33:42 +00:00
abijah 1ae1b6a4f3 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@200 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 09:19:33 +00:00
abijah 021c0626a3 Added ability for callers to control the jqGrid sort order
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@199 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 09:16:42 +00:00
abijah 63b2e7360b Got the bank deposit working well.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@198 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 07:41:18 +00:00
abijah 3ad0cc1d20 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@197 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-02 01:40:32 +00:00
abijah 8d87a0698c 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@196 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-01 11:10:57 +00:00
abijah 44df78e69f 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@195 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-07-01 08:17:31 +00:00
abijah 707c9a87ef 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@194 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 18:11:40 +00:00
abijah 0558c35ebc Merge in some desired changes from the statements_20090623 branch
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629@193 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 18:09:17 +00:00
abijah 2b2991a13a 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@192 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 17:56:32 +00:00
abijah c1aedde374 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@191 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 17:54:54 +00:00
abijah 0b69e065ae Major change to invoice/receipt algorithms. The end result shouldn't be visible, but there were significant problems understanding how to reconcile entries and this cleaned things up significantly. There may be some bugs left, but quick tests show it to be working
git-svn-id: file:///svn-source/pmgr/branches/charge_credit_20090629@190 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 17:52:43 +00:00
abijah 1c8cc70a28 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@189 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 04:47:18 +00:00
abijah c6f68861b3 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@188 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-30 01:06:33 +00:00
abijah ce4fa4131a 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@182 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-24 00:33:39 +00:00
abijah 80f8bd36d5 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@181 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-23 19:04:41 +00:00
abijah 7aa1100cac Moving to the standard accounting method of a single Account Receiveable.
git-svn-id: file:///svn-source/pmgr/branches/single_AR_20090622@180 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 23:46:03 +00:00
abijah b9c1a81c3b Experiment to allow payments to trace back to the charge, even if the amount crosses several ledgers. I'd really like to go a different direction.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@179 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 23:42:13 +00:00
abijah bd0bbd768d Prevent grouping of ledger entries by transaction, at least for now.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@178 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 23:40:53 +00:00
abijah 20b8908a00 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@177 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 19:03:08 +00:00
abijah ab51fd32d2 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@176 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 17:58:13 +00:00
abijah b780ebeb3e 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@175 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 17:55:32 +00:00
abijah 117e31af69 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@174 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 17:46:49 +00:00
abijah 28b3f35318 Fixed problem with sorting by entries/debits/credits/balance
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@173 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-22 17:43:24 +00:00
abijah 2b8a525718 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@172 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-19 16:22:28 +00:00
abijah dc6e399fea 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@171 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-19 16:21:16 +00:00
abijah 1508f963d3 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@170 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-19 16:19:18 +00:00
abijah 3270ad9bf0 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@169 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-19 16:17:14 +00:00
abijah febd216810 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@168 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 04:19:17 +00:00
abijah c8b781804a 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@167 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 04:07:52 +00:00
abijah 3e5ac64108 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@166 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 03:57:43 +00:00
abijah 9b6830468e Modified to prevent stepping on the user's action if already set.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@165 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 03:45:43 +00:00
abijah 063aec6c3c 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@164 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 03:43:05 +00:00
abijah a2ae522b2d 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@163 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-18 00:49:40 +00:00
abijah ba218fbeeb 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@162 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 19:12:22 +00:00
abijah 2e67695154 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@161 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 18:40:39 +00:00
abijah a136fd5313 Stopped the debug output when dynamically adding a div
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@160 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 18:39:12 +00:00
abijah 1e3774cad6 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@159 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 09:00:38 +00:00
abijah 518f7836ac 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@158 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 08:32:53 +00:00
abijah 416e230da8 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@157 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 07:38:39 +00:00
abijah cd416ea5fa 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@156 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 07:37:45 +00:00
abijah 001b156333 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@155 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-17 05:17:59 +00:00
abijah df1e0daafd 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@154 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:55:41 +00:00
abijah 9331b0a412 Should have checked this as part of the last commit (r152), since it is the DB schema changes necessary to support the reconciliation work. Also, the sitelink script was modified to match.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@153 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:47:57 +00:00
abijah fae90c3fa9 Added initial support for ledger entry reconciliation (e.g. matching payments to charges).
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@152 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:40:46 +00:00
abijah a83edef049 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@151 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:39:27 +00:00
abijah 4ada3d5bac 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@150 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:37:15 +00:00
abijah ede1053de4 Added a virtual callout for grouping
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@149 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 21:36:19 +00:00
abijah ce9142ffe2 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@148 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 17:19:07 +00:00
abijah 0270e5ea89 Yet another place where Ledger.name was being used.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@147 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 08:38:31 +00:00
abijah 4d2b4779d4 Fixed bug created when controller was added as an optional parameter to Links
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@146 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 04:48:52 +00:00
abijah fe7d7c6b0f Removed another instance of using Ledger.name
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@145 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 04:48:17 +00:00
abijah 435b0614b2 Removed another unnecessary field
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@144 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 04:47:38 +00:00
abijah 708910870c 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@143 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 02:24:39 +00:00
abijah 8b067bf676 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@142 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-16 02:18:05 +00:00
abijah 388dbc0540 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@141 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 23:22:38 +00:00
abijah ce20a44836 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@140 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 23:06:27 +00:00
abijah 1495bb3373 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@139 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 21:52:38 +00:00
abijah eaea52a862 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@138 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 21:45:07 +00:00
abijah 271207629b 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@137 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 21:34:35 +00:00
abijah edca01f98c 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@136 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 21:24:42 +00:00
abijah 23f4a29fc7 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@135 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 21:01:22 +00:00
abijah 543e2daa43 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@134 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 19:41:20 +00:00
abijah 3911b3303f Removed the useless pagination code from ledger_entries
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@133 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 06:46:05 +00:00
abijah d859cb4dee Changed account to split the table requests into two parts.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@132 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 06:31:21 +00:00
abijah 39071b39fb Moved ledgers over the jqGrid. Working reasonably well at the moment.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@131 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 06:22:38 +00:00
abijah 3dcdcb03eb Updated accounts to use jqGrid.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@130 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 04:15:55 +00:00
abijah 41636f5c75 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@129 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 04:15:35 +00:00
abijah 1890a0490e 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@128 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 02:50:21 +00:00
abijah 2b9369b823 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@127 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 02:48:58 +00:00
abijah 4ec3db7b58 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@126 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 00:44:40 +00:00
abijah 9f876b78de 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@125 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-15 00:13:57 +00:00
abijah 31c603c757 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@124 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 23:54:48 +00:00
abijah 4d49ad6516 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@123 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 23:16:35 +00:00
abijah 015e6b082d 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@122 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 22:05:44 +00:00
abijah cdec4c3301 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@121 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 20:36:38 +00:00
abijah 404323c6c1 Moved contacts onto jqgrid. Added 'name' and 'longname' formats.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@120 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 20:24:36 +00:00
abijah d5dbabd94a Fixed trivial spelling error in one comment block
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@119 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 20:12:52 +00:00
abijah c90830d41a 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@118 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 19:50:09 +00:00
abijah f6ca79d1a9 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@117 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 05:33:30 +00:00
abijah 5fab94011b Fixed minor issue where an empty query could continue to persist.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@116 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 05:14:36 +00:00
abijah af2d5c38f3 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@115 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 05:04:41 +00:00
abijah 6b8d05f2a0 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@114 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 04:40:47 +00:00
abijah 336ec3b643 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@113 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 03:22:53 +00:00
abijah b4d640f7c2 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@112 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 01:27:58 +00:00
abijah 90a16c721e 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@111 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 00:53:08 +00:00
abijah e7b4b21328 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@110 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-14 00:46:12 +00:00
abijah 3be775f9b2 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@109 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 21:20:11 +00:00
abijah 0278c77610 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@108 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 20:46:17 +00:00
abijah 508a8b08aa 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@107 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 20:44:36 +00:00
abijah c5bd8b4b16 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@106 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 15:52:09 +00:00
abijah a49b86898e 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@105 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 07:22:38 +00:00
abijah 55dd94681a 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@104 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 04:19:19 +00:00
abijah 2f91dd456a 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@103 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 03:51:29 +00:00
abijah e32a5e5d4c 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@102 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-13 03:46:17 +00:00
abijah cca48fe86a More minor cleanup
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@101 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-12 02:45:48 +00:00
abijah 839d9c1697 cleaned up and put the different payment types into a loop for reuse.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@100 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-12 02:35:13 +00:00
abijah c80c66d958 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@99 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-12 01:49:24 +00:00
abijah a2fa71038a 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@98 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-11 02:38:54 +00:00
abijah d3c7011fc8 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@97 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-11 00:17:13 +00:00
abijah 2c224dbc62 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@96 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-11 00:09:10 +00:00
abijah 13b2283d76 Removed the unintended javascript addition from the last checkin.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@95 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 23:39:40 +00:00
abijah 3d89da7a61 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@94 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 21:24:05 +00:00
abijah 99263920a3 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@93 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 21:14:26 +00:00
abijah 8ab8d087e6 Added the debug toolkit plugin, found on the bakery website.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@92 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 21:12:59 +00:00
abijah 18b928411b 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@91 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 21:09:23 +00:00
abijah 8d062ab92e Customized our fuzzy 'age' function to suit our purpose
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@90 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 20:20:55 +00:00
abijah 147c1e7097 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@89 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 17:06:35 +00:00
abijah 760420bdc5 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@88 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 15:08:52 +00:00
abijah fb48baf575 Fixed problem with units that are vacant, and thus have no current lease.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@87 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 09:10:09 +00:00
abijah d60c9721ca Added in security deposit information to the lease view
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@86 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 08:58:43 +00:00
abijah f8eb45a0b9 Added lease and ledger_entry controllers/views. Minor bugfixes as well.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@85 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 08:53:22 +00:00
abijah 4277962e3b Fixed a spelling error in the database schema
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@84 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 08:51:18 +00:00
abijah a60d69ba52 Added small script to help regenerate the database from the sitelink data
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@83 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 05:15:16 +00:00
abijah 55b896a9f0 Primarly a cleanup checkin, although a couple minor bugfixes were included as well.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@82 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 05:14:08 +00:00
abijah 9f8d4fa9b2 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@81 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 02:41:23 +00:00
abijah 4988d2717f 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@80 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 02:31:49 +00:00
abijah 136d8e845a 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@79 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 02:29:33 +00:00
abijah 190a9259d4 More changes to how accounts/ledgers/transactions are all handled.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@78 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-10 02:27:03 +00:00
abijah 374843aeee 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@77 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-08 03:32:07 +00:00
abijah 52032180f3 Fixed more ledger mixups
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@76 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-08 02:08:04 +00:00
abijah d14b715a88 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@75 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-07 17:06:17 +00:00
abijah 2a2d11ba0f Fixed bug causing payments to show up on the A/R ledger instead of the customer ledger.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@74 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-07 17:00:08 +00:00
abijah 2e07cb87a5 Probably still have some bugs to flush out, but this major overhaul of the conversion code works well enough to check in.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@73 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-07 16:23:15 +00:00
abijah bb5b563738 Removed the .bak files, since everything has now been snapshotted.
git-svn-id: file:///svn-source/pmgr/branches/ledger_transactions_20090605@72 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-06 20:23:54 +00:00
abijah f3ffa3c079 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@71 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-06 20:18:56 +00:00
abijah 30b934823c 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@70 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-06 07:57:41 +00:00
abijah 948ae28616 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@69 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-06 05:22:11 +00:00
abijah 30c6e0b0f4 Forgot to save the file before the last checkin. Added the possibility of a 'credits' table, but I'll probably be wiping this out moving forward.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@68 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-04 03:48:35 +00:00
abijah 46e3316ce1 Added some changes to try and resolve some accounting problems. However, I may be about to redo the accounting stuff altogether.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@67 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-04 01:56:09 +00:00
abijah e1671a9fca 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@66 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-04 01:54:15 +00:00
abijah e586268dee 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@65 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-03 22:33:03 +00:00
abijah 24730fda1b 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@64 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 08:39:33 +00:00
abijah b6ec85205d Added the payments controller and views.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@63 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 08:15:51 +00:00
abijah b6a0809350 Added the charges controller and views. Fixed a couple minor bugs found with receipts.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@62 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 08:05:53 +00:00
abijah f42ce65768 Changed the charge_to date to allow NULL, since not all charges cover a time period (security deposits, some late charges, POS, etc)
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@61 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 07:26:00 +00:00
abijah ef180e7dda Added a receipt controller to verify receipt data
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@60 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 07:24:51 +00:00
abijah 4aa59a40a2 Removed the test code I'd forgot and left in the table element
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@59 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 07:23:42 +00:00
abijah 0c43a0f884 Fixed copy/paste error
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@58 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 07:23:05 +00:00
abijah e65db5c759 Rolled back the last changes, which were checked in for documentation only.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@57 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 06:28:56 +00:00
abijah 59b549955e 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@56 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 06:25:59 +00:00
abijah 603a08393e 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@55 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 06:17:49 +00:00
abijah 1db887cf38 Removed the debug comments that were helping me with the sitelink migration, and added in the actual comments that were entered in sitelink.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@54 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 05:44:44 +00:00
abijah 4ebe1db2cc 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@53 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 04:36:28 +00:00
abijah f74073a2e1 Cleaned up the paginate comment remnants and added the undocumented 'extra' parameter to paginate
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@52 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 04:30:32 +00:00
abijah 3f6c526718 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@51 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 04:29:26 +00:00
abijah 903209a47e 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@50 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 04:27:34 +00:00
abijah 23a81ae924 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@49 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 02:36:26 +00:00
abijah 9db4dd737d Added some of the original formatting back into the sql log table.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@48 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 02:11:48 +00:00
abijah 52528f1c0e Minor tweak to the table headers
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@47 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-06-01 02:11:14 +00:00
abijah 6bf06a3a3c 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@46 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-31 18:27:21 +00:00
abijah 387c1ae87b 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@45 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-31 17:02:41 +00:00
abijah 70812e0a0c 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@44 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-30 20:51:07 +00:00
abijah 7fae1bcaad 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@43 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-30 20:07:24 +00:00
abijah c041174b0c 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@42 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-30 15:56:41 +00:00
abijah 2a4b8079fb 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@41 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 16:01:47 +00:00
abijah 79bcf99fc5 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@40 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 15:55:50 +00:00
abijah 9d09afca35 Minor CSS layout tweak
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@39 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 15:54:33 +00:00
abijah f384e051bf Initial working version ofa consistent layout with side menu
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@38 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 14:49:11 +00:00
abijah 2da7b6b2c0 Added a higher preference for horizontal unit names
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@37 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 06:57:22 +00:00
abijah 2c85566ffc 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@36 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 05:10:46 +00:00
abijah db03c73b59 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@35 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 04:37:24 +00:00
abijah 684f02ebc5 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@34 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 03:36:28 +00:00
abijah 4e33c58246 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@33 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 02:45:23 +00:00
abijah 9fc5562dd8 Adding mapping ability. Incomplete as of yet, but coming along nicely.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@32 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-29 01:47:12 +00:00
abijah 3cc8e95ff4 Added a name for our lone map
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@31 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 23:18:20 +00:00
abijah 15930fae30 Moved the unit status logic into the model where it belongs.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@30 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 22:09:04 +00:00
abijah dbe037fee8 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@29 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 21:52:14 +00:00
abijah 5c6189cdef 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@28 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 11:26:09 +00:00
abijah 4a86d3dda0 Removal of site_id from the maps table, corresponding with the last checkin
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@27 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 11:09:56 +00:00
abijah ec3d986c78 Removed site_id from the maps table, since the it already references site_area_id which fully qualifies the site anyway.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@26 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 11:09:19 +00:00
abijah e38e99c94e Removed the revisit code, as use of it would only screw up pagination anyway.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@25 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 09:36:58 +00:00
abijah aed2c6912c Added more models
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@24 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 09:27:29 +00:00
abijah 7433e6868c 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@23 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 09:07:53 +00:00
abijah 8393403443 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@22 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 08:04:22 +00:00
abijah ed04f81dda Modified to allow the display_name to be NULL
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@21 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 08:03:12 +00:00
abijah 4923712238 Moved the contact info into the contacts controller.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@20 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 07:12:32 +00:00
abijah ffe04ed6fd Added Lease History and security deposit tracking.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@19 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 07:05:05 +00:00
abijah 0021eb1768 Changed the charge/receipt comments slightly to help clarify the intent.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@18 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 06:42:20 +00:00
abijah 0ef51ee30f Added a Financial Accounts table, for allowing transactions to be exported to financial software (definition is presently incomplete). Rearranged the table definitions a bit as well.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@17 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 06:40:40 +00:00
abijah 28bf192853 Added phone and address models as well as outputing them to the view.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@16 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 06:31:07 +00:00
abijah df846f9963 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@15 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-28 05:49:03 +00:00
abijah f4007a0269 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@14 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 20:54:14 +00:00
abijah 6b53d8a25a Omission bug on last checkin
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@13 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 20:52:32 +00:00
abijah 76a06d1655 Further naming conventions to match CakePHP
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@12 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 20:49:54 +00:00
abijah eeb8775820 Further changes to the table naming conventions to match expectations of CakePHP
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@11 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 20:32:31 +00:00
abijah 2d9a85ad82 Changed table naming convention
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@10 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 20:25:00 +00:00
abijah 0da1080b86 Added database schema file. For the complete revision history of schema.sql, see branches/rent_manager_20090510/db path of the 'domain' repository
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@9 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 19:47:48 +00:00
abijah 2665d012c2 Added a scripts directory and the latest copy of our sitelink conversion script. For the complete revision history of sitelink2pmgr.pl, see branches/rent_manager_20090510 path of the 'domain' repository
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@8 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 19:26:04 +00:00
abijah c5d5e2c651 Removed the cache files from the repository
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@7 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 19:23:05 +00:00
abijah c22be388cf Fixed the stupid svn:ignore properties, which all had a trailing space (doh!)
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@6 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:35:43 +00:00
abijah 220284d20f Added svn:ignore for all of the tmp directories
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@5 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:24:45 +00:00
abijah 4502b73b2e Load pmgr into branches/initial_20090526/site.
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@4 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:18:23 +00:00
abijah 3251ba340d Create directories to load project into.
* branches/initial_20090526/site: New directory.


git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@3 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:18:18 +00:00
Abijah c9f9d0867b Added branch point for initial work. The site directory will be added using the svn_import script, and will represent the output of the command 'cake bake pmgr'
git-svn-id: file:///svn-source/pmgr/branches/initial_20090526@2 97e9348a-65ac-dc4b-aefc-98561f571b83
2009-05-27 04:17:45 +00:00
540 changed files with 30595 additions and 4143 deletions
+3
View File
@@ -0,0 +1,3 @@
@echo off
%~dp0\scripts\sitelink2pmgr.pl %~dp0\db\schema.sql %~dp0db\vss.mdb %*
echo Done!
+1359
View File
File diff suppressed because it is too large Load Diff
-166
View File
@@ -1,166 +0,0 @@
<?php
class Tender extends AppModel {
var $belongsTo = array(
'TenderType',
'Customer',
'LedgerEntry',
'DepositTransaction' => array(
'className' => 'Transaction',
),
'DepositLedgerEntry' => array(
'className' => 'LedgerEntry',
),
'NsfTransaction' => array(
'className' => 'Transaction',
'dependent' => true,
),
);
/**************************************************************************
**************************************************************************
**************************************************************************
* function: afterSave
* - Performs any work needed after the save occurs
*/
function afterSave($created) {
// Come up with a (not necessarily unique) name for the tender.
// For checks & money orders, this will be based on the check
// number. For other types of tender, we'll just use the
// generic name of the tender type, and the tender ID
// Determine our tender type, and set the ID of that model
$this->TenderType->id = $this->field('tender_type_id');
// REVISIT <AP>: 20090810
// The only tender expected to have no tender type
// is our special "Closing" tender.
if (empty($this->TenderType->id))
$newname = 'Closing';
else {
$newname = $this->TenderType->field('name');
$naming_field = $this->TenderType->field('naming_field');
if (!empty($naming_field))
$newname .= ' #' . $this->field($naming_field);
}
if ($newname !== $this->field('name'))
$this->saveField('name', $newname);
return parent::afterSave($created);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: beforeDelete
* - Performs any work needed before the delete occurs
*/
function beforeDelete($cascade = true) {
// REVISIT <AP>: 20090814
// Experimental, and incomplete mechanism to protect
// against trying to delete data that shouldn't be deleted.
$deposit_id = $this->field('deposit_transaction_id');
pr(compact('deposit_id'));
// If this tender has already been deposited, it would
// be a rats nest to figure out how to delete this tender.
if (!empty($deposit_id))
return false;
return parent::beforeDelete($cascade);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: verifyTender
* - Verifies consistenty of new tender data
* (not in a pre-existing tender)
*/
function verifyTender($tender) {
$this->prFunctionLevel(10);
$this->prEnter(compact('tender'));
if (empty($tender['tender_type_id'])) {
return $this->prReturn(false);
}
return $this->prReturn(true);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addTender
* - Inserts new Tender into the database
*/
function addTender($tender) {
$this->prEnter(compact('tender'));
$ret = array('data' => $tender);
if (!$this->verifyTender($tender))
return $this->prReturn(array('error' => true) + $ret);
$this->create();
if (!$this->save($tender))
return $this->prReturn(array('error' => true) + $ret);
$ret['tender_id'] = $this->id;
return $this->prReturn($ret + array('error' => false));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: nsf
* - Flags the ledger entry as having insufficient funds
*/
function nsf($id, $stamp = null, $comment = null) {
$this->prEnter(compact('id', 'stamp', 'comment'));
// Get information about this NSF item.
$this->id = $id;
$tender = $this->find
('first', array
('contain' =>
array('LedgerEntry',
'DepositTransaction',
'DepositLedgerEntry',
'NsfTransaction'),
));
$this->pr(20, compact('tender'));
if (!empty($tender['NsfTransaction']['id']))
die("Item has already been set as NSF");
if (empty($tender['DepositTransaction']['id']))
die("Item has not been deposited yet");
$tender['Transaction'] = $tender['DepositTransaction'];
unset($tender['DepositTransaction']);
unset($tender['NsfTransaction']);
$T = new Transaction();
$result = $T->addNsf($tender, $stamp, $comment);
if (empty($result['error'])) {
// Flag the tender as NSF, using the items created from addNsf
$this->id = $id;
$this->saveField('nsf_transaction_id', $result['nsf_transaction_id']);
$this->saveField('nsf_ledger_entry_id', $result['nsf_ledger_entry_id']);
}
return $this->prReturn($result);
}
}
?>
File diff suppressed because it is too large Load Diff
+68
View File
@@ -0,0 +1,68 @@
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
+29 -103
View File
@@ -38,95 +38,28 @@ class AppController extends Controller {
var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid');
var $components = array('DebugKit.Toolbar');
function __construct() {
$this->params['dev'] = false;
$this->params['admin'] = false;
parent::__construct();
}
function sideMenuLinks() {
// Stupid Cake... our constructor sets admin/dev,
// but cake stomps it somewhere along the way
// after constructing the CakeError controller.
if ($this->name === 'CakeError') {
$this->params['dev'] = false;
$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'));
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'));
}
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'));
}
return $menu;
}
function beforeFilter() {
$this->params['dev'] =
(!empty($this->params['dev_route']));
$this->params['admin'] =
(!empty($this->params['admin_route']) || !empty($this->params['dev_route']));
if (!$this->params['dev'])
Configure::write('debug', '0');
return array(
array('name' => 'Common', 'header' => true),
array('name' => 'Site Map', 'url' => array('controller' => 'maps', 'action' => 'view', 1)),
array('name' => 'Units', 'url' => array('controller' => 'units', 'action' => 'index')),
array('name' => 'Leases', 'url' => array('controller' => 'leases', 'action' => 'index')),
array('name' => 'Customers', 'url' => array('controller' => 'customers', 'action' => 'index')),
array('name' => 'Accounts', 'url' => array('controller' => 'accounts', 'action' => 'index')),
array('name' => 'Debug', 'header' => true),
array('name' => 'Un-Nuke', 'url' => '#', 'htmlAttributes' =>
array('onclick' => '$(".pr-section").show(); return false;')),
array('name' => 'Contacts', 'url' => array('controller' => 'contacts', 'action' => 'index')),
array('name' => 'Ledgers', 'url' => array('controller' => 'ledgers', 'action' => 'index')),
array('name' => 'New Ledgers', 'url' => array('controller' => 'accounts', 'action' => 'newledger')),
array('name' => 'RESET DATA', 'url' => array('controller' => 'accounts', 'action' => 'reset_data')),
);
}
function beforeRender() {
$this->set('sidemenu', $this->sideMenuLinks());
}
function redirect($url, $status = null, $exit = true) {
// OK, since the controller will not be able to
// utilize our overriden url function in AppHelper,
// we'll have to do it manually here.
App::import('Helper', 'Html');
$url = HtmlHelper::url($url, true);
if (headers_sent()) {
// If we've already sent the headers, it's because
// we're debugging, and our debug output has gotten
// out before the redirect. That's probably a good
// thing, as we don't typically want pages to be
// jerked out from under us while trying to read
// the debug output. So, since we can't redirect
// anyway, we may as well go with the flow and just
// render this page instead, using an empty template
$this->set('message',
("Intended redirect:<P><BR>" .
'<A HREF="'.$url.'">'.$url.'</A>'));
echo $this->render('/empty');
if ($exit)
$this->_stop();
}
return parent::redirect($url, $status, $exit);
}
function reset_data() {
$this->layout = null;
$this->autoLayout = false;
@@ -228,10 +161,16 @@ class AppController extends Controller {
}
function gridDataSetup(&$params) {
// Debug only if requested
$params['debug'] = !empty($this->passedArgs['debug']);
// Assume we're debugging.
// The actual grid request will set this to false
$debug = true;
if ($params['debug']) {
if (isset($this->passedArgs['debug']))
$debug = $this->passedArgs['debug'];
$params['debug'] = $debug;
if ($debug) {
ob_start();
}
else {
@@ -713,7 +652,7 @@ class AppController extends Controller {
foreach ($records AS &$record) {
// Add the calculated fields (if any), to the model fields
if (isset($record[0])) {
$record[$model_alias] = $record[0] + $record[$model_alias];
$record[$model_alias] += $record[0];
unset($record[0]);
}
}
@@ -755,12 +694,9 @@ class AppController extends Controller {
if (isset($params['post']['nolinks']))
return;
App::import('Helper', 'Html');
foreach ($links AS $table => $fields) {
$special = array('controller', 'action', 'id');
$special = array('controller', 'id');
$controller = Inflector::pluralize(Inflector::underscore($table));
$action = 'view';
$id = 'id';
extract(array_intersect_key($fields, array_flip($special)));
foreach ($records AS &$record) {
@@ -775,9 +711,9 @@ class AppController extends Controller {
//$params['linkrecord'][] = compact('table', 'field', 'id', 'controller', 'record');
$record[$table][$field] =
'<A HREF="' .
HtmlHelper::url(array('controller' => $controller,
'action' => $action,
$record[$table][$id])) .
Router::url(array('controller' => $controller,
'action' => 'view',
$record[$table][$id])) .
'">' .
$record[$table][$field] .
'</A>';
@@ -867,15 +803,5 @@ class AppController extends Controller {
echo " <cell><![CDATA[$data]]></cell>\n";
}
function INTERNAL_ERROR($msg, $depth = 0) {
INTERNAL_ERROR($msg, false, $depth+1);
$this->render_empty();
$this->_stop();
}
function render_empty() {
$this->render('/empty');
}
}
?>
-9
View File
@@ -37,14 +37,5 @@ App::import('Core', 'Helper');
* @subpackage cake.cake
*/
class AppHelper extends Helper {
function url($url = null, $full = false) {
foreach(array('admin_route', 'dev_route') AS $mod) {
if (isset($this->params[$mod]) && is_array($url) && !isset($url[$mod]))
$url[$mod] = $this->params[$mod];
}
return parent::url($url, $full);
}
}
?>
-12
View File
@@ -402,10 +402,6 @@ class AppModel extends Model {
}
function filter_null($array) {
return array_diff_key($array, array_filter($array, 'is_null'));
}
function recursive_array_replace($find, $replace, &$data) {
if (!isset($data))
return;
@@ -480,12 +476,4 @@ 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',
'action' => 'render_empty'),
array('return', 'bare' => false)
);
$this->_stop();
}
}
@@ -32,17 +32,16 @@
*
*/
function INTERNAL_ERROR($message, $exit = true, $drop = 0) {
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";
echo '<H4 style="color:#000;">This error was not caused by anything that you did wrong.' . "\n";
echo '<BR>It is a problem within the application itself and should be reported to the administrator.</H4>' . "\n";
function INTERNAL_ERROR($message) {
echo '<DIV class="internal-error" style="color:#000; background:#c22; padding:0.5em 1.5em 0.5em 1.5em;">';
echo '<H1 style="margin-bottom:0.2em">INTERNAL ERROR:</H1>';
echo '<H2 style="margin-top:0; margin-left:1.5em">' . $message . '</H2>';
echo '<H4>This error was not caused by anything that you did wrong.';
echo '<BR>It is a problem within the application itself and should be reported to the administrator.</H4>';
// Print out the entire stack trace
echo '<HR style="margin-top:1.0em; margin-bottom:0.5em;">' . "\nStack Trace:\n";
echo '<OL style="margin-left:1.5em";>' . "\n";
$trace = array_slice(debug_backtrace(false), $drop);
echo "<HR>Stack Trace:<OL>";
$trace = debug_backtrace(false);
for ($i = 0; $i < count($trace); ++$i) {
$bline = $trace[$i]['line'];
$bfile = $trace[$i]['file'];
@@ -59,16 +58,10 @@ function INTERNAL_ERROR($message, $exit = true, $drop = 0) {
echo("<LI>$bfile:$bline (" . ($bclas ? "$bclas::$bfunc" : "entry point") . ")</LI>\n");
}
echo "</OL>\n";
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 '</OL>';
echo '</DIV>';
if ($exit)
die();
die();
}
/**
+1 -19
View File
@@ -27,29 +27,11 @@
* @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('/', $default_path);
/*
* Route for admin functionality
*/
Router::connect('/admin',
array('admin_route' => true) + $default_path);
Router::connect('/admin/:controller/:action/*',
array('admin_route' => true, 'action' => null));
/*
* Route for development functionality
*/
Router::connect('/dev',
array('dev_route' => true) + $default_path);
Router::connect('/dev/:controller/:action/*',
array('dev_route' => true, 'action' => null));
Router::connect('/', array('controller' => 'maps', 'action' => 'view', '1'));
?>
@@ -12,6 +12,9 @@ class AccountsController extends AppController {
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')),
array('name' => 'Deposits', 'header' => true),
array('name' => 'Prior Deposits', 'url' => array('controller' => 'transactions', 'action' => 'deposit')),
array('name' => 'New Deposit', 'url' => array('controller' => 'tenders', 'action' => 'deposit')),
);
@@ -90,10 +93,6 @@ 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);
return $conditions;
}
@@ -143,9 +142,12 @@ class AccountsController extends AppController {
$account = $this->Account->read(null, $id);
$account = $account['Account'];
$accounts = $this->Account->collectableAccounts();
$payment_accounts = $accounts['all'];
$default_accounts = $accounts['default'];
$payment_accounts = $this->Account->collectableAccounts();
//$payment_accounts[$this->Account->nameToID('Closing')] = 'Closing';
//$payment_accounts[$this->Account->nameToID('Equity')] = 'Equity';
//$payment_accounts[$id] = 'Reversals';
$default_accounts = array_diff_key($this->Account->receiptAccounts(),
array($this->Account->concessionAccountID() => 1));
$this->set(compact('payment_accounts', 'default_accounts'));
$title = ($account['name'] . ': Collected Report');
@@ -161,6 +163,12 @@ class AccountsController extends AppController {
*/
function view($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('action'=>'index'));
}
// Get details about the account and its ledgers (no ledger entries yet)
$account = $this->Account->find
('first',
array('contain' =>
@@ -172,18 +180,14 @@ class AccountsController extends AppController {
array('CloseTransaction' => array
('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),
),
'conditions' => array(array('Account.id' => $id)),
)
);
if (empty($account)) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('action'=>'index'));
}
// Get all ledger entries of the CURRENT ledger
$entries = $this->Account->ledgerEntries($id);
//pr(compact('entries'));
$account['CurrentLedger']['LedgerEntry'] = $entries;
// Obtain stats across ALL ledgers for the summary infobox
$stats = $this->Account->stats($id, true);
@@ -201,4 +205,8 @@ class AccountsController extends AppController {
$this->set(compact('account', 'title', 'stats'));
}
function tst($id) {
//$entries = $this->Account->($id);
pr($entries);
}
}
@@ -126,6 +126,8 @@ class ContactsController extends AppController {
// Now that the work is done, let the user view the updated contact
$this->redirect(array('action'=>'view', $this->data['Contact']['id']));
//$this->render('/empty');
return;
}
if ($id) {
@@ -202,19 +202,7 @@ class CustomersController extends AppController {
));
//pr($customer);
// Determine how long this customer has been with us.
$leaseinfo = $this->Customer->find
('first', array
('link' => array('Lease' => array('fields' => array())),
'fields' => array('MIN(Lease.movein_date) AS since',
'IF(Customer.current_lease_count = 0, MAX(Lease.moveout_date), NULL) AS until'),
'conditions' => array('Customer.id' => $id),
'group' => 'Customer.id',
));
$this->set($leaseinfo[0]);
// Figure out the outstanding balances for this customer
//$this->set('stats', $this->Customer->stats($id));
$outstanding_balance = $this->Customer->balance($id);
$outstanding_deposit = $this->Customer->securityDepositBalance($id);
@@ -249,17 +237,12 @@ class CustomersController extends AppController {
/* $id)); */
/* } */
if ($show_payment || $outstanding_balance > 0)
if ($show_payment) {
$this->sidemenu_links[] =
array('name' => 'New Receipt',
array('name' => 'Payment',
'url' => array('action' => 'receipt',
$id));
if (!$show_moveout && $outstanding_balance > 0)
$this->sidemenu_links[] =
array('name' => 'Write-Off',
'url' => array('action' => 'bad_debt',
$id));
}
if ($outstanding_balance < 0)
$this->sidemenu_links[] =
@@ -287,20 +270,23 @@ class CustomersController extends AppController {
if (isset($this->params['form']['cancel'])) {
if (isset($this->data['Customer']['id']))
$this->redirect(array('action'=>'view', $this->data['Customer']['id']));
$this->redirect(array('action'=>'index'));
else
$this->redirect(array('action'=>'index'));
return;
}
// Make sure we have at least one contact
if (!isset($this->data['Contact']) || count($this->data['Contact']) == 0) {
$this->Session->setFlash("MUST SPECIFY AT LEAST ONE CONTACT", true);
$this->redirect(array('action'=>'view', $this->data['Customer']['id']));
return;
}
// Make sure there is a primary contact
if (!isset($this->data['Customer']['primary_contact_entry'])) {
$this->Session->setFlash("MUST SPECIFY A PRIMARY CONTACT", true);
$this->redirect(array('action'=>'view', $this->data['Customer']['id']));
return;
}
// Go through each customer and strip the bogus ID if new
@@ -317,46 +303,21 @@ class CustomersController extends AppController {
pr("CUSTOMER SAVE FAILED");
}
// If existing customer, then view it.
// If existing customer, then view it. Otherwise, since
// this is a new customer, go to the move in screen.
if ($this->data['Customer']['id'])
$this->redirect(array('action'=>'view', $this->Customer->id));
else
$this->redirect(array('action'=>'move_in', $this->Customer->id));
// Since this is a new customer, go to the move in screen.
$this->redirect(array('action'=>'move_in', $this->Customer->id));
// For debugging, only if the redirects above have been
// commented out, otherwise this section isn't reached.
$this->render('/empty');
return;
}
if ($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;
$this->data = $this->Customer->details($id);
$title = 'Customer: ' . $this->data['Customer']['name'] . " : Edit";
}
else {
@@ -401,9 +362,20 @@ class CustomersController extends AppController {
$this->Customer->recursive = -1;
$customer = $this->Customer->read(null, $id);
$customer = $customer['Customer'];
$unreconciled = $this->Customer->unreconciledCharges($id);
//pr($unreconciled);
$charges = $unreconciled['entries'];
$stats = $unreconciled['summary']['Charge'];
// Kludge until we update receipt to have the unpaid
// charges grid generated from a dynamic query instead
// of simply pre-providing the list of charge IDs
foreach ($charges AS &$charge)
$charge['id'] = $charge['StatementEntry']['id'];
}
else {
$customer = null;
$charges = array();
$stats = array('balance' => 0);
}
$TT = new TenderType();
@@ -412,7 +384,7 @@ class CustomersController extends AppController {
$this->set(compact('payment_types', 'default_type'));
$title = ($customer['name'] . ': Receipt Entry');
$this->set(compact('customer', 'title'));
$this->set(compact('customer', 'charges', 'stats', 'title'));
}
@@ -423,64 +395,64 @@ class CustomersController extends AppController {
* - Refunds customer charges
*/
function refund($id) {
$customer = $this->Customer->find
('first', array
function refund() {
$entries = $this->Customer->StatementEntry->find
('all', array
('contain' => false,
'conditions' => array(array('Customer.id' => $id),
'conditions' => array('StatementEntry.id' =>
//array(199,200,201)
61
),
));
if (empty($customer)) {
$this->redirect(array('action'=>'view', $id));
}
pr(compact('entries'));
// Determine the customer balance, bailing if the customer owes money
$balance = $this->Customer->balance($id);
if ($balance >= 0) {
$this->redirect(array('action'=>'view', $id));
}
// The refund will be for a positive amount
$balance *= -1;
// Get the accounts capable of paying the refund
$refundAccounts = $this->Customer->StatementEntry->Account->refundAccounts();
$defaultAccount = current($refundAccounts);
$this->set(compact('refundAccounts', 'defaultAccount'));
// Prepare to render
$title = ($customer['Customer']['name'] . ': Refund');
$this->set(compact('title', 'customer', 'balance'));
$this->render('/transactions/refund');
$this->Customer->refund($entries);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: bad_debt
* - Sets up the write-off entry page, so that the
* user can write off remaining charges of a customer.
* action: unreconciled
* - returns the list of unreconciled entries
*/
function bad_debt($id) {
$this->Customer->id = $id;
$customer = $this->Customer->find
('first', array
('contain' => false,
));
function unreconciled($id) {
// Make sure we have a valid customer to write off
if (empty($customer))
$this->redirect(array('action' => 'index'));
//$this->layout = 'ajax';
$this->layout = null;
$this->autoLayout = false;
$this->autoRender = false;
Configure::write('debug', '0');
header("Content-type: text/xml;charset=utf-8");
// Get the customer balance
$balance = $this->Customer->balance($id);
App::import('Helper', 'Xml');
$xml = new XmlHelper();
// Prepare to render
$title = ($customer['Customer']['name'] . ': Write Off Bad Debt');
$this->set(compact('title', 'customer', 'balance'));
$this->render('/transactions/bad_debt');
// Find the unreconciled entries, then manipulate the structure
// slightly to accomodate the format necessary for XML Helper.
$unreconciled = $this->Customer->unreconciledCharges($id);
foreach ($unreconciled['entries'] AS &$entry)
$entry = array_intersect_key($entry['StatementEntry'],
array('id'=>1));
$unreconciled = array('entries' =>
array('entry' => $unreconciled['entries'],
'balance' => $unreconciled['summary']['balance']));
// XML Helper will dump an empty tag if the array is empty
if (empty($unreconciled['entries']['entry']))
unset($unreconciled['entries']['entry']);
/* pr(compact('unreconciled')); */
/* echo htmlspecialchars($xml->serialize($unreconciled)); */
/* $this->render('/fake'); */
$opts = array();
//$opts['format'] = 'tags';
echo $xml->header();
echo $xml->serialize($unreconciled, $opts);
}
}
@@ -36,28 +36,6 @@ class DoubleEntriesController extends AppController {
'conditions' => array('DoubleEntry.id' => $id),
));
$entry += $this->DoubleEntry->DebitEntry->Transaction->find
('first',
array('contain' => false,
'conditions' => array('id' => $entry['DebitEntry']['transaction_id']),
));
$entry += $this->DoubleEntry->DebitEntry->find
('first',
array('contain' => array('Ledger' => array('Account')),
'conditions' => array('DebitEntry.id' => $entry['DebitEntry']['id']),
));
$entry['DebitLedger'] = $entry['Ledger'];
unset($entry['Ledger']);
$entry += $this->DoubleEntry->CreditEntry->find
('first',
array('contain' => array('Ledger' => array('Account')),
'conditions' => array('CreditEntry.id' => $entry['CreditEntry']['id']),
));
$entry['CreditLedger'] = $entry['Ledger'];
unset($entry['Ledger']);
// Prepare to render.
$title = "Double Ledger Entry #{$entry['DoubleEntry']['id']}";
$this->set(compact('entry', 'title'));
@@ -3,11 +3,10 @@
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')),
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' => 'All', 'url' => array('controller' => 'leases', 'action' => 'all')),
);
@@ -29,11 +28,10 @@ class LeasesController extends AppController {
* - Generate a listing of leases
*/
function index() { $this->all(); }
function active() { $this->gridView('Active Leases'); }
function delinquent() { $this->gridView('Delinquent Leases'); }
function closed() { $this->gridView('Closed Leases'); }
function all() { $this->gridView('All Leases', 'all'); }
function index() { $this->all(); }
function active() { $this->gridView('Active Leases'); }
function closed() { $this->gridView('Closed Leases'); }
function all() { $this->gridView('All Leases', 'all'); }
/**************************************************************************
@@ -65,8 +63,6 @@ class LeasesController extends AppController {
function gridDataFields(&$params, &$model) {
$fields = parent::gridDataFields($params, $model);
$fields[] = ("IF(" . $this->Lease->conditionDelinquent() . "," .
" 'DELINQUENT', 'CURRENT') AS 'status'");
return array_merge($fields,
$this->Lease->StatementEntry->chargeDisbursementFields(true));
}
@@ -77,9 +73,6 @@ class LeasesController extends AppController {
if ($params['action'] === 'active') {
$conditions[] = 'Lease.close_date IS NULL';
}
elseif ($params['action'] === 'delinquent') {
$conditions[] = $this->Lease->conditionDelinquent();
}
elseif ($params['action'] === 'closed') {
$conditions[] = 'Lease.close_date IS NOT NULL';
}
@@ -142,22 +135,21 @@ class LeasesController extends AppController {
// Handle the move in based on the data given
//pr(array('Move-in data', $this->data));
foreach (array('deposit', 'rent') AS $currency) {
$this->data['Lease'][$currency]
= str_replace('$', '', $this->data['Lease'][$currency]);
}
$lid = $this->Lease->moveIn($this->data['Lease']['customer_id'],
$this->data['Lease']['unit_id'],
$this->data['Lease']['deposit'],
$this->data['Lease']['rent'],
null, null,
$this->data['Lease']['movein_date'],
$this->data['Lease']['comment']
);
// Since this is a new lease, go to the invoice
// screen so we can start assessing charges.
$this->redirect(array('action'=>'invoice', $lid, 'move-in'));
$this->redirect(array('action'=>'invoice', $lid));
// For debugging, only if the redirect above have been
// commented out, otherwise this section isn't reached.
$this->render('/empty');
}
/**************************************************************************
@@ -174,7 +166,9 @@ class LeasesController extends AppController {
$this->Lease->moveOut($this->data['Lease']['id'],
'VACANT',
$this->data['Lease']['moveout_date']
$this->data['Lease']['moveout_date'],
//true // Close this lease, if able
false
);
$this->redirect($this->data['redirect']);
@@ -227,6 +221,8 @@ class LeasesController extends AppController {
/* function promote_surplus($id) { */
/* $this->Lease->promoteSurplus($id); */
/* pr("PREVENTING REDIRECT"); */
/* $this->render('fake'); */
/* $this->redirect(array('controller' => 'leases', */
/* 'action' => 'view', */
/* $id)); */
@@ -277,7 +273,6 @@ class LeasesController extends AppController {
$lease['Unit']['name'] . ': ' .
$lease['Customer']['name'] . ': Refund');
$this->set(compact('title', 'lease', 'balance'));
$this->render('/transactions/refund');
}
@@ -290,7 +285,6 @@ class LeasesController extends AppController {
*/
function bad_debt($id) {
$this->Lease->id = $id;
$lease = $this->Lease->find
('first', array
('contain' => array
@@ -298,14 +292,20 @@ class LeasesController extends AppController {
'Unit' => array('fields' => array('id', 'name')),
'Customer' => array('fields' => array('id', 'name')),
),
'conditions' => array(array('Lease.id' => $id),
// Make sure lease is not closed...
array('Lease.close_date' => null),
),
));
// Make sure we have a valid lease to write off
if (empty($lease))
$this->redirect(array('action' => 'view', $id));
// Get the lease balance
$balance = $this->Lease->balance($id);
// Get the lease balance, part of lease stats
$stats = $this->Lease->stats($id);
$balance = $stats['balance'];
// Prepare to render
$title = ('Lease #' . $lease['Lease']['number'] . ': ' .
@@ -323,23 +323,9 @@ class LeasesController extends AppController {
* - Closes a lease to any further action
*/
// REVISIT <AP>: 20090809
// While cleaning up the sitelink data, then delete reldep()
function reldep($id) {
$this->Lease->id = $id;
$stamp = $this->Lease->field('moveout_date');
$this->Lease->releaseSecurityDeposits($id, $stamp);
$this->redirect(array('action'=>'view', $id));
}
function close($id) {
// REVISIT <AP>: 20090708
// We should probably seek confirmation first...
if (!$this->Lease->closeable($id)) {
$this->INTERNAL_ERROR("This lease is not ready to close");
$this->redirect(array('action'=>'view', $id));
}
$this->Lease->close($id);
$this->redirect(array('action'=>'view', $id));
}
@@ -376,30 +362,13 @@ class LeasesController extends AppController {
$A = new Account();
$charge_accounts = $A->invoiceAccounts();
$default_account = $A->rentAccountID();
$rent_account = $A->rentAccountID();
$security_deposit_account = $A->securityDepositAccountID();
$this->set(compact('charge_accounts', 'default_account',
'rent_account', 'security_deposit_account'));
$this->set(compact('charge_accounts', 'default_account'));
// REVISIT <AP> 20090705:
// Of course, the late charge should come from the late_schedule
$default_rent = $lease['Lease']['rent'];
$default_late = 10;
$this->set(compact('default_late'));
if ($type === 'move-in') {
$movein = array();
$movein['time'] = strtotime($lease['Lease']['movein_date']);
$movein['effective_time'] = strtotime($lease['Lease']['movein_date']);
$movein_date = getdate($movein['effective_time']);
$movein['through_time'] = mktime(0, 0, 0, $movein_date['mon'] + 1, 0, $movein_date['year']);
$days_in_month = idate('d', $movein['through_time']);
$movein['prorated_days'] = $days_in_month - $movein_date['mday'] + 1;
$movein['prorated_rent'] = $lease['Lease']['rent'] * $movein['prorated_days'] / $days_in_month;
$movein['prorated'] = $movein['prorated_days'] != $days_in_month;
$movein['deposit'] = $lease['Lease']['deposit'];
$this->set(compact('movein'));
}
$this->set(compact('default_rent', 'default_late'));
$title = ('Lease #' . $lease['Lease']['number'] . ': ' .
$lease['Unit']['name'] . ': ' .
@@ -408,27 +377,6 @@ class LeasesController extends AppController {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: assess_rent/late
* - Assesses the new monthly rent/late charge, if need be
*/
function assess_rent($date = null) {
$this->Lease->assessMonthlyRentAll($date);
$this->redirect(array('action'=>'index'));
}
function assess_late($date = null) {
$this->Lease->assessMonthlyLateAll($date);
$this->redirect(array('action'=>'index'));
}
function assess_all($date = null) {
$this->Lease->assessMonthlyRentAll($date);
$this->Lease->assessMonthlyLateAll($date);
$this->redirect(array('action'=>'index'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -447,26 +395,26 @@ class LeasesController extends AppController {
('first',
array('contain' =>
array(// Models
'LeaseType(id,name)',
'Unit(id,name)',
'Customer(id,name)',
'LeaseType',
'Unit',
'Customer',
),
'fields' => array('Lease.*', $this->Lease->delinquentField()),
'conditions' => array(array('Lease.id' => $id)),
)
);
$lease['Lease'] += $lease[0];
unset($lease[0]);
// Figure out the outstanding balances for this lease
$lease['Lease']['paid_through'] = $this->Lease->rentPaidThrough($id);
$this->set('charge_gaps', $this->Lease->rentChargeGaps($id));
$this->set('charge_through', $this->Lease->rentChargeThrough($id));
// Figure out the outstanding balances for this lease
$outstanding_balance = $this->Lease->balance($id);
$outstanding_deposit = $this->Lease->securityDepositBalance($id);
// Set up dynamic menu items. Normally, these will only be present
// on an open lease, but it's possible for a lease to be closed, and
// 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) {
// Set up dynamic menu items
if (!isset($lease['Lease']['close_date'])) {
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
@@ -475,34 +423,24 @@ class LeasesController extends AppController {
array('name' => 'Move-Out', 'url' => array('action' => 'move_out',
$id));
if (!isset($lease['Lease']['close_date']))
$this->sidemenu_links[] =
array('name' => 'New Invoice', 'url' => array('action' => 'invoice',
$id));
$this->sidemenu_links[] =
array('name' => 'Charges', 'url' => array('action' => 'invoice',
$id));
$this->sidemenu_links[] =
array('name' => 'New Receipt', 'url' => array('controller' => 'customers',
'action' => 'receipt',
$lease['Customer']['id']));
array('name' => 'Payments', '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)); */
// REVISIT <AP>:
// Not allowing refund to be issued from the lease, as
// in fact, we should never have a positive lease balance.
// I'll flag this at the moment, since we might get one
// when a charge is reimbursed; a bug that we'll either
// need to fix, or we'll have to revisit this assumption.
if ($outstanding_balance < 0)
$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->sidemenu_links[] =
array('name' => 'Issue Refund',
'url' => array('action' => 'refund', $id));
if (isset($lease['Lease']['moveout_date']) && $outstanding_balance > 0)
$this->sidemenu_links[] =
@@ -145,6 +145,12 @@ class LedgerEntriesController extends AppController {
*/
function view($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('controller' => 'accounts', 'action'=>'index'));
}
// Get the Entry and related fields
$entry = $this->LedgerEntry->find
('first',
array('contain' => array
@@ -157,10 +163,6 @@ class LedgerEntriesController extends AppController {
array('fields' => array('id', 'sequence', 'name'),
'Account' =>
array('fields' => array('id', 'name', 'type'),
'conditions' =>
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('Account.level >=' => 5),
),
),
@@ -168,9 +170,6 @@ class LedgerEntriesController extends AppController {
array('fields' => array('id', 'name'),
),
'DebitDoubleEntry' => array('id'),
'CreditDoubleEntry' => array('id'),
'DebitEntry' => array('fields' => array('id', 'crdr')),
'CreditEntry' => array('fields' => array('id', 'crdr')),
),
@@ -178,11 +177,6 @@ class LedgerEntriesController extends AppController {
'conditions' => array('LedgerEntry.id' => $id),
));
if (empty($entry) || empty($entry['Ledger']['Account'])) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('controller' => 'accounts', 'action'=>'index'));
}
if (!empty($entry['DebitEntry']) && !empty($entry['CreditEntry']))
die("LedgerEntry has both a matching DebitEntry and CreditEntry");
if (empty($entry['DebitEntry']) && empty($entry['CreditEntry']))
@@ -197,18 +191,6 @@ class LedgerEntriesController extends AppController {
else
$entry['MatchingEntry'] = $entry['DebitEntry'][0];
if (empty($entry['DebitDoubleEntry']['id']))
$entry['DoubleEntry'] = $entry['CreditDoubleEntry'];
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'));
@@ -50,21 +50,24 @@ class LedgersController extends AppController {
}
function gridDataCountTables(&$params, &$model) {
// Our count should NOT include anything extra,
// so we need the virtual function to prevent
// the base class from just calling our
// gridDataTables function.
return parent::gridDataTables($params, $model);
}
function gridDataTables(&$params, &$model) {
return array
('link' =>
array(// Models
'Account',
'LedgerEntry',
'CloseTransaction',
),
);
}
function gridDataTables(&$params, &$model) {
$tables = $this->gridDataCountTables($params, $model);
$tables['link'][] = 'LedgerEntry';
$tables['link'][] = 'CloseTransaction';
return $tables;
}
function gridDataFields(&$params, &$model) {
$fields = parent::gridDataFields($params, $model);
$fields[] = 'CONCAT(Account.id, "-", Ledger.sequence) AS id_sequence';
@@ -82,10 +85,6 @@ 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);
return $conditions;
}
@@ -120,25 +119,22 @@ class LedgersController extends AppController {
*/
function view($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('action'=>'index'));
}
// Get details about the ledger itself (no entries yet)
$ledger = $this->Ledger->find
('first',
array('contain' =>
array(// Models
'Account',
),
'conditions' => array(array('Ledger.id' => $id),
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('Account.level >=' => 10),
),
'conditions' => array(array('Ledger.id' => $id)),
)
);
if (empty($ledger)) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('action'=>'index'));
}
// Get ledger stats for our summary box
$stats = $this->Ledger->stats($id);
@@ -85,35 +85,11 @@ class MapsController extends AppController {
'units' => array());
// Find all of the map/unit information from this SiteArea
$map = $this->Map->find('first', array('contain' => false,
'conditions' => array('id' => $id)));
$units = $this->Map->Unit->find
('all',
array('link' =>
array('Map' =>
array('fields' => array()),
'CurrentLease' =>
array('fields' => array('id', 'paid_through_date',
$this->Map->Unit->CurrentLease->
delinquentField('CurrentLease')),
'Customer'),
'UnitSize' =>
array('fields' => array('id', 'depth', 'width',
'MapsUnit.pt_top',
'MapsUnit.pt_left',
'MapsUnit.transpose')),
),
'fields' => array('id', 'name', 'status'),
'conditions' => array('Map.id' => $id),
));
/* pr(compact('map', 'units')); */
/* $this->render('/empty'); */
/* return; */
$this->Map->recursive = 2;
$this->Map->SiteArea->unbindModel(array('hasOne' => array('Map')));
$map = $this->Map->read(null, $id);
//pr($map);
/*****
* The preference would be to leave all things "screen" related
* to reside in the view. However, two separate views need this
@@ -137,7 +113,7 @@ class MapsController extends AppController {
$info['depth'] = $bottom * $screen_adjustment_factor;
// Go through each unit in the map, calculating the map location
foreach ($units AS $unit) {
foreach ($map['Unit'] AS $unit) {
$lft = $unit['MapsUnit']['pt_left'] + $boundary_adjustment;
$top = $unit['MapsUnit']['pt_top'] + $boundary_adjustment;
@@ -156,9 +132,10 @@ class MapsController extends AppController {
$width *= $screen_adjustment_factor;
$depth *= $screen_adjustment_factor;
//$info['units'][$unit['id']] =
$info['units'][] =
array( 'id' => $unit['Unit']['id'],
'name' => $unit['Unit']['name'],
array( 'id' => $unit['id'],
'name' => $unit['name'],
'left' => $lft,
'right' => $lft + $width,
'top' => $top,
@@ -166,15 +143,11 @@ class MapsController extends AppController {
'width' => $width,
'depth' => $depth,
'n-s' => $unit['MapsUnit']['transpose'] ? 0 : 1,
'status' => (($unit['Unit']['status'] === 'OCCUPIED' &&
!empty($unit[0]['delinquent']))
? 'LATE' : $unit['Unit']['status']),
'data' => $unit,
'status' => $unit['status']
);
}
/* pr($info); */
/* $this->render('/empty'); exit(); */
//pr($info);
return $info;
}
@@ -187,10 +160,8 @@ class MapsController extends AppController {
*/
function legend($id = null, $requested_width = 400) {
$status = array_keys($this->Map->Unit->activeStatusEnums());
$occupied_key = array_search('OCCUPIED', $status);
array_splice($status, $occupied_key+1, 0, array('LATE'));
$status = $this->Map->Unit->activeStatusEnums();
//pr($status);
$rows = 2;
$cols = (int)((count($status) + $rows - 1) / $rows);
@@ -220,7 +191,7 @@ class MapsController extends AppController {
$item_width *= $screen_adjustment_factor;
$item_depth *= $screen_adjustment_factor;
foreach ($status AS $code) {
foreach ($status AS $code => $value) {
$info['units'][] = array('name' => $code,
'status' => $code,
'width' => $item_width,
@@ -270,9 +241,9 @@ class MapsController extends AppController {
$info['palate']['unit']['DIRTY']['bg'] = array('red' => 128, 'green' => 192, 'blue' => 192);
$info['palate']['unit']['VACANT']['bg'] = array('red' => 0, 'green' => 255, 'blue' => 128);
$info['palate']['unit']['OCCUPIED']['bg'] = array('red' => 0, 'green' => 128, 'blue' => 255);
$info['palate']['unit']['LATE']['bg'] = array('red' => 255, 'green' => 192, 'blue' => 192);
$info['palate']['unit']['LOCKED']['bg'] = array('red' => 255, 'green' => 64, 'blue' => 64);
$info['palate']['unit']['LIENED']['bg'] = array('red' => 255, 'green' => 0, 'blue' => 128);
$info['palate']['unit']['LATE']['bg'] = array('red' => 255, 'green' => 64, 'blue' => 64);
$info['palate']['unit']['LOCKED']['bg'] = array('red' => 255, 'green' => 128, 'blue' => 128);
$info['palate']['unit']['LIENED']['bg'] = array('red' => 255, 'green' => 192, 'blue' => 192);
// Determine text color to go with each background
foreach ($info['palate']['unit'] AS &$code) {
@@ -35,7 +35,7 @@ class StatementEntriesController extends AppController {
* to jqGrid.
*/
function gridDataCountTables(&$params, &$model) {
function gridDataTables(&$params, &$model) {
$link =
array(// Models
'Transaction' =>
@@ -58,26 +58,27 @@ class StatementEntriesController extends AppController {
),
);
if (!empty($params['post']['custom']['statement_entry_id'])) {
$link['ChargeEntry'] = array();
$link['DisbursementEntry'] = array();
if (isset($params['post']['custom']['statement_entry_id'])) {
$link['DisbursementEntry'] = array();
$link['ChargeEntry'] = array();
}
/* if ($params['action'] === 'collected') { */
/* $link['DisbursementEntry'] = array('Receipt' => array('class' => 'Transaction')); */
/* $link['ChargeEntry'] = array('Invoice' => array('class' => 'Transaction')); */
/* } */
/* if (count(array_intersect($params['fields'], array('applied'))) == 1) { */
/* $link['DisbursementEntry'] = array(); */
/* $link['ChargeEntry'] = array(); */
/* } */
/* elseif (isset($params['post']['custom']['customer_id']) || isset($params['post']['custom']['lease_id'])) { */
/* $link['DisbursementEntry'] = array(); */
/* } */
return array('link' => $link);
}
function gridDataTables(&$params, &$model) {
$tables = $this->gridDataCountTables($params, $model);
if (in_array('applied', $params['post']['fields'])) {
$tables['link'] +=
array('ChargeEntry' => array(),
'DisbursementEntry' => array());
}
return $tables;
}
function gridDataFields(&$params, &$model) {
$fields = parent::gridDataFields($params, $model);
@@ -86,13 +87,11 @@ class StatementEntriesController extends AppController {
" SUM(COALESCE(DisbursementEntry.amount,0))," .
" SUM(COALESCE(ChargeEntry.amount,0)))" .
" AS 'applied'");
}
if (in_array('unapplied', $params['post']['fields'])) {
$fields[] = ("StatementEntry.amount - (" .
"IF(StatementEntry.type = 'CHARGE'," .
" SUM(COALESCE(DisbursementEntry.amount,0))," .
" SUM(COALESCE(ChargeEntry.amount,0)))" .
") AS 'unapplied'");
") AS 'balance'");
}
$fields = array_merge($fields,
@@ -118,27 +117,12 @@ class StatementEntriesController extends AppController {
if (isset($account_id))
$conditions[] = array('StatementEntry.account_id' => $account_id);
if (isset($customer_id))
$conditions[] = array('StatementEntry.customer_id' => $customer_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;
}
@@ -167,26 +151,26 @@ class StatementEntriesController extends AppController {
}
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'", */
if (in_array('applied', $params['post']['fields'])) {
$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'", */
/* ); */
"StatementEntry.amount - (" .
"IF(StatementEntry.type = 'CHARGE'," .
" SUM(COALESCE(DisbursementEntry.amount,0))," .
" SUM(COALESCE(ChargeEntry.amount,0)))" .
") AS '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') {
//pr(compact('tquery'));
$total = $model->find('first', $tquery);
$params['userdata']['total'] = $total[0]['applied'];
$params['userdata']['balance'] = $total[0]['balance'];
}
else {
$tquery = array_diff_key($query, array('fields'=>1,'group'=>1,'limit'=>1,'order'=>1));
$tquery['fields'] = array("SUM(COALESCE(StatementEntry.amount,0)) AS 'total'");
$total = $model->find('first', $tquery);
@@ -203,42 +187,10 @@ class StatementEntriesController extends AppController {
* action: reverse the ledger entry
*/
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'));
function reverse($id) {
$this->StatementEntry->reverse($id);
$this->render('/FAKE');
$this->redirect(array('action'=>'view', $id));
}
@@ -262,6 +214,12 @@ class StatementEntriesController extends AppController {
*/
function view($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('controller' => 'accounts', 'action'=>'index'));
}
// Get the StatementEntry and related fields
$entry = $this->StatementEntry->find
('first',
array('contain' => array
@@ -271,17 +229,10 @@ class StatementEntriesController extends AppController {
'Lease' => array('fields' => array('id')),
),
'conditions' => array(array('StatementEntry.id' => $id),
// REVISIT <AP>: 20090811
// No security issues have been worked out yet
array('Account.level >=' => 5)
),
'conditions' => array('StatementEntry.id' => $id),
));
if (empty($entry)) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('controller' => 'accounts', 'action'=>'index'));
}
$reconciled = $this->StatementEntry->reconciledEntries($id);
$stats = $this->StatementEntry->stats($id);
@@ -293,14 +244,19 @@ class StatementEntriesController extends AppController {
if (strtoupper($entry['StatementEntry']['type']) === 'CHARGE') {
$reversable = $this->StatementEntry->reversable($id);
$reversal = $this->StatementEntry->find
('first',
array('link' => array('DisbursementEntry'),
'conditions' => array(array('StatementEntry.id' => $id),
array('DisbursementEntry.type' => 'REVERSAL')),
));
// Set up dynamic menu items
if ($reversable || $stats['balance'] > 0)
if (empty($reversal) || $stats['balance'] > 0)
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
if ($reversable)
if (empty($reversal))
$this->sidemenu_links[] =
array('name' => 'Reverse',
'url' => array('action' => 'reverse',
@@ -315,7 +271,7 @@ class StatementEntriesController extends AppController {
// Prepare to render.
$title = "Statement Entry #{$entry['StatementEntry']['id']}";
$this->set(compact('entry', 'title', 'stats'));
$this->set(compact('entry', 'title', 'reconciled', 'stats'));
}
}
@@ -115,33 +115,15 @@ class TendersController extends AppController {
*/
function nsf($id = null) {
if ($this->data) {
$result = $this->Tender->nsf
($this->data['Tender']['id'],
$this->data['Transaction']['stamp'],
$this->data['Transaction']['comment']);
$this->redirect(array('controller' => 'tenders',
'action' => 'view',
$this->data['Tender']['id']));
}
if (!$id) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('action'=>'index'));
}
$this->Tender->id = $id;
$tender = $this->Tender->find
('first', array
('contain' => array('Customer', 'LedgerEntry' => array('Transaction')),
));
// Prepare to render.
$title = "Tender #{$tender['Tender']['id']} : {$tender['Tender']['name']} : NSF";
$this->set(compact('tender', 'title'));
$this->Tender->nsf($id);
$this->redirect(array('action'=>'view', $id));
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -156,31 +138,22 @@ class TendersController extends AppController {
}
// Get the Tender and related fields
$this->Tender->id = $id;
$tender = $this->Tender->find
('first', array
('contain' => array('TenderType', 'Customer', 'LedgerEntry' => array('Transaction')),
));
// 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.
// For now, assume iff it is a named item, it can be NSF.
// (or if we're in development mode)
&& (!empty($tender['TenderType']['data1_name']) || !empty($this->params['dev']))
&& !empty($tender['TenderType']['data1_name'])
) {
// Set up dynamic menu items
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
$this->sidemenu_links[] =
array('name' => 'NSF',
'url' => array('action' => 'nsf',
@@ -188,71 +161,7 @@ class TendersController extends AppController {
}
// Prepare to render.
$title = "Tender #{$tender['Tender']['id']} : {$tender['Tender']['name']}";
$title = "Tender #{$tender['Tender']['id']}";
$this->set(compact('tender', 'title'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: edit
* - Edit tender information
*/
function edit($id = null) {
if (isset($this->data)) {
// Check to see if the operation was cancelled.
if (isset($this->params['form']['cancel'])) {
if (empty($this->data['Tender']['id']))
$this->redirect(array('action'=>'index'));
$this->redirect(array('action'=>'view', $this->data['Tender']['id']));
}
// Make sure we have tender data
if (empty($this->data['Tender']) || empty($this->data['Tender']['id']))
$this->redirect(array('action'=>'index'));
// Figure out which tender type was chosen
// REVISIT <AP>: 20090810; Not ready to change tender type
// $tender_type_id = $this->data['Tender']['tender_type_id'];
$tender_type_id = $this->Tender->field('tender_type_id');
if (empty($tender_type_id))
$this->redirect(array('action'=>'view', $this->data['Tender']['id']));
// Get data fields from the selected tender type
$this->data['Tender'] += $this->data['type'][$tender_type_id];
unset($this->data['type']);
// Save the tender and all associated data
$this->Tender->create();
$this->Tender->id = $this->data['Tender']['id'];
if (!$this->Tender->save($this->data, false)) {
$this->Session->setFlash("TENDER SAVE FAILED", true);
pr("TENDER SAVE FAILED");
}
$this->redirect(array('action'=>'view', $this->Tender->id));
}
if ($id) {
$this->data = $this->Tender->findById($id);
} else {
$this->redirect(array('action'=>'index'));
}
$tender_types = $this->Tender->TenderType->find
('list', array('order' => array('name')));
$this->set(compact('tender_types'));
$types = $this->Tender->TenderType->find('all', array('contain' => false));
$this->set(compact('types'));
// Prepare to render.
$title = ('Tender #' . $this->data['Tender']['id'] .
' : ' . $this->data['Tender']['name'] .
" : Edit");
$this->set(compact('title'));
}
}
@@ -35,13 +35,7 @@ class TransactionsController extends AppController {
function all() { $this->gridView('All Transactions', 'all'); }
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->gridView('Deposits');
}
function deposit() { $this->gridView('Deposits'); }
/**************************************************************************
@@ -54,12 +48,7 @@ class TransactionsController extends AppController {
*/
function gridDataCountTables(&$params, &$model) {
return array
('link' =>
array(// Models
'Account' => array('fields' => array()),
),
);
return parent::gridDataTables($params, $model);
}
function gridDataTables(&$params, &$model) {
@@ -84,16 +73,11 @@ 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['Transaction'] = array('id');
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}
@@ -291,6 +275,9 @@ class TransactionsController extends AppController {
}
$data = $this->data;
$data['Entry'][0]['account_id'] =
$this->Transaction->Account->badDebtAccountID();
if (empty($data['Customer']['id']))
$data['Customer']['id'] = null;
if (empty($data['Lease']['id']))
@@ -298,9 +285,9 @@ class TransactionsController extends AppController {
pr(compact('data'));
if (!$this->Transaction->addWriteOff($data,
$data['Customer']['id'],
$data['Lease']['id'])) {
if (!$this->Transaction->addReceipt($data,
$data['Customer']['id'],
$data['Lease']['id'])) {
$this->Session->setFlash("WRITE OFF FAILED", true);
// REVISIT <AP> 20090706:
// Until we can work out the session problems,
@@ -308,6 +295,8 @@ class TransactionsController extends AppController {
die("<H1>WRITE-OFF FAILED</H1>");
}
$this->render('/fake');
// Return to viewing the lease/customer
if (empty($data['Lease']['id']))
$this->redirect(array('controller' => 'customers',
@@ -349,6 +338,8 @@ class TransactionsController extends AppController {
die("<H1>REFUND FAILED</H1>");
}
$this->render('/fake');
// Return to viewing the lease/customer
if (empty($data['Lease']['id']))
$this->redirect(array('controller' => 'customers',
@@ -361,21 +352,6 @@ class TransactionsController extends AppController {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: destroy
* - Deletes a transaction and associated entries
* - !!WARNING!! This should be used with EXTREME caution, as it
* irreversibly destroys the data. It is not for normal use.
*/
function destroy($id = null) {
$this->Transaction->destroy($id);
//$this->redirect(array('action' => 'index'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -384,45 +360,33 @@ class TransactionsController extends AppController {
*/
function view($id = null) {
$transaction = $this->Transaction->find
('first',
array('contain' =>
array(// Models
'Account(id,name)',
'Ledger(id,name)',
'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)) {
if (!$id) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('action'=>'index'));
}
if ($transaction['Transaction']['type'] === 'DEPOSIT' || $this->params['dev']) {
$transaction = $this->Transaction->find
('first',
array('contain' =>
array(// Models
'Account' =>
array('fields' => array('Account.id',
'Account.name'),
),
'Ledger' =>
array('fields' => array('Ledger.id',
'Ledger.name'),
),
),
'conditions' => array('Transaction.id' => $id),
));
if ($transaction['Transaction']['type'] === 'DEPOSIT') {
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
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?"));
$this->sidemenu_links[] =
array('name' => 'View Slip', 'url' => array('action' => 'deposit_slip', $id));
}
// OK, prepare to render.
@@ -475,12 +439,15 @@ class TransactionsController extends AppController {
$type['TenderType'] + $type[0];
}
$deposit_total = 0;
foreach ($deposit['types'] AS $type)
$deposit_total += $type['total'];
if ($deposit['Transaction']['amount'] != $deposit_total)
$this->INTERNAL_ERROR("Deposit items do not add up to deposit slip total");
// For each form of tender in the deposit, get the deposit items
/* foreach ($deposit['types'] AS $type_id => &$type) { */
/* $type['entries'] = $this->Transaction->DepositTender->find */
/* ('all', */
/* array('contain' => array('Customer', 'LedgerEntry'), */
/* 'conditions' => array(array('DepositTender.deposit_transaction_id' => $id), */
/* array('DepositTender.tender_type_id' => $type_id)), */
/* )); */
/* } */
$this->sidemenu_links[] =
array('name' => 'Operations', 'header' => true);
@@ -245,24 +245,22 @@ class UnitsController extends AppController {
$this->sidemenu_links[] =
array('name' => 'Move-Out', 'url' => array('action' => 'move_out',
$id));
} elseif ($this->Unit->available($unit['Unit']['status'])) {
} else {
$this->sidemenu_links[] =
array('name' => 'Move-In', 'url' => array('action' => 'move_in',
$id));
} 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']));
array('name' => 'Charge', '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']));
array('name' => 'Payment', 'url' => array('controller' => 'customers',
'action' => 'receipt',
$unit['CurrentLease']['customer_id']));
}
// Prepare to render.
@@ -307,6 +305,11 @@ class UnitsController extends AppController {
}
$this->redirect(array('action'=>'view', $this->Unit->id));
// For debugging, only if the redirects above have been
// commented out, otherwise this section isn't reached.
$this->render('/fake');
return;
}
if ($id) {
View File
+19 -54
View File
@@ -121,42 +121,24 @@ class Account extends AppModel {
* - Returns the ID of the desired account
*/
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->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 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 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
// quickly be spotted how much is _really_ due, vs
// how much has been pre-paid. Customer credits in
// A/R is not as clear, although a report is an
// obvious solution.
//'A/R'
'Credit'
); }
/**************************************************************************
**************************************************************************
@@ -240,28 +222,12 @@ class Account extends AppModel {
function collectableAccounts() {
$accounts = $this->receiptAccounts();
foreach(array($this->customerCreditAccountID(),
$this->securityDepositAccountID(),
$this->nsfAccountID(),
$this->waiverAccountID(),
$this->badDebtAccountID(),
//$this->lookup('Closing'),
//$this->lookup('Equity'),
)
foreach(array($this->nsfAccountID(),
$this->securityDepositAccountID())
AS $account_id) {
$accounts[$account_id] = $this->name($account_id);
}
$accounts['all'] = $accounts['default'] = $accounts;
foreach(array($this->concessionAccountID(),
$this->waiverAccountID(),
$this->badDebtAccountID(),
)
AS $account_id) {
unset($accounts['default'][$account_id]);
}
return $accounts;
}
@@ -377,7 +343,6 @@ class Account extends AppModel {
$this->queryInit($query);
$query['link'] = array('Account' => $query['link']);
$stats = array();
foreach ($this->ledgers($id, $all) AS $ledger)
$this->statsMerge($stats['Ledger'],
$this->Ledger->stats($ledger, $query));
@@ -101,35 +101,12 @@ class Customer extends AppModel {
$this->prEnter(compact('id', 'query'));
$this->queryInit($query);
$sd_account_id =
$this->StatementEntry->Account->securityDepositAccountID();
$query['conditions'][] = array('StatementEntry.customer_id' => $id);
$query['conditions'][] = array('StatementEntry.account_id' =>
$this->StatementEntry->Account->securityDepositAccountID());
$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']);
$stats = $this->StatementEntry->stats(null, $query);
return $this->prReturn($stats['account_balance']);
}
@@ -165,8 +142,10 @@ class Customer extends AppModel {
continue;
$I = new Contact();
if (!$I->saveContact(null, array('Contact' => $contact)))
$I->create();
if (!$I->save($contact, false)) {
return false;
}
$contact['id'] = $I->id;
}
@@ -224,52 +203,6 @@ class Customer extends AppModel {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: update
* - Update any cached or calculated fields
*/
function update($id) {
$this->prEnter(compact('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;
}
// REVISIT <AP>: 20090812
// updateLeaseCount is handled directly when needed.
// Should we simplify by just doing it anyway?
//$this->updateLeaseCount($id);
$current_leases =
$this->find('all',
// 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) {
if (!empty($lease['CurrentLease']['id']))
$this->Lease->update($lease['CurrentLease']['id']);
if (!empty($lease['Lease']['id']))
$this->Lease->update($lease['Lease']['id']);
}
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -53,27 +53,12 @@ class DoubleEntry extends AppModel {
*/
function addDoubleEntry($entry1, $entry2, $entry1_tender = null) {
//$this->prFunctionLevel(16);
$this->prEnter(compact('entry1', 'entry2', 'entry1_tender'));
/* pr(array('DoubleEntry::addDoubleEntry' => */
/* compact('entry1', 'entry2', 'entry1_tender'))); */
$ret = array();
if (!$this->verifyDoubleEntry($entry1, $entry2, $entry1_tender))
return $this->prReturn(array('error' => true) + $ret);
// Handle the case where a double entry involves the same
// exact ledger. This would not serve any useful purpose.
// It is not, however, an error. It is semantically correct
// just not really logically correct. To make this easier,
// just ensure ledger_id is set for each entry, even though
// it would be handled later by the LedgerEntry model.
//array($entry1, $entry2) AS &$entry) {
for ($i=1; $i <= 2; ++$i) {
if (empty(${'entry'.$i}['ledger_id']))
${'entry'.$i}['ledger_id'] =
$this->DebitEntry->Account->currentLedgerID(${'entry'.$i}['account_id']);
}
if ($entry1['ledger_id'] == $entry2['ledger_id'])
return $this->prReturn(array('error' => false));
return array('error' => true) + $ret;
// Since this model only relates to DebitEntry and CreditEntry...
$LE = new LedgerEntry();
@@ -82,13 +67,13 @@ class DoubleEntry extends AppModel {
$result = $LE->addLedgerEntry($entry1, $entry1_tender);
$ret['Entry1'] = $result;
if ($result['error'])
return $this->prReturn(array('error' => true) + $ret);
return array('error' => true) + $ret;
// Add the second ledger entry to the database
$result = $LE->addLedgerEntry($entry2);
$ret['Entry2'] = $result;
if ($result['error'])
return $this->prReturn(array('error' => true) + $ret);
return array('error' => true) + $ret;
// Now link them as a double entry
$double_entry = array();
@@ -97,13 +82,15 @@ class DoubleEntry extends AppModel {
$double_entry['credit_entry_id'] =
($entry1['crdr'] === 'CREDIT') ? $ret['Entry1']['ledger_entry_id'] : $ret['Entry2']['ledger_entry_id'];
$ret['data'] = $double_entry;
/* pr(array('DoubleEntry::addDoubleEntry' => */
/* array('checkpoint' => 'Pre-Save') */
/* + compact('double_entry'))); */
$this->create();
if (!$this->save($double_entry))
return $this->prReturn(array('error' => true) + $ret);
return array('error' => true) + $ret;
$ret['double_entry_id'] = $this->id;
return $this->prReturn($ret + array('error' => false));
return $ret + array('error' => false);
}
}
+25 -339
View File
@@ -12,7 +12,7 @@ class Lease extends AppModel {
'StatementEntry',
);
//var $default_log_level = array('log' => 30, 'show' => 30);
//var $default_log_level = array('log' => 30, 'show' => 15);
/**************************************************************************
**************************************************************************
@@ -44,26 +44,26 @@ class Lease extends AppModel {
$this->prEnter(compact('id', 'query'));
$this->queryInit($query);
// REVISIT <AP>: 20090807
// Let's try simplifying the security deposit issue.
// Presume that security deposits are NOT used at all,
// until the customer moves out of the unit. At that
// time, the ENTIRE deposit is converted to customer
// credit. Piece of cake.
// For more information, see file revision history,
// including the revision just before this, r503.
$this->id = $id;
$moveout_date = $this->field('moveout_date');
if (!empty($moveout_date))
return $this->prReturn(0);
$query['conditions'][] = array('StatementEntry.lease_id' => $id);
$query['conditions'][] = array('StatementEntry.account_id' =>
$this->StatementEntry->Account->securityDepositAccountID());
// REVISIT <AP>: 20090804
// Dilemma... how to handle security deposits used to pay
// charges on the lease, yet are not part of the lease
// security deposit(s)? For example, Lease A & Lease B,
// each with $25 Sec. Dep. Move out of Lease A, and
// promote the lease surplus to the customer. A new
// charge on Lease B for $15, which is assigned $15/$25
// from the promoted Lease A surplus. They way this
// function works at present, it will presume the $15 is
// part of the security deposit balance, and will end up
// calculating it as only $10, which is wrong. Perhaps
// the fix is to release security deposits into some sort
// of income account.
$stats = $this->StatementEntry->stats(null, $query);
return $this->prReturn($stats['Charge']['disbursement']);
return $this->prReturn($stats['account_balance']);
}
@@ -113,12 +113,8 @@ class Lease extends AppModel {
$customer_id = $secdeps[0]['StatementEntry']['customer_id'];
$lease_id = $secdeps[0]['StatementEntry']['lease_id'];
// Add receipt of the security deposit funds. Do NOT
// flag them as part of the lease, as all received funds
// are only associated with the customer, for future
// (or present) disbursement on any lease.
$result = $this->StatementEntry->Transaction->addReceipt
($release, $customer_id, null);
($release, $customer_id, $lease_id);
return $this->prReturn($result);
}
@@ -150,7 +146,6 @@ class Lease extends AppModel {
'conditions' => array
('SEx.effective_date = DATE_ADD(StatementEntry.through_date, INTERVAL 1 day)',
'SEx.lease_id = StatementEntry.lease_id',
'SEx.reverse_transaction_id IS NULL',
),
),
),
@@ -160,7 +155,6 @@ 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),
),
)
@@ -170,35 +164,6 @@ class Lease extends AppModel {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: lateCharges
* - Returns a list of late charges from this lease
*/
function lateCharges($id) {
$this->prEnter(compact('id'));
$late_account_id = $this->StatementEntry->Account->lateChargeAccountID();
$entries = $this->StatementEntry->find
('all',
array('link' =>
array(// Models
'Lease',
),
//'fields' => array('id', 'amount', 'effective_date', 'through_date'),
'conditions' => array(array('Lease.id' => $id),
array('StatementEntry.type' => 'CHARGE'),
array('StatementEntry.account_id' => $late_account_id),
),
)
);
return $this->prReturn($entries);
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -261,9 +226,7 @@ class Lease extends AppModel {
'conditions' =>
array(array('StatementEntry.lease_id' => $id),
array('StatementEntry.account_id' => $rent_account_id),
array('StatementEntry.reverse_transaction_id IS NULL'),
),
array('StatementEntry.account_id' => $rent_account_id)),
'order' => array('StatementEntry.effective_date'),
),
@@ -282,9 +245,7 @@ class Lease extends AppModel {
('CHARGE',
array('conditions' =>
array(array('StatementEntry.lease_id' => $id),
array('StatementEntry.account_id' => $rent_account_id),
array('StatementEntry.reverse_transaction_id IS NULL'),
),
array('StatementEntry.account_id' => $rent_account_id)),
'order' => array('StatementEntry.through_date DESC'),
),
@@ -302,261 +263,6 @@ class Lease extends AppModel {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: assessMonthlyRent
* - Charges rent for the month, if not already charged.
*/
function assessMonthlyRent($id, $date = null) {
$this->prEnter(compact('id', 'date'));
$this->id = $id;
if (empty($date))
$date = time();
if (is_string($date))
$date = strtotime($date);
// REVISIT <AP>: 20090808
// Anniversary Billing not supported
$anniversary = 0 && $this->field('anniversary_billing');
if (empty($anniversary)) {
$date_parts = getdate($date);
$date = mktime(0, 0, 0, $date_parts['mon'], 1, $date_parts['year']);
}
// Make sure we're not trying to assess rent on a closed lease
$close_date = $this->field('close_date');
$this->pr(17, compact('close_date'));
if (!empty($close_date))
return $this->prReturn(null);
// Don't assess rent after customer has moved out
$moveout_date = $this->field('moveout_date');
$this->pr(17, compact('moveout_date'));
if (!empty($moveout_date) && strtotime($moveout_date) < $date)
return $this->prReturn(null);
// Determine when the customer has already been charged through
// and, of course, don't charge them if they've already been.
$charge_through_date = strtotime($this->rentChargeThrough($id));
$this->pr(17, compact('date', 'charge_through_date')
+ array('date_str' => date('Y-m-d', $date),
'charge_through_date_str' => date('Y-m-d', $charge_through_date)));
if ($charge_through_date >= $date)
return $this->prReturn(null);
// OK, it seems we're going to go ahead and charge the customer
// on this lease. Calculate the new charge through date, which
// is 1 day shy of 1 month from $date. For example, if we're
// charging for 8/1/09, charge through will be 8/31/09, and
// charging for 8/15/09, charge through will be 9/14/09.
$date_parts = getdate($date);
$charge_through_date = mktime(0, 0, 0,
$date_parts['mon']+1,
$date_parts['mday']-1,
$date_parts['year']);
// Build the invoice transaction
$invoice = array('Transaction' => array(), 'Entry' => array());
// REVISIT <AP>: 20090808
// Keeping Transaction.stamp until the existing facility
// is up to date. Then we want the stamp to be now()
// (and so can just delete the next line).
$invoice['Transaction']['stamp'] = date('Y-m-d', $date);
$invoice['Entry'][] =
array('effective_date' => date('Y-m-d', $date),
'through_date' => date('Y-m-d', $charge_through_date),
'amount' => $this->field('rent'),
'account_id' => $this->StatementEntry->Account->rentAccountId(),
);
// Record the invoice and return the result
$this->pr(21, compact('invoice'));
$result = $this->StatementEntry->Transaction->addInvoice
($invoice, null, $id);
return $this->prReturn($result);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: assessMonthlyRentAll
* - Ensures rent has been charged on all open leases
*/
function assessMonthlyRentAll($date = null) {
$this->prEnter(compact('date'));
$leases = $this->find
('all', array('contain' => false,
'conditions' => array('Lease.close_date' => null),
));
$ret = array('Lease' => array());
foreach ($leases AS $lease) {
$result = $this->assessMonthlyRent($lease['Lease']['id'], $date);
$ret['Lease'][$lease['Lease']['id']] = $result;
if ($result['error'])
$ret['error'] = true;
}
return $this->prReturn($ret + array('error' => false));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: assessMonthlyLate
* - Assess late charges for the month, if not already charged.
*/
function assessMonthlyLate($id, $date = null) {
$this->prEnter(compact('id', 'date'));
$this->id = $id;
if (empty($date))
$date = time();
if (is_string($date))
$date = strtotime($date);
// REVISIT <AP>: 20090808
// Anniversary Billing not supported
$anniversary = 0 && $this->field('anniversary_billing');
if (empty($anniversary)) {
$date_parts = getdate($date);
$date = mktime(0, 0, 0, $date_parts['mon'], 11, $date_parts['year']);
}
// Don't assess a late charge if the late charge date hasn't
// even come yet. This is questionable whether we really
// should restrict, since the user could know what they're
// doing, and/or the server clock could be off (although that
// would certainly have much larger ramifications). But, the
// fact is that this check likely handles the vast majority
// of the expected behavior, and presents an issue for very
// few users, if any at all.
if ($date > time())
return $this->prReturn(null);
// Make sure we're not trying to assess late charges on a closed lease
$close_date = $this->field('close_date');
$this->pr(17, compact('close_date'));
if (!empty($close_date))
return $this->prReturn(null);
// Don't assess late charges after customer has moved out
$moveout_date = $this->field('moveout_date');
$this->pr(17, compact('moveout_date'));
if (!empty($moveout_date) && strtotime($moveout_date) < $date)
return $this->prReturn(null);
// Determine when the customer has been charged through for rent
// and don't mark them as late if they haven't even been charged rent
$charge_through_date = strtotime($this->rentChargeThrough($id));
$this->pr(17, compact('date', 'charge_through_date')
+ array('date_str' => date('Y-m-d', $date),
'charge_through_date_str' => date('Y-m-d', $charge_through_date)));
if ($charge_through_date <= $date)
return $this->prReturn(null);
// Determine if the customer is actually late. This is based on
// when they've paid through, plus 10 days before they're late.
// REVISIT <AP>: 20090813
// Of course, 10 days is a terrible hardcode. This should be
// driven from the late schedule, saved as part of the lease
// (when finally implemented).
$paid_through_date = strtotime($this->rentPaidThrough($id));
$this->pr(17, compact('date', 'paid_through_date')
+ array('date_str' => date('Y-m-d', $date),
'paid_through_date_str' => date('Y-m-d', $paid_through_date)));
$date_parts = getdate($paid_through_date);
$paid_through_date = mktime(0, 0, 0, $date_parts['mon'], $date_parts['mday']+10, $date_parts['year']);
if ($paid_through_date >= $date)
return $this->prReturn(null);
// Determine if the customer has already been charged a late fee
// and, of course, don't charge them if they've already been.
$late_charges = $this->lateCharges($id);
foreach ($late_charges AS $late) {
if (strtotime($late['StatementEntry']['effective_date']) == $date)
return $this->prReturn(null);
}
// Build the invoice transaction
$invoice = array('Transaction' => array(), 'Entry' => array());
// REVISIT <AP>: 20090808
// Keeping Transaction.stamp until the existing facility
// is up to date. Then we want the stamp to be now()
// (and so can just delete the next line).
$invoice['Transaction']['stamp'] = date('Y-m-d', $date);
$invoice['Entry'][] =
array('effective_date' => date('Y-m-d', $date),
'amount' => 10,
'account_id' => $this->StatementEntry->Account->lateChargeAccountId(),
);
// Record the invoice and return the result
$this->pr(21, compact('invoice'));
$result = $this->StatementEntry->Transaction->addInvoice
($invoice, null, $id);
return $this->prReturn($result);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: assessMonthlyLateAll
* - Ensures rent has been charged on all open leases
*/
function assessMonthlyLateAll($date = null) {
$this->prEnter(compact('date'));
$leases = $this->find
('all', array('contain' => false,
'conditions' => array('Lease.close_date' => null),
));
$ret = array('Lease' => array());
foreach ($leases AS $lease) {
$result = $this->assessMonthlyLate($lease['Lease']['id'], $date);
$ret['Lease'][$lease['Lease']['id']] = $result;
if ($result['error'])
$ret['error'] = true;
}
return $this->prReturn($ret + array('error' => false));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* functions: delinquency
* - SQL fragments to determine whether a lease is delinquent
*/
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 10 DAY))");
}
function delinquentDaysSQL($table_name = 'Lease') {
if (empty($table_name)) $t = ''; else $t = $table_name . '.';
return ("IF(" . $this->conditionDelinquent($table_name) . "," .
" DATEDIFF(NOW(), {$t}paid_through_date)-1," .
" NULL)");
}
function delinquentField($table_name = 'Lease') {
return ($this->delinquentDaysSQL($table_name) . " AS 'delinquent'");
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -655,7 +361,7 @@ class Lease extends AppModel {
*/
function moveOut($id, $status = 'VACANT',
$stamp = null, $close = true)
$stamp = null, $close = false)
{
$this->prEnter(compact('id', 'status', 'stamp', 'close'));
@@ -745,13 +451,12 @@ class Lease extends AppModel {
if (isset($this->data['Lease']['close_date']))
return $this->prReturn(false);
// A lease can only be closed if there are no outstanding
// security deposits ...
if ($this->securityDepositBalance($id) != 0)
return $this->prReturn(false);
$deposit_balance = $this->securityDepositBalance($id);
$stats = $this->stats($id);
// ... and if the account balance is zero.
if ($this->balance($id) != 0)
// A lease can only be closed if there are no outstanding
// security deposits, and if the account balance is zero.
if ($deposit_balance != 0)
return $this->prReturn(false);
// Apparently this lease meets all the criteria!
@@ -790,25 +495,6 @@ class Lease extends AppModel {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: update
* - 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));
$moveout = $this->field('moveout_date');
if (empty($moveout))
$this->Unit->update($this->field('unit_id'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -8,22 +8,8 @@ class LedgerEntry extends AppModel {
);
var $hasOne = array(
'Tender' => array(
'dependent' => true,
),
'DebitDoubleEntry' => array(
'className' => 'DoubleEntry',
'foreignKey' => 'debit_entry_id',
'dependent' => true,
),
'CreditDoubleEntry' => array(
'className' => 'DoubleEntry',
'foreignKey' => 'credit_entry_id',
'dependent' => true,
),
'DoubleEntry' => array(
'foreignKey' => false,
),
'Tender',
'DoubleEntry',
);
var $hasMany = array(
@@ -127,20 +113,24 @@ class LedgerEntry extends AppModel {
* - Inserts new Ledger Entry into the database
*/
function addLedgerEntry($entry, $tender = null) {
//$this->prFunctionLevel(16);
$this->prEnter(compact('entry', 'tender'));
/* pr(array('LedgerEntry::addLedgerEntry' => */
/* compact('entry', 'tender'))); */
$ret = array('data' => $entry);
$ret = array();
if (!$this->verifyLedgerEntry($entry, $tender))
return $this->prReturn(array('error' => true) + $ret);
return array('error' => true) + $ret;
if (empty($entry['ledger_id']))
$entry['ledger_id'] =
$this->Account->currentLedgerID($entry['account_id']);
/* pr(array('LedgerEntry::addLedgerEntry' => */
/* array('checkpoint' => 'Pre-Save') */
/* + compact('entry'))); */
$this->create();
if (!$this->save($entry))
return $this->prReturn(array('error' => true) + $ret);
return array('error' => true) + $ret;
$ret['ledger_entry_id'] = $this->id;
@@ -150,10 +140,10 @@ class LedgerEntry extends AppModel {
$result = $this->Tender->addTender($tender);
$ret['Tender'] = $result;
if ($result['error'])
return $this->prReturn(array('error' => true) + $ret);
return array('error' => true) + $ret;
}
return $this->prReturn($ret + array('error' => false));
return $ret + array('error' => false);
}
@@ -165,13 +155,53 @@ class LedgerEntry extends AppModel {
*/
function stats($id = null, $query = null, $set = null) {
$this->queryInit($query);
unset($query['group']);
// 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');
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;
}
}
+15
View File
@@ -0,0 +1,15 @@
<?php
class MapsUnit extends AppModel {
var $name = 'MapsUnit';
var $validate = array(
'id' => array('numeric'),
'map_id' => array('numeric'),
'unit_id' => array('numeric'),
'pt_top' => array('numeric'),
'pt_left' => array('numeric'),
'transpose' => array('boolean')
);
}
?>
@@ -18,13 +18,11 @@ class StatementEntry extends AppModel {
'DisbursementEntry' => array(
'className' => 'StatementEntry',
'foreignKey' => 'charge_entry_id',
'dependent' => true,
),
);
//var $default_log_level = array('log' => 30, 'show' => 15);
var $max_log_level = 19;
var $default_log_level = array('log' => 30, 'show' => 15);
/**************************************************************************
**************************************************************************
@@ -37,7 +35,7 @@ class StatementEntry extends AppModel {
}
function creditTypes() {
return array('DISBURSEMENT', 'WAIVER', 'REVERSAL', 'WRITEOFF', 'SURPLUS');
return array('DISBURSEMENT', 'WAIVER', 'REVERSAL', 'SURPLUS');
}
function voidTypes() {
@@ -125,13 +123,16 @@ class StatementEntry extends AppModel {
function addStatementEntry($entry) {
$this->prEnter(compact('entry'));
$ret = array('data' => $entry);
$ret = array();
if (!$this->verifyStatementEntry($entry))
return $this->prReturn(array('error' => true, 'verify_data' => $entry) + $ret);
return array('error' => true, 'verify_data' => $entry) + $ret;
$this->pr(20, array('checkpoint' => 'Pre-Save')
+ compact('entry'));
$this->create();
if (!$this->save($entry))
return $this->prReturn(array('error' => true, 'save_data' => $entry) + $ret);
return array('error' => true, 'save_data' => $entry) + $ret;
$ret['statement_entry_id'] = $this->id;
return $this->prReturn($ret + array('error' => false));
@@ -154,7 +155,7 @@ class StatementEntry extends AppModel {
$charge = $charge['StatementEntry'];
if ($charge['type'] !== 'CHARGE')
$this->INTERNAL_ERROR("Waiver item is not CHARGE.");
INTERNAL_ERROR("Waiver item is not CHARGE.");
// Query the stats to get the remaining balance
$stats = $this->stats($id);
@@ -167,6 +168,7 @@ class StatementEntry extends AppModel {
// Add the charge waiver
$waiver['Entry'][] =
array('amount' => $stats['Charge']['balance'],
'account_id' => $this->Account->waiverAccountID(),
'comment' => null,
);
@@ -176,64 +178,89 @@ class StatementEntry extends AppModel {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: reversable
* - Returns true if the charge can be reversed; false otherwise
*/
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');
if ($charge_type !== 'CHARGE')
return $this->prReturn(false);
// Determine anything reconciled against the charge
$reverse_transaction_id = $this->field('reverse_transaction_id');
if (!empty($reverse_transaction_id))
return $this->prReturn(false);
return $this->prReturn(true);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: reverse
* - Reverses the charges
*
*/
function reverse($id, $stamp = null, $comment) {
$this->prEnter(compact('id', 'stamp'));
function reverse($id, $balance = false, $stamp = null) {
$this->prEnter(compact('id', 'balance', 'stamp'));
// Verify the item can be reversed
if (!$this->reversable($id))
$this->INTERNAL_ERROR("Item is not reversable.");
$ret = array();
// Get the basic information about this charge
$charge = $this->find('first', array('contain' => true));
//$charge = $charge['StatementEntry'];
// Get the basic information about the entry to be reversed.
$this->recursive = -1;
$charge = $this->read(null, $id);
$charge = $charge['StatementEntry'];
if ($charge['type'] !== 'CHARGE')
INTERNAL_ERROR("Reversal item is not CHARGE.");
// Build a transaction
$reversal = array('Transaction' => array(), 'Entry' => array());
$reversal['Transaction']['stamp'] = $stamp;
$reversal['Transaction']['comment'] = "Credit Note: Charge Reversal";
$voided_entry_transactions = array();
$reconciled = $this->reconciledEntries($id);
$this->pr(21, compact('reconciled'));
if ($reconciled && !$balance) {
foreach ($reconciled['entries'] AS $entry) {
if ($entry['DisbursementEntry']['type'] === 'REVERSAL')
INTERNAL_ERROR("Charge has already been reversed");
/* $voided_entry_transactions[$entry['DisbursementEntry']['transaction_id']] */
/* = array_intersect_key($entry['DisbursementEntry'], */
/* array('customer_id'=>1, 'lease_id'=>1)); */
/* $reversal['Entry'][] = */
/* array_intersect_key($entry['DisbursementEntry'], */
/* array_flip(array('amount', 'account_id', 'charge_entry_id'))) */
/* + array('type' => 'SURPLUS', */
/* 'comment' => 'Release of funds applied to reversed charge', */
/* ); */
}
/* $this->pr(17, compact('voided_entry_transactions')); */
}
// Query the stats to get the remaining balance
$stats = $this->stats($id);
$charge['paid'] = $stats['Charge']['disbursement'];
// Add the charge reversal
$reversal['Entry'][] =
array('charge_entry_id' => $id,
'amount' => -1 * $stats['Charge'][$balance ? 'balance' : 'total'],
'account_id' => $charge['account_id'],
'comment' => 'Charge Reversal',
);
// Record the reversal transaction
$result = $this->Transaction->addReversal
($charge, $stamp, $comment ? $comment : 'Charge Reversal');
($reversal, $id, $charge['customer_id'], $charge['lease_id']);
$this->pr(21, compact('result'));
$ret['reversal'] = $result;
if ($result['error'])
$ret['error'] = true;
if (empty($result['error'])) {
// Mark the charge as reversed
$this->id = $id;
$this->saveField('reverse_transaction_id', $result['transaction_id']);
foreach ($voided_entry_transactions AS $transaction_id => $tx) {
$result = $this->assignCredits
(null,
$transaction_id,
null,
null,
$tx['customer_id'],
$tx['lease_id']
);
$this->pr(21, compact('result'));
$ret['assigned'][] = $result;
if ($result['error'])
$ret['error'] = true;
}
return $this->prReturn($result);
return $this->prReturn($ret + array('error' => false));
}
@@ -369,11 +396,10 @@ class StatementEntry extends AppModel {
// First, find all known credits, unless this call is to make
// credit adjustments to a specific charge
if (empty($receipt_id)) {
if (!empty($charge_ids))
$this->INTERNAL_ERROR("Charge IDs, yet no corresponding receipt");
// REVISIT <AP>: 20090806
// If the theory below is correct, we should only search for
// explicit credits if we don't have a receipt_id
if (empty($charge_ids)) {
$lquery = $query;
$lquery['conditions'][] = array('StatementEntry.type' => 'SURPLUS');
// REVISIT <AP>: 20090804
@@ -398,13 +424,20 @@ class StatementEntry extends AppModel {
"Credits Established");
}
else {
// Establish credit from the (newly added) receipt
if (empty($receipt_id))
INTERNAL_ERROR("Can't make adjustments to a charge without a receipt ID.");
}
// Next, establish credit from the newly added receipt
$receipt_credit = null;
if (!empty($receipt_id)) {
$lquery =
array('link' =>
array('StatementEntry',
'LedgerEntry' =>
array('conditions' =>
array('LedgerEntry.account_id <> Transaction.account_id')
array('LedgerEntry.account_id !=' =>
$this->Account->accountReceivableAccountID()),
),
),
'conditions' => array('Transaction.id' => $receipt_id),
@@ -412,14 +445,15 @@ class StatementEntry extends AppModel {
);
$receipt_credit = $this->Transaction->find('first', $lquery);
if (!$receipt_credit)
$this->INTERNAL_ERROR("Unable to locate receipt.");
INTERNAL_ERROR("Unable to locate receipt.");
//$reconciled = $this->reconciledEntries($id);
$stats = $this->Transaction->stats($receipt_id);
$receipt_credit['balance'] = $stats['undisbursed'];
$receipt_credit['balance'] =
$receipt_credit['Transaction']['amount'] - $stats['Disbursement']['total'];
$receipt_credit['receipt'] = true;
$credits = array($receipt_credit);
$this->pr(18, compact('credits'),
$this->pr(18, compact('receipt_credit'),
"Receipt Credit Added");
}
@@ -442,44 +476,61 @@ class StatementEntry extends AppModel {
$this->pr(18, compact('dtype', 'entries'), "Outstanding Debit Entries");
}
// Initialize our list of used credits
$used_credits = array();
// REVISIT <AP>: 20090806
// Testing a theory. We should never have
// explicit credits, as well as a new receipt,
// and yet have outstanding charges.
if (!empty($credits) && !empty($receipt_credit) && !empty($charges))
INTERNAL_ERROR("Explicit credits that haven't already been applied.");
// Work through all unpaid charges, applying disbursements as we go
foreach ($charges AS $charge) {
$this->pr(20, compact('charge'),
'Process Charge');
// Check that we have available credits.
// Technically, this isn't necessary, since the loop
// will handle everything just fine. However, this
// just saves extra processing if/when there is no
// means to resolve a charge anyway.
if (empty($credits) && empty($receipt_credit['balance'])) {
$this->pr(17, 'No more available credits');
break;
}
$charge['balance'] = $charge['StatementEntry']['balance'];
// Use explicit credits before using the new receipt credit
foreach ($credits AS &$credit) {
if (empty($charge['balance']))
break;
if ($charge['balance'] < 0)
$this->INTERNAL_ERROR("Negative Charge Balance");
if (!isset($credit['balance']))
$credit['balance'] = $credit['StatementEntry']['amount'];
if (empty($credit['balance']))
continue;
if ($credit['balance'] < 0)
$this->INTERNAL_ERROR("Negative Credit Balance");
while ($charge['balance'] > 0 &&
(!empty($credits) || !empty($receipt_credit['balance']))) {
$this->pr(20, compact('charge'),
'Attempt Charge Reconciliation');
if (empty($credit['receipt']))
// Use explicit credits before using implicit credits
// (Not sure it matters though).
if (!empty($credits)) {
// Peel off the first credit available
$credit =& $credits[0];
$disbursement_date = $credit['StatementEntry']['effective_date'];
$disbursement_transaction_id = $credit['StatementEntry']['transaction_id'];
$disbursement_account_id = $credit['StatementEntry']['account_id'];
else
$disbursement_account_id = $credit['LedgerEntry']['account_id'];
// REVISIT <AP>: 20090811
// Need to come up with a better strategy for handling
// concessions. For now, just restricting concessions
// to apply only towards rent will resolve the most
// predominant (or only) needed usage case.
if ($disbursement_account_id == $this->Account->concessionAccountID() &&
$charge['StatementEntry']['account_id'] != $this->Account->rentAccountID())
continue;
if (!isset($credit['balance']))
$credit['balance'] = $credit['StatementEntry']['amount'];
}
elseif (!empty($receipt_credit['balance'])) {
// Use our only receipt credit
$credit =& $receipt_credit;
$disbursement_date = $credit['Transaction']['stamp'];
$disbursement_transaction_id = $credit['Transaction']['id'];
$disbursement_account_id = $credit['LedgerEntry']['account_id'];
}
else {
die("HOW DID WE GET HERE WITH NO SURPLUS?");
}
// Set the disbursement amount to the maximum amount
// possible without exceeding the charge or credit balance
@@ -492,67 +543,35 @@ class StatementEntry extends AppModel {
$this->pr(20, compact('credit'),
($credit['balance'] > 0 ? 'Utilized' : 'Exhausted') .
(empty($credit['receipt']) ? ' Credit' : ' Receipt'));
(!empty($credits) ? ' Credit' : ' Receipt'));
if (strtotime($charge['StatementEntry']['effective_date']) >
strtotime($credit['StatementEntry']['effective_date']))
$disbursement_edate = $charge['StatementEntry']['effective_date'];
else
$disbursement_edate = $credit['StatementEntry']['effective_date'];
if ($credit['balance'] < 0)
die("HOW DID WE END UP WITH NEGATIVE SURPLUS BALANCE?");
if (empty($credit['receipt'])) {
// Explicit Credit
$result = $this->Transaction->addTransactionEntries
(array('include_ledger_entry' => true,
'include_statement_entry' => true),
array('type' => 'INVOICE',
'id' => $credit['StatementEntry']['transaction_id'],
'account_id' => $this->Account->accountReceivableAccountID(),
'crdr' => 'CREDIT',
'customer_id' => $charge['StatementEntry']['customer_id'],
'lease_id' => $charge['StatementEntry']['lease_id'],
),
array
(array('type' => $disbursement_type,
'effective_date' => $disbursement_edate,
'account_id' => $credit['StatementEntry']['account_id'],
'amount' => $disbursement_amount,
'charge_entry_id' => $charge['StatementEntry']['id'],
),
));
// If we've exhausted the credit, get it out of the
// available credit pool (but keep track of it for later).
if ($credit['balance'] <= 0 && !empty($credits))
$used_credits[] = array_shift($credits);
$ret['Disbursement'][] = $result;
if ($result['error'])
$ret['error'] = true;
}
else {
// Receipt Credit
// Add a disbursement that uses the available credit to pay the charge
$disbursement = array('type' => $disbursement_type,
'account_id' => $disbursement_account_id,
'amount' => $disbursement_amount,
'effective_date' => $disbursement_date,
'transaction_id' => $disbursement_transaction_id,
'customer_id' => $charge['StatementEntry']['customer_id'],
'lease_id' => $charge['StatementEntry']['lease_id'],
'charge_entry_id' => $charge['StatementEntry']['id'],
'comment' => null,
);
if (strtotime($charge['StatementEntry']['effective_date']) >
strtotime($credit['Transaction']['stamp']))
$disbursement_edate = $charge['StatementEntry']['effective_date'];
else
$disbursement_edate = $credit['Transaction']['stamp'];
$this->pr(20, compact('disbursement'),
'New Disbursement Entry');
// Add a disbursement that uses the available credit to pay the charge
$disbursement =
array('type' => $disbursement_type,
'effective_date' => $disbursement_edate,
'amount' => $disbursement_amount,
'account_id' => $credit['LedgerEntry']['account_id'],
'transaction_id' => $credit['Transaction']['id'],
'customer_id' => $charge['StatementEntry']['customer_id'],
'lease_id' => $charge['StatementEntry']['lease_id'],
'charge_entry_id' => $charge['StatementEntry']['id'],
'comment' => null,
);
$this->pr(20, compact('disbursement'), 'New Disbursement Entry');
$result = $this->addStatementEntry($disbursement);
$ret['Disbursement'][] = $result;
if ($result['error'])
$ret['error'] = true;
}
$result = $this->addStatementEntry($disbursement);
$ret['Disbursement'][] = $result;
if ($result['error'])
$ret['error'] = true;
// Adjust the charge balance to reflect the new disbursement
$charge['balance'] -= $disbursement_amount;
@@ -562,47 +581,37 @@ class StatementEntry extends AppModel {
if ($charge['balance'] <= 0)
$this->pr(20, 'Fully Paid Charge');
}
// Break the $credit reference to avoid future problems
unset($credit);
}
$this->pr(18, compact('credits'),
'Disbursements complete');
// Partially used credits must be added to the used list
if (isset($credits[0]['applied']))
$used_credits[] = array_shift($credits);
$this->pr(18, compact('credits', 'used_credits', 'receipt_credit'),
'Disbursements added');
// Clean up any explicit credits that have been used
foreach ($credits AS $credit) {
if (!empty($credit['receipt']))
continue;
if (empty($credit['applied']))
continue;
foreach ($used_credits AS $credit) {
if ($credit['balance'] > 0) {
$this->pr(20, compact('credit'),
'Update Credit Entry');
$this->id = $credit['StatementEntry']['id'];
$this->id = $credit['StatementEntry']['id'];
$this->saveField('amount', $credit['balance']);
}
else {
$this->pr(20, compact('credit'),
'Delete Exhausted Credit Entry');
$this->delete($credit['StatementEntry']['id'], false);
$this->del($credit['StatementEntry']['id'], false);
}
}
// Check for any implicit receipt credits, converting
// into explicit credits if there is a remaining balance.
foreach ($credits AS $credit) {
if (empty($credit['receipt']))
continue;
// Convert non-exhausted receipt credit to an explicit one
if (!empty($receipt_credit['balance'])) {
$credit =& $receipt_credit;
if (empty($credit['balance']))
continue;
// See if there is an existing explicit credit
// for this transaction.
$explicit_credit = $this->find
('first', array('contain' => false,
'conditions' =>
@@ -610,31 +619,30 @@ class StatementEntry extends AppModel {
array('type' => 'SURPLUS')),
));
if (!empty($explicit_credit)) {
// REVISIT <AP>: 20090815
// Testing whether or not this case occurs
$this->INTERNAL_ERROR('Existing explicit credit unexpected');
if (empty($explicit_credit)) {
$this->pr(18, compact('credit'),
'Create Explicit Credit');
// Since there IS an existing explicit credit, we must update
// its balance instead of creating a new one, since it has
// already been incorporated in the overall credit balance.
// If we were to create a new one, we would erroneously create
// an excess of credit available.
$result = $this->addStatementEntry
(array('type' => 'SURPLUS',
'account_id' => $credit['LedgerEntry']['account_id'],
'amount' => $credit['balance'],
'effective_date' => $credit['Transaction']['stamp'],
'transaction_id' => $credit['Transaction']['id'],
'customer_id' => $customer_id,
'lease_id' => $lease_id,
));
$ret['Credit'] = $result;
if ($result['error'])
$ret['error'] = true;
}
else {
$this->pr(18, compact('explicit_credit', 'credit'),
'Update existing explicit credit');
'Update Explicit Credit');
$EC = new StatementEntry();
$EC->id = $explicit_credit['StatementEntry']['id'];
$EC->saveField('amount', $credit['balance']);
continue;
}
if (!empty($ret['receipt_balance']))
$this->INTERNAL_ERROR('Only one receipt expected in assignCredits');
// Give caller the information necessary to create an explicit
// credit from the passed receipt, which we've not exhausted.
$this->pr(18, compact('credit'), 'Convert to explicit credit');
$ret['receipt_balance'] = $credit['balance'];
}
return $this->prReturn($ret + array('error' => false));
@@ -648,7 +656,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' => 19, 'show' => 10));
$this->prEnter(compact('id', 'query'));
$this->queryInit($query);
+145
View File
@@ -0,0 +1,145 @@
<?php
class Tender extends AppModel {
var $belongsTo = array(
'TenderType',
'Customer',
'LedgerEntry',
'DepositTransaction' => array(
'className' => 'Transaction',
),
'NsfTransaction' => array(
'className' => 'Transaction',
),
);
/**************************************************************************
**************************************************************************
**************************************************************************
* function: verifyTender
* - Verifies consistenty of new tender data
* (not in a pre-existing tender)
*/
function verifyTender($tender) {
$this->prFunctionLevel(10);
$this->prEnter(compact('tender'));
if (empty($tender['tender_type_id'])) {
return $this->prReturn(false);
}
return $this->prReturn(true);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addTender
* - Inserts new Tender into the database
*/
function addTender($tender) {
$this->prEnter(compact('tender'));
$ret = array();
if (!$this->verifyTender($tender))
return $this->prReturn(array('error' => true) + $ret);
// Come up with a (not necessarily unique) name for the tender.
// For checks & money orders, this will be based on the check
// number. For other types of tender, we'll just use the
// generic name of the monetary account.
// REVISIT <AP>: 20090723
// I would like to have cash named "Cash #1234", where
// the number would correspond to either the Tender ID
// or the LedgerEntry ID.
if (empty($tender['name']) && !empty($tender['account_id'])) {
$tender['name'] = $this->LedgerEntry->Account->name($tender['account_id']);
if ($tender['account_id'] == $this->LedgerEntry->Account->checkAccountID() ||
$tender['account_id'] == $this->LedgerEntry->Account->moneyOrderAccountID()) {
$tender['name'] .= ' #' . $tender['data1'];
}
}
$this->pr(20, array('Tender' => $tender),
'Pre-Save');
$this->create();
if (!$this->save($tender))
return $this->prReturn(array('error' => true) + $ret);
$ret['tender_id'] = $this->id;
return $this->prReturn($ret + array('error' => false));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: nsf
* - Flags the ledger entry as having insufficient funds
*
* Steps:
* - Get information from Check (C1); for amount $A
* - Find Bank Deposit matching to Tender
* - New Transaction (T1)
* - New Bank Deposit (D1)
* - New Tender (N1); NSF; D1,
* - Add new LedgerEntry (L1a); T1; debit:bank; -$A
* - Add new LedgerEntry (L1b); T1; credit:NSF; -$A
* - Add new LedgerEntry (L2a); T1; debit:NSF; -$A; N1
* - Add new LedgerEntry (L2b); T1; credit:A/R; -$A
* - For Tx associated with LE associated with C1:
* - For each Disbursement SE of Tx:
* - Add new StatementEntry (S1n); T1; DISBURSEMENT; -1*S1n.amount
* - New Transaction (T2) (?????)
* - Add new StatementEntry (S2); T2; CHARGE; NSF; $35
* - Add new LedgerEntry (L3a); T2; credit:NSF-Fee; $35
* - Add new LedgerEntry (L3b); T2; debit:A/R; $35
* - Set C1.nsf_tx = T1
* - Re-Reconcile (customer may have running credit)
*/
function nsf($id, $stamp = null) {
$this->prFunctionLevel(30);
$this->prEnter(compact('id'));
// Get information about this NSF item.
$this->id = $id;
$tender = $this->find
('first', array
('contain' =>
array('LedgerEntry',
'DepositTransaction',
'NsfTransaction'),
));
$this->pr(20, compact('tender'));
if (!empty($tender['NsfTransaction']['id']))
die("Item has already been set as NSF");
if (empty($tender['DepositTransaction']['id']))
die("Item has not been deposited yet");
$tender['Transaction'] = $tender['DepositTransaction'];
unset($tender['DepositTransaction']);
unset($tender['NsfTransaction']);
$T = new Transaction();
$result = $T->addNsf($tender, $stamp);
if ($result['error'])
return $this->prReturn(false);
// Flag the tender as NSF, using the items created from addNsf
$this->id = $id;
$this->saveField('nsf_transaction_id', $result['nsf_transaction_id']);
$this->saveField('nsf_ledger_entry_id', $result['nsf_ledger_entry_id']);
return $this->prReturn(true);
}
}
?>
+824
View File
@@ -0,0 +1,824 @@
<?php
class Transaction extends AppModel {
var $belongsTo = array(
'Account',
'Ledger',
);
var $hasMany = array(
'LedgerEntry',
'StatementEntry',
'DepositTender' => array(
'className' => 'Tender',
'foreignKey' => 'deposit_transaction_id',
),
'Charge' => array(
'className' => 'StatementEntry',
'conditions' => array('Charge.type' => 'CHARGE')
),
'Disbursement' => array(
'className' => 'StatementEntry',
'conditions' => array('Disbursement.type' => 'DISBURSEMENT')
),
'Debit' => array(
'className' => 'LedgerEntry',
'conditions' => array('Debit.crdr' => 'DEBIT')
),
'Credit' => array(
'className' => 'LedgerEntry',
'conditions' => array('Credit.crdr' => 'CREDIT')
),
);
var $default_log_level = array('log' => 30, 'show' => 30);
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addInvoice
* - Adds a new invoice invoice
*/
function addInvoice($data, $customer_id, $lease_id = null) {
$this->prEnter(compact('data', 'customer_id', 'lease_id'));
// Establish the transaction as an invoice
$invoice =& $data['Transaction'];
$invoice +=
array('type' => 'INVOICE',
'crdr' => 'DEBIT',
'account_id' => $this->Account->accountReceivableAccountID(),
'customer_id' => $customer_id,
'lease_id' => $lease_id,
);
// Go through the statement entries and flag as charges
foreach ($data['Entry'] AS &$entry)
$entry += array('type' => 'CHARGE',
'crdr' => 'CREDIT',
);
$ids = $this->addTransaction($data['Transaction'], $data['Entry']);
if (isset($ids['transaction_id']))
$ids['invoice_id'] = $ids['transaction_id'];
return $this->prReturn($ids);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addReceipt
* - Adds a new receipt
*/
function addReceipt($data, $customer_id, $lease_id = null) {
$this->prEnter(compact('data', 'customer_id', 'lease_id'));
// Establish the transaction as a receipt
$receipt =& $data['Transaction'];
$receipt +=
array('type' => 'RECEIPT',
'crdr' => 'CREDIT',
'account_id' => $this->Account->accountReceivableAccountID(),
'customer_id' => $customer_id,
'lease_id' => $lease_id,
);
// Go through the statement entries and flag as disbursements
foreach ($data['Entry'] AS &$entry)
$entry += array('type' => 'DISBURSEMENT', // not used
'crdr' => 'DEBIT',
'account_id' =>
(isset($entry['Tender']['tender_type_id'])
? ($this->LedgerEntry->Tender->TenderType->
accountID($entry['Tender']['tender_type_id']))
: null),
);
$ids = $this->addTransaction($data['Transaction'], $data['Entry']);
if (isset($ids['transaction_id']))
$ids['receipt_id'] = $ids['transaction_id'];
return $this->prReturn($ids);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addWaiver
* - Adds a new waiver
*/
function addWaiver($data, $charge_id, $customer_id, $lease_id = null) {
$this->prEnter(compact('data', 'charge_id', 'customer_id', 'lease_id'));
if (count($data['Entry']) != 1)
INTERNAL_ERROR("Should be one Entry for addWaiver");
// Just make sure the disbursement(s) are marked as waivers
// and that they go to cover the specific charge.
$data['Transaction']['disbursement_type'] = 'WAIVER';
$data['Transaction']['assign_charge_entry_id'] = $charge_id;
// In all other respects this is just a receipt.
$ids = $this->addReceipt($data, $customer_id, $lease_id);
if (isset($ids['transaction_id']))
$ids['waiver_id'] = $ids['transaction_id'];
return $this->prReturn($ids);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addReversal
* - Adds a new charge reversal
*/
function addReversal($data, $charge_id, $customer_id, $lease_id = null) {
$this->prEnter(compact('data', 'charge_id', 'customer_id', 'lease_id'));
$data['Transaction'] += array('type' => 'CREDIT_NOTE');
foreach ($data['Entry'] AS &$entry)
$entry += array('type' => 'REVERSAL');
// In all other respects this is just an invoice
$ids = $this->addInvoice($data, $customer_id, $lease_id);
if (isset($ids['transaction_id']))
$ids['reversal_id'] = $ids['transaction_id'];
return $this->prReturn($ids);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addDeposit
* - Adds a new bank deposit
*/
function addDeposit($data, $account_id) {
$this->prEnter(compact('data', 'account_id'));
// Establish the transaction as a deposit
$deposit =& $data['Transaction'];
$deposit +=
array('type' => 'DEPOSIT',
'crdr' => 'DEBIT',
'account_id' => $account_id,
'customer_id' => null,
'lease_id' => null,
);
// Save the list of IDs, so that we can mark their
// deposit transaction after it has been created.
$tender_ids = array_map(create_function('$item', 'return $item["tender_id"];'),
$data['Entry']);
// Go through the statement entries and re-group by account id
$group = array();
foreach ($data['Entry'] AS &$entry) {
if (!isset($group[$entry['account_id']]))
$group[$entry['account_id']] =
array('account_id' => $entry['account_id'],
'crdr' => 'CREDIT',
'amount' => 0);
$group[$entry['account_id']]['amount'] += $entry['amount'];
}
$data['Entry'] = $group;
$ids = $this->addTransaction($data['Transaction'], $data['Entry']);
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)
);
}
return $this->prReturn($ids);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addClose
* - Adds a new transaction for closing ledgers
*/
function addClose($data) {
$this->prEnter(compact('data'));
// Establish the transaction as a close
$close =& $data['Transaction'];
$close +=
array('type' => 'CLOSE',
'crdr' => null,
'account_id' => null,
'customer_id' => null,
'lease_id' => null,
);
$ledger_ids = array();
$data['Entry'] = array();
foreach ($data['Ledger'] AS $ledger) {
$ledger_id = $ledger['old_ledger_id'];
$new_ledger_id = $ledger['new_ledger_id'];
$amount = $ledger['amount'];
$account_id = $this->Account->Ledger->accountID($ledger_id);
$crdr = strtoupper($this->Account->fundamentalOpposite($account_id));
$comment = "Ledger Carry Forward (c/f)";
// Save the ledger ID for later, to mark it as closed
$ledger_ids[] = $ledger_id;
// No need to generate ledger entries if there is no balance
if (empty($ledger['amount']) || $ledger['amount'] == 0)
continue;
// Add an entry to carry the ledger balance forward
$data['Entry'][] = compact('account_id', 'ledger_id', 'new_ledger_id',
'crdr', 'amount', 'comment');
}
unset($data['Ledger']);
// Add the transaction and carry forward balances
$ids = $this->addTransaction($data['Transaction'], $data['Entry']);
if (isset($ids['transaction_id']))
$ids['close_id'] = $ids['transaction_id'];
// Mark the older ledgers as closed
if (!empty($ids['close_id'])) {
$this->LedgerEntry->Ledger->updateAll
(array('Ledger.close_transaction_id' => $ids['close_id']),
array('Ledger.id' => $ledger_ids)
);
}
return $this->prReturn($ids);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addRefund
* - Adds a new refund
*/
function addRefund($data, $customer_id, $lease_id = null) {
$this->prEnter(compact('data', 'customer_id', 'lease_id'));
// Establish the transaction as a Refund. This is just like a
// Payment, except instead of paying out of the account payable,
// it comes from the customer credit in the account receivable.
// Someday, perhaps we'll just issue a Credit Note or similar,
// but for now, a refund means it's time to actually PAY.
$refund =& $data['Transaction'];
$refund +=
array('account_id' => $this->Account->accountReceivableAccountID());
// Also, to make it clear to the user, we flag as a REFUND
// even though that type works and operates just as PAYMENT
foreach ($data['Entry'] AS &$entry)
$entry += array('type' => 'REFUND');
$ids = $this->addPayment($data, $customer_id, $lease_id);
if (isset($ids['transaction_id']))
$ids['refund_id'] = $ids['transaction_id'];
return $this->prReturn($ids);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addPayment
* - Adds a new payment transaction, which is money outflow
*/
function addPayment($data, $customer_id, $lease_id = null) {
$this->prEnter(compact('data', 'customer_id', 'lease_id'));
// Establish the transaction as an payment
$payment =& $data['Transaction'];
$payment +=
array('type' => 'PAYMENT',
'crdr' => 'DEBIT',
'account_id' => $this->Account->accountPayableAccountID(),
'customer_id' => $customer_id,
'lease_id' => $lease_id,
);
// Go through the statement entries and flag as payments
foreach ($data['Entry'] AS &$entry)
$entry += array('type' => 'PAYMENT',
'crdr' => 'CREDIT',
);
$ids = $this->addTransaction($data['Transaction'], $data['Entry']);
if (isset($ids['transaction_id']))
$ids['payment_id'] = $ids['transaction_id'];
return $this->prReturn($ids);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: verifyTransaction
* - Verifies consistenty of new transaction data
* (not in a pre-existing transaction)
*/
function verifyTransaction($transaction, $entries) {
//$this->prFunctionLevel(10);
$this->prEnter(compact('transaction', 'entries'));
// Verify required Transaction data is present
if (empty($transaction['type']) ||
($transaction['type'] != 'CLOSE'
&& (empty($transaction['account_id']) ||
empty($transaction['crdr']))) ||
(in_array($transaction['type'], array('INVOICE', 'RECEIPT'))
&& empty($transaction['customer_id']))
) {
return $this->prReturn(false);
}
// Verify all entries
foreach ($entries AS $entry) {
// Ensure these items are null'ed out so we don't
// accidentally pick up stale data.
$le1 = $le1_tender = $le2 = $se = null;
extract($entry);
if (!empty($le1) && !empty($le2) &&
!$this->LedgerEntry->DoubleEntry->verifyDoubleEntry($le1, $le2, $le1_tender)) {
return $this->prReturn(false);
}
if (!empty($se) &&
!$this->StatementEntry->verifyStatementEntry($se)) {
return $this->prReturn(false);
}
}
return $this->prReturn(true);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addTransaction
* - Adds a new transaction, and the appropriate ledger and statement
* entries, as layed out in the $data['Entry'] array. The array is
* overloaded, since it is used to create both ledger _and_ statement
* entries.
*
* $data
* - Transaction
* - [MANDATORY]
* - type (INVOICE, RECEIPT)
* - account_id
* - crdr
* - [OPTIONAL]
* - stamp
* (default: NOW)
* - comment
* - [AUTOMATICALLY SET] (if set, these items will be overwritten)
* - id
* - amount
* - customer_id
* - ledger_id
*
* - Entry (array)
* - [MANDATORY]
* - type (CHARGE, DISBURSEMENT)
* - account_id
* - crdr
* - amount
* - [OPTIONAL]
* - effective_date
* - through_date
* - due_date
* - comment (used for statement or ledger entry, based on context)
* - ledger_entry_comment
* - statement_entry_comment
* - Tender
* - [MANDATORY]
* - tender_type_id
* - [OPTIONAL]
* - name
* (default: Entry Account Name & data1)
* - data1, data2, data3, data4
* - comment
* - [AUTOMATICALLY SET] (if set, these items will be overwritten)
* - id
* - ledger_entry_id
* - deposit_transaction_id
* - nsf_transaction_id
* - [AUTOMATICALLY SET] (if set, these items will be overwritten)
* - id
* - transaction_id
* - ledger_id
*
*/
function addTransaction($transaction, $entries, $subtype = null) {
$this->prEnter(compact('transaction', 'entries', 'subtype'));
// Verify that we have a transaction and entries
if (empty($transaction) ||
($transaction['type'] !== 'CLOSE' && empty($entries)))
return $this->prReturn(array('error' => true));
// set ledger ID as the current ledger of the specified account
if (empty($transaction['ledger_id']))
$transaction['ledger_id'] =
$this->Account->currentLedgerID($transaction['account_id']);
// Automatically figure out the customer if we have the lease
if (!empty($transaction['lease_id']) && empty($transaction['customer_id'])) {
$L = new Lease();
$L->recursive = -1;
$lease = $L->read(null, $transaction['lease_id']);
$transaction['customer_id'] = $lease['Lease']['customer_id'];
}
// Break each entry out of the combined statement/ledger entry
// and into individual entries appropriate for saving. While
// we're at it, calculate the transaction total as well.
$transaction['amount'] = 0;
foreach ($entries AS &$entry) {
// Ensure these items are null'ed out so we don't
// accidentally pick up stale data.
$le1 = $le1_tender = $le2 = $se = null;
// Add entry amount into the transaction total
$transaction['amount'] += $entry['amount'];
// Set up our comments, possibly using the default 'comment' field
if (empty($entry['ledger_entry_comment'])) {
if ($transaction['type'] != 'INVOICE' && !empty($entry['comment']))
$entry['ledger_entry_comment'] = $entry['comment'];
else
$entry['ledger_entry_comment'] = null;
}
if (empty($entry['statement_entry_comment'])) {
if ($transaction['type'] == 'INVOICE' && !empty($entry['comment']))
$entry['statement_entry_comment'] = $entry['comment'];
else
$entry['statement_entry_comment'] = null;
}
// Create one half of the Double Ledger Entry (and the Tender)
$le1 =
array_intersect_key($entry,
array_flip(array('ledger_id', 'account_id', 'crdr', 'amount')));
$le1['comment'] = $entry['ledger_entry_comment'];
$le1_tender = isset($entry['Tender']) ? $entry['Tender'] : null;
// Create the second half of the Double Ledger Entry
if ($transaction['type'] == 'CLOSE') {
$le2 =
array_intersect_key($entry,
array_flip(array('account_id', 'amount')));
$le2['ledger_id'] = $entry['new_ledger_id'];
$le2['crdr'] = strtoupper($this->Account->fundamentalOpposite($le1['crdr']));
$le2['comment'] = "Ledger Balance Forward (b/f)";
}
else {
$le2 =
array_intersect_key($entry,
array_flip(array('amount'))) +
array_intersect_key($transaction,
array_flip(array('ledger_id', 'account_id', 'crdr')));
}
// Create the statement entry
$se =
array_intersect_key($entry,
array_flip(array('type', 'account_id', 'amount',
'effective_date', 'through_date', 'due_date',
'customer_id', 'lease_id',
'charge_entry_id'))) +
array_intersect_key($transaction,
array_flip(array('customer_id', 'lease_id')));
$se['comment'] = $entry['statement_entry_comment'];
// (DISBURSEMENTS will have statement entries created below, when
// assigning credits, and DEPOSITS don't have statement entries)
if (empty($entry['charge_entry_id']) &&
(empty($transaction['customer_id']) ||
($transaction['account_id'] == $this->Account->accountReceivableAccountID() &&
$transaction['crdr'] == 'CREDIT')))
$se = null;
// NSF transactions don't use LedgerEntries
// REVISIT <AP>: 20090731
// Doesn't seem right... probably doing this because of the
// single A/R entry we add below for NSF
if ($entry['type'] == 'SURPLUS' || $subtype === 'NSF')
$le1 = $le1_tender = $le2 = null;
// Replace combined entry with our new individual entries
$entry = compact('le1', 'le1_tender', 'le2', 'se');
}
if ($subtype === 'NSF') {
// REVISIT <AP>: 20090731
// Should we be doing this, or just doing individual ledger entries
// that were created above before we nulled them out
array_unshift($entries,
array('le1' => array('account_id' => $transaction['account_id'],
'crdr' => 'DEBIT',
'amount' => $transaction['amount']),
'le2' => array('account_id' => $this->Account->accountReceivableAccountID(),
'crdr' => 'CREDIT',
'amount' => $transaction['amount'])
));
}
$this->pr(20, compact('transaction', 'entries'));
// Move forward, verifying and saving everything.
$ret = array();
if (!$this->verifyTransaction($transaction, $entries))
return $this->prReturn(array('error' => true) + $ret);
// Save transaction to the database
$this->create();
if (!$this->save($transaction))
return $this->prReturn(array('error' => true) + $ret);
$transaction_stamp = $this->field('stamp');
// Set up our return ids array
$ret['transaction_id'] = $this->id;
$ret['entries'] = array();
$ret['error'] = false;
// Go through the entries
foreach ($entries AS $e_index => &$entry) {
// Ensure these items are null'ed out so we don't
// accidentally pick up stale data.
$le1 = $le1_tender = $le2 = $se = null;
extract($entry);
if (!empty($le1) && !empty($le2)) {
$le1['transaction_id'] = $le2['transaction_id'] = $ret['transaction_id'];
if (isset($le1_tender))
$le1_tender['customer_id'] = $transaction['customer_id'];
$result = $this->LedgerEntry->DoubleEntry->addDoubleEntry($le1, $le2, $le1_tender);
$ret['entries'][$e_index]['DoubleEntry'] = $result;
if ($result['error']) {
$ret['error'] = true;
continue;
}
}
if (!empty($se)) {
$se['transaction_id'] = $ret['transaction_id'];
$se += array('effective_date' => $transaction_stamp);
$result = $this->StatementEntry->addStatementEntry($se);
$ret['entries'][$e_index]['StatementEntry'] = $result;
if ($result['error']) {
$ret['error'] = true;
continue;
}
}
}
if ($transaction['account_id'] == $this->Account->accountReceivableAccountID()
&& !$ret['error']) {
$result = $this->StatementEntry->assignCredits
(null,
($transaction['crdr'] == 'CREDIT'
? $ret['transaction_id']
: null),
($transaction['crdr'] == 'CREDIT' && !empty($transaction['assign_charge_entry_id'])
? $transaction['assign_charge_entry_id']
: null),
(!empty($transaction['disbursement_type'])
? $transaction['disbursement_type']
: null),
$transaction['customer_id'],
$transaction['lease_id']
);
$ret['assigned'] = $result;
if ($result['error'])
$ret['error'] = true;
}
return $this->prReturn($ret);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: addNsf
* - Adds NSF transaction
*/
function addNsf($tender, $stamp) {
$this->prEnter(compact('tender', 'stamp'));
$ret = array();
// Enter the NSF
// This is the transaction pulling money from the bank account
// 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(),
'Entry' => array(array('tender_id' => null,
'account_id' => $this->Account->nsfAccountID(),
'amount' => -1 * $tender['LedgerEntry']['amount'],
))),
$tender['Transaction']['account_id']);
$this->pr(20, compact('bounce_result'));
$ret['bounce'] = $bounce_result;
if ($bounce_result['error'])
return $this->prReturn(array('error' => true) + $ret);
// Since we may have saved the nsf transaction with a null
// timestamp, query it back out of the database to find out
// what timestamp was _really_ specified, for later use.
$bounce = $this->find
('first', array('contain' => false, 'id' => $bounce_result['transaction_id']));
$this->pr(20, compact('bounce'));
$stamp = $bounce['Transaction']['stamp'];
// OK, now move into customer realm, finding all statement
// entries that were affected by the bad payment (tender).
$nsf_ledger_entry = $this->LedgerEntry->find
('first', array
('contain' => array('Transaction' =>
array(//'fields' => array(),
'StatementEntry' =>
array(//'fields' => array(),
),
),
),
'conditions' => array('LedgerEntry.id' => $tender['LedgerEntry']['id']),
));
$this->pr(20, compact('nsf_ledger_entry'));
if (!$nsf_ledger_entry)
return $this->prReturn(array('error' => true) + $ret);
// Build a transaction to adjust all of the statement entries
$rollback = array('Transaction' => array(), 'Entry' => array());
$rollback['Transaction']['stamp'] = $stamp;
$rollback['Transaction']['type'] = 'RECEIPT';
$rollback['Transaction']['crdr'] = 'DEBIT'; // Unused... keeps verifyTx happy
$rollback['Transaction']['account_id'] = $this->Account->nsfAccountID();
$rollback['Transaction']['customer_id'] = $tender['Tender']['customer_id'];
$rollback['Transaction']['amount'] = -1 * $tender['LedgerEntry']['amount'];
foreach ($nsf_ledger_entry['Transaction']['StatementEntry'] AS $disbursement) {
if ($disbursement['type'] === 'SURPLUS') {
$disbursement['type'] = 'VOID';
$this->StatementEntry->id = $disbursement['id'];
$this->StatementEntry->saveField('type', $disbursement['type']);
}
else {
$rollback['Entry'][] =
array('type' => $disbursement['type'],
'amount' => -1 * $disbursement['amount'],
'account_id' => $this->Account->nsfAccountID(),
'customer_id' => $disbursement['customer_id'],
'lease_id' => $disbursement['lease_id'],
'charge_entry_id' => $disbursement['charge_entry_id'],
'effective_date' => $stamp,
);
}
}
// Record the transaction, which will un-pay previously paid
// charges, void any credits, and other similar work.
if (count($rollback['Entry'])) {
$rollback_result = $this->addTransaction($rollback['Transaction'], $rollback['Entry'], 'NSF');
$this->pr(20, compact('rollback', 'rollback_result'));
$ret['rollback'] = $rollback_result;
if ($rollback_result['error'])
return $this->prReturn(array('error' => true) + $ret);
}
// Add NSF Charge
$charge_result = $this->addInvoice
(array('Transaction' => compact('stamp'),
'Entry' =>
array
(array('account_id' => $this->Account->nsfChargeAccountID(),
'effective_date' => $stamp,
// REVISIT <AP>: 20090730
// BAD, BAD, BAD... who would actually
// hardcode a value like this???? ;-)
'amount' => 35,
'comment' => "NSF: " . $tender['Tender']['name'],
),
),
),
$tender['Tender']['customer_id']);
$this->pr(20, compact('charge_result'));
$ret['charge'] = $charge_result;
if ($charge_result['error'])
return $this->prReturn(array('error' => true) + $ret);
$ret['nsf_transaction_id'] = $ret['bounce']['transaction_id'];
if (!empty($ret['rollback']))
$ret['nsf_ledger_entry_id'] = $ret['rollback']['entries'][0]['DoubleEntry']['Entry1']['ledger_entry_id'];
return $this->prReturn($ret + array('error' => false));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: stats
* - Returns summary data from the requested transaction
*/
function stats($id = null, $query = null, $balance_account_id = null) {
$this->prEnter(compact('id', 'query'));
$this->queryInit($query);
unset($query['group']);
if (isset($id)) {
$query['conditions'][] = array('Transaction.id' => $id);
$query['group'] = 'Transaction.id';
}
else
// CakePHP seems to automagically add in our ID as a part
// of the query conditions, but only on a 'first' query,
// not an 'all'. I suppose this is helpful :-/
unset($this->id);
if (empty($query['fields']))
$query['fields'] = array();
$stats = array();
foreach ($this->hasMany AS $table => $association) {
// Only calculate stats for *Entry types
if (!preg_match("/Entry$/", $table) &&
!preg_match("/Entry$/", $association['className']))
continue;
$squery = $query;
$squery['link'][$table] = array('fields' => array());
if ($table == 'LedgerEntry') {
if (isset($balance_account_id)) {
$squery['link']['LedgerEntry']['Account'] = array('fields' => array());
$squery['conditions'][] = array("Account.id" => $balance_account_id);
}
$squery['fields'] = array_merge($squery['fields'],
$this->LedgerEntry->debitCreditFields(true, $balance_account_id != null));
}
elseif ($table == 'StatementEntry') {
$squery['fields'] = array_merge($squery['fields'],
$this->StatementEntry->chargeDisbursementFields(true));
}
else {
$squery['fields'][] = "SUM({$table}.amount) AS total";
$squery['fields'][] = "COUNT({$table}.id) AS entries";
}
$stats[$table] = $this->find('first', $squery);
// REVISIT <AP>: 20090724
// [0][0] is for when we do an 'all' query. This can
// be removed at some point, but I'm keeping it while
// toggling between 'all' and 'first' (testing).
if (isset($stats[$table][0][0]))
$stats[$table] += $stats[$table][0][0];
else
$stats[$table] += $stats[$table][0];
unset($stats[$table][0]);
}
return $this->prReturn($stats);
}
}
?>
-56
View File
@@ -55,50 +55,10 @@ class Unit extends AppModel {
return $this->statusValue('OCCUPIED');
}
function statusCheck($id_or_enum,
$min = null, $min_strict = false,
$max = null, $max_strict = false)
{
$this->prEnter(compact('id_or_enum', 'min', 'min_strict', 'max', 'max_strict'));
if (is_int($id_or_enum)) {
$this->id = $id_or_enum;
$id_or_enum = $this->field('status');
}
$enum_val = $this->statusValue($id_or_enum);
if (isset($min) && is_string($min))
$min = $this->statusValue($min);
if (isset($max) && is_string($max))
$max = $this->statusValue($max);
$this->pr(17, compact('enum_val', 'min', 'min_strict', 'max', 'max_strict'));
if (isset($min) &&
($enum_val < $min ||
($min_strict && $enum_val == $min)))
return $this->prReturn(false);
if (isset($max) &&
($enum_val > $max ||
($max_strict && $enum_val == $max)))
return $this->prReturn(false);
return $this->prReturn(true);
}
function occupied($enum) {
return $this->statusCheck($enum, 'OCCUPIED', false, null, false);
}
function conditionOccupied() {
return ('Unit.status >= ' . $this->statusValue('OCCUPIED'));
}
function vacant($enum) {
return $this->statusCheck($enum, 'UNAVAILABLE', true, 'OCCUPIED', true);
}
function conditionVacant() {
return ('Unit.status BETWEEN ' .
($this->statusValue('UNAVAILABLE')+1) .
@@ -106,16 +66,10 @@ class Unit extends AppModel {
($this->statusValue('OCCUPIED')-1));
}
function unavailable($enum) {
return $this->statusCheck($enum, null, false, 'UNAVAILABLE', false);
}
function conditionUnavailable() {
return ('Unit.status <= ' . $this->statusValue('UNAVAILABLE'));
}
function available($enum) { return $this->vacant($enum); }
/**************************************************************************
**************************************************************************
@@ -181,16 +135,6 @@ class Unit extends AppModel {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: update
* - Update any cached or calculated fields
*/
function update($id) {
}
/**************************************************************************
**************************************************************************
**************************************************************************

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

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