getting closer to a workable NSF solution. I don't like it, but it might allow us to move forward in the short term. This solution required a stupid kludge to get CakePHP to work with the necessary query, which sucks but is not too cumbersome. What isn't working at the moment, is for the NSF to show up on the lease account, which is what I'll try to work out next. Also, the monies deposited are not trackable, since I'm not reconciling them (due to the sign flip). Not sure if there is an easily workable solution. Also, to get the collected rent report to show this negative income, it requires the bank account be part of the query, which I accomplish in the short term by setting the 'payable' flag. I may need to fix/kludge this by running the NSF through the receipt account and adding the NSF account to the list on the collected page.
git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@331 97e9348a-65ac-dc4b-aefc-98561f571b83
This commit is contained in:
@@ -58,6 +58,16 @@ class LedgerEntry extends AppModel {
|
||||
'foreignKey' => 'credit_ledger_entry_id',
|
||||
'associationForeignKey' => 'debit_ledger_entry_id',
|
||||
),
|
||||
// STUPID CakePHP bug screws up when using Containable
|
||||
// and CLASS contains CLASS. This extra HABTM give the
|
||||
// option of multiple depths on one CLASS, since there
|
||||
// isn't an alias specification for Containable.
|
||||
'DebitReconciliationLedgerEntry2' => array(
|
||||
'className' => 'LedgerEntry',
|
||||
'joinTable' => 'reconciliations',
|
||||
'foreignKey' => 'credit_ledger_entry_id',
|
||||
'associationForeignKey' => 'debit_ledger_entry_id',
|
||||
),
|
||||
'CreditReconciliationLedgerEntry' => array(
|
||||
'className' => 'LedgerEntry',
|
||||
'joinTable' => 'reconciliations',
|
||||
|
||||
@@ -22,20 +22,22 @@ class MonetarySource extends AppModel {
|
||||
* function: nsf
|
||||
* - Flags the ledger entry as having insufficient funds
|
||||
* - NOTE: nsf only works if given the monetary source id
|
||||
* to transaction t2b, below
|
||||
* to transaction e3, below
|
||||
*
|
||||
* FEE RENT A/R RECEIPT CHECK NSF BANK
|
||||
* ------- ------- ------- ------- ------- ------- -------
|
||||
* | |50 50| | | | | e1
|
||||
* | |30 30| | | | | t1 e1a : R e2/e6a :
|
||||
* | |20 20| | | | | t1 e1b : R e2/e6b :
|
||||
* | | | | | | |
|
||||
* | | |50 50| | | | e2a
|
||||
* | | | |50 50| | | e2b
|
||||
* | | |50 50| | | | t2 e2 : R e3 : R e1a/e1b
|
||||
* | | | |50 50| | | t2 e3 : R e4 : R e2
|
||||
* | | | | | | |
|
||||
* | | | | |50 | 50| e3
|
||||
* | | | | |50 | 50| t3 e4 : R e5 : R e3
|
||||
* | | | | | | |
|
||||
* | | | | | 50| |50 e4
|
||||
* | | 50| | | |50 | e5a
|
||||
* |35 | 35| | | | | e5b
|
||||
* | | | | | 50| |50 t4 e5 : R e4 : R e6a/e6b
|
||||
* | | 30| | | |30 | t5 e6a : : R e5
|
||||
* | | 20| | | |20 | t5 e6b : : R e5
|
||||
* |35 | 35| | | | | t5 e7
|
||||
|
||||
* - NOTE
|
||||
* The above example is great, except it leave no way to resolve
|
||||
@@ -43,17 +45,19 @@ class MonetarySource extends AppModel {
|
||||
* perhaps we need to run a negative credit to A/R, which we can
|
||||
* use to reconcile against the Rent<->A/R double entry:
|
||||
*
|
||||
* | | | | | 50| |50 e4
|
||||
* | | |-50 | | -50| | e5a
|
||||
* |35 | 35| | | | | e5b
|
||||
* | | | | | 50| |50 t4 e5 : R e4 : R e6a/e6b (?)
|
||||
* | | |-30 | | -30| | t5 e6a : R e1a : R e5 (?)
|
||||
* | | |-20 | | -20| | t5 e6b : R e1b : R e5 (?)
|
||||
* |35 | 35| | | | | t5 e7
|
||||
|
||||
* OR perhaps even a negative entry all the way through to the
|
||||
* bank, making the NSF appear not as a withdrawal, but as a
|
||||
* negative deposit (i.e, and adjustment, just like it really is):
|
||||
*
|
||||
* | | | | | |-50 -50| e4
|
||||
* | | |-50 | | -50| | e5a
|
||||
* |35 | 35| | | | | e5b
|
||||
* | | | | | |-50 -50| t4 e5 : R e4 (?) : R e6a/e6b
|
||||
* | | |-30 | | -30| | t5 e6a : R e1a : R e5
|
||||
* | | |-20 | | -20| | t5 e6b : R e1b : R e5
|
||||
* |35 | 35| | | | | t5 e7
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -67,14 +71,14 @@ class MonetarySource extends AppModel {
|
||||
$source = $this->find
|
||||
('first',
|
||||
array('contain' =>
|
||||
array(/* e2b */
|
||||
array(/* e3 */
|
||||
'LedgerEntry' =>
|
||||
array('Transaction.id',
|
||||
'MonetarySource.id',
|
||||
'Customer.id',
|
||||
'Lease.id',
|
||||
|
||||
/* e2b debit */
|
||||
/* e3 debit */
|
||||
'DebitLedger' => /* e.g. CHECK Ledger */
|
||||
array('fields' => array(),
|
||||
|
||||
@@ -88,7 +92,7 @@ class MonetarySource extends AppModel {
|
||||
),
|
||||
),
|
||||
|
||||
/* e2b credit */
|
||||
/* e3 credit */
|
||||
'CreditLedger' => /* i.e. RECEIPT Ledger */
|
||||
array('fields' => array('id'),
|
||||
'Account' => /* i.e. RECEIPT Account */
|
||||
@@ -98,9 +102,9 @@ class MonetarySource extends AppModel {
|
||||
),
|
||||
),
|
||||
|
||||
/* e2a */
|
||||
/* e2 */
|
||||
'DebitReconciliationLedgerEntry' =>
|
||||
array(/* e2a credit */
|
||||
array(/* e2 credit */
|
||||
'CreditLedger' => /* i.e. A/R Ledger */
|
||||
array('fields' => array(),
|
||||
|
||||
@@ -112,23 +116,14 @@ class MonetarySource extends AppModel {
|
||||
),
|
||||
|
||||
/* e1 */
|
||||
'DebitReconciliationLedgerEntry' =>
|
||||
array(/* e1 credit */
|
||||
'CreditLedger' => /* e.g. Rent Ledger */
|
||||
array('fields' => array(),
|
||||
|
||||
'Account' => /* e.g. Rent Account */
|
||||
array('fields' => array(),
|
||||
'conditions' =>
|
||||
array('Account.id' => $A->accountReceivableAccountID()),
|
||||
),
|
||||
),
|
||||
),
|
||||
// STUPID CakePHP bug screws up CLASS contains CLASS.
|
||||
// Use the same class, but with different name.
|
||||
'DebitReconciliationLedgerEntry2',
|
||||
),
|
||||
|
||||
/* e3 */
|
||||
/* e4 */
|
||||
'CreditReconciliationLedgerEntry' =>
|
||||
array(/* e3 debit */
|
||||
array(/* e4 debit */
|
||||
'DebitLedger' => /* e.g. BANK Ledger */
|
||||
array('fields' => array('id'),
|
||||
'Account' => /* e.g. BANK Account */
|
||||
@@ -153,86 +148,95 @@ class MonetarySource extends AppModel {
|
||||
$ar_account_id = $A->accountReceivableAccountID();
|
||||
|
||||
$total = 0;
|
||||
$nsf_rec_ids = array();
|
||||
$e6_debit_rec_ids = array();
|
||||
$e6_credit_rec_ids = array();
|
||||
|
||||
$transaction_id = null;
|
||||
// FOR EACH e2b
|
||||
foreach ($source['LedgerEntry'] AS $entry) {
|
||||
// Count number of e3 entries
|
||||
if (count($entry['CreditReconciliationLedgerEntry']) < 1)
|
||||
$e5_transaction_id = null;
|
||||
foreach ($source['LedgerEntry'] AS $e3) {
|
||||
// We expect only a single e4 entry
|
||||
$e4 = $e3['CreditReconciliationLedgerEntry'];
|
||||
if (count($e4) < 1)
|
||||
continue;
|
||||
if (count($entry['CreditReconciliationLedgerEntry']) > 1)
|
||||
die('Too many CRLEs');
|
||||
if (count($e4) > 1)
|
||||
die('Too many e4 entries');
|
||||
|
||||
// e2b amount
|
||||
$amount = $entry['amount'];
|
||||
// Pullup e4 from the single member array
|
||||
$e4 = $e4[0];
|
||||
|
||||
// e3 account
|
||||
$bank_account_id = $entry['CreditReconciliationLedgerEntry'][0]['DebitLedger']['account_id'];
|
||||
// e3 amount
|
||||
$amount = $e3['amount'];
|
||||
$amount *= -1;
|
||||
|
||||
pr(array('checkpoint' => 'outerloop',
|
||||
compact('id', $amount, 'bank_account_id', $entry)));
|
||||
// e4 account
|
||||
$bank_account_id = $e4['DebitLedger']['account_id'];
|
||||
|
||||
// post new e4
|
||||
$ids = $A->postLedgerEntry
|
||||
(array('transaction_id' => $transaction_id),
|
||||
// post new e5
|
||||
$e5_ids = $A->postLedgerEntry
|
||||
(array('transaction_id' => $e5_transaction_id),
|
||||
null,
|
||||
array('debit_ledger_id' => $A->currentLedgerID($nsf_account_id),
|
||||
'credit_ledger_id' => $A->currentLedgerID($bank_account_id),
|
||||
array('debit_ledger_id' => $A->currentLedgerID($bank_account_id),
|
||||
'credit_ledger_id' => $A->currentLedgerID($nsf_account_id),
|
||||
'effective_date' => $stamp,
|
||||
'amount' => $amount,
|
||||
'lease_id' => $entry['lease_id'],
|
||||
'customer_id' => $entry['customer_id'],
|
||||
'lease_id' => $e3['lease_id'],
|
||||
'customer_id' => $e3['customer_id'],
|
||||
'comment' => "NSF of Monetary Source #{$id}",
|
||||
),
|
||||
array('credit' => array
|
||||
(array('LedgerEntry' => array
|
||||
('id' => $entry['CreditReconciliationLedgerEntry'][0]['id'],
|
||||
'amount' => $amount,
|
||||
))),
|
||||
/* ), */
|
||||
/* array('credit' => array */
|
||||
/* (array('LedgerEntry' => array */
|
||||
/* ('id' => $e4['id'], */
|
||||
/* 'amount' => $amount, */
|
||||
/* ))), */
|
||||
));
|
||||
|
||||
if ($ids['error'])
|
||||
if ($e5_ids['error'])
|
||||
return null;
|
||||
|
||||
pr(array('checkpoint' => 'insert 1',
|
||||
compact('ids')));
|
||||
pr(array('checkpoint' => 'Posted Ledger Entry e5',
|
||||
compact('e5_ids')));
|
||||
|
||||
$e6_debit_rec_ids[]
|
||||
= array('LedgerEntry' => array('id' => $e5_ids['id'], 'amount' => $amount));
|
||||
|
||||
foreach ($e3['DebitReconciliationLedgerEntry'] AS $e2) {
|
||||
foreach ($e2['DebitReconciliationLedgerEntry2'] AS $e1) {
|
||||
$e6_credit_rec_ids[]
|
||||
= array('LedgerEntry' => array('id' => $e1['id'], 'amount' => -1*$e1['Reconciliation']['amount']));
|
||||
}
|
||||
}
|
||||
|
||||
$total += $amount;
|
||||
$nsf_rec_ids[]
|
||||
= array('LedgerEntry' => array('id' => $ids['id'], 'amount' => $amount));
|
||||
}
|
||||
|
||||
// Cheat for now
|
||||
$lease_id = $source['LedgerEntry'][0]['lease_id'];
|
||||
$customer_id = $source['LedgerEntry'][0]['customer_id'];
|
||||
|
||||
// post new e5a
|
||||
$ids = $A->postLedgerEntry
|
||||
// post new e6
|
||||
$e6_ids = $A->postLedgerEntry
|
||||
(null,
|
||||
null,
|
||||
array('debit_ledger_id' => $A->currentLedgerID($ar_account_id),
|
||||
'credit_ledger_id' => $A->currentLedgerID($nsf_account_id),
|
||||
array('debit_ledger_id' => $A->currentLedgerID($nsf_account_id),
|
||||
'credit_ledger_id' => $A->currentLedgerID($ar_account_id),
|
||||
'effective_date' => $stamp,
|
||||
'amount' => $total,
|
||||
'lease_id' => $lease_id,
|
||||
'customer_id' => $customer_id,
|
||||
'comment' => "NSF back to A/R from Monetary Source #{$id}",
|
||||
),
|
||||
array('credit' => $nsf_rec_ids)
|
||||
array('debit' => $e6_debit_rec_ids,
|
||||
'credit' => $e6_credit_rec_ids)
|
||||
);
|
||||
|
||||
if ($ids['error'])
|
||||
if ($e6_ids['error'])
|
||||
return null;
|
||||
|
||||
pr(array('checkpoint' => 'insert 2',
|
||||
compact('ids')));
|
||||
pr(array('checkpoint' => 'Posted Ledger Entry e6',
|
||||
compact('e6_ids', 'e6_debit_rec_ids', 'e6_credit_rec_ids')));
|
||||
|
||||
$tid = $ids['transaction_id'];
|
||||
|
||||
// post new e5b
|
||||
$ids = $A->postLedgerEntry
|
||||
(array('transaction_id' => $tid),
|
||||
// post new e7
|
||||
$e7_ids = $A->postLedgerEntry
|
||||
(array('transaction_id' => $e6_ids['transaction_id']),
|
||||
null,
|
||||
array('debit_ledger_id' => $A->currentLedgerID($ar_account_id),
|
||||
'credit_ledger_id' => $A->currentLedgerID($nsf_fee_account_id),
|
||||
@@ -244,11 +248,11 @@ class MonetarySource extends AppModel {
|
||||
)
|
||||
);
|
||||
|
||||
if ($ids['error'])
|
||||
if ($e7_ids['error'])
|
||||
return null;
|
||||
|
||||
pr(array('checkpoint' => 'insert 3',
|
||||
compact('ids')));
|
||||
pr(array('checkpoint' => 'Posted Ledger Entry e7',
|
||||
compact('e7_ids')));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user