Finally, finally... a working version for payment entry. The current schema is working well, and seems to handle our technical needs. However, it does seem to be very confusing with the extra accounts. Nonetheless, it does work and so I'll keep going down this path. This checkin also includes a mechanism to close the books on an account (by closing the underlying ledger) and start a new ledger. One of the decisions worth revisiting is separating out ledger entries that are really part of the same transaction. Without this change, inspecting a transaction results in the transaction total being off by a factor of two, since all money movement is in their twice (once for the expected reason, and again to hit the invoice/receipt ledger).

git-svn-id: file:///svn-source/pmgr/branches/invoice_receipt_20090629/site@195 97e9348a-65ac-dc4b-aefc-98561f571b83
This commit is contained in:
abijah
2009-07-01 08:17:31 +00:00
parent 3550bf775c
commit dfe20e7ef9
16 changed files with 412 additions and 202 deletions

View File

@@ -92,6 +92,23 @@ class Account extends AppModel {
function invoiceAccountID() { return $this->nameToID('Invoice'); }
function receiptAccountID() { return $this->nameToID('Receipt'); }
/**************************************************************************
**************************************************************************
**************************************************************************
* function: currentLedgerID
* - Returns the current ledger ID of the account
*/
function currentLedgerID($id) {
$this->cacheQueries = true;
$item = $this->find('first', array
('contain' => 'CurrentLedger',
'conditions' => array('Account.id' => $id),
));
$this->cacheQueries = false;
return $item['CurrentLedger']['id'];
}
/**************************************************************************
**************************************************************************
@@ -131,6 +148,34 @@ class Account extends AppModel {
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: closeCurrentLedger
* - Closes the current account ledger, and opens a new one
* with the old balance carried forward.
*/
function closeCurrentLedger($id = null) {
$contain = array('CurrentLedger' => array('fields' => array('CurrentLedger.id')));
$this->cacheQueries = true;
$account = $this->find('all', array
('contain' => $contain,
'fields' => array(),
'conditions' =>
$id ? array(array('Account.id' => $id)) : array()
));
$this->cacheQueries = false;
//pr(compact('id', 'account'));
foreach ($account AS $acct) {
if (!$this->Ledger->closeLedger($acct['CurrentLedger']['id']))
return false;
}
return true;
}
/**************************************************************************
**************************************************************************
**************************************************************************
@@ -222,7 +267,7 @@ class Account extends AppModel {
('fields' => array(),
"LedgerEntry" => array
('class' => "{$ucfund}LedgerEntry",
'fields' => array('id', 'amount'),
'fields' => array('id', 'customer_id', 'lease_id', 'amount'),
"ReconciliationLedgerEntry" => array
('class' => "{$ucfund}ReconciliationLedgerEntry",
'fields' => array

View File

@@ -44,6 +44,72 @@ class Ledger extends AppModel {
);
/**************************************************************************
**************************************************************************
**************************************************************************
* function: closeLedger
* - Closes the current ledger, and returns a fresh one
*/
function closeLedger($id) {
$this->recursive = -1;
$stamp = date('Y-m-d G:i:s');
$this->id = $id;
$this->read();
$this->data['Ledger']['close_stamp'] = $stamp;
$this->data['Ledger']['closed'] = 1;
$this->save($this->data, false);
$stats = $this->stats($id);
$this->read();
$this->data['Ledger']['id'] = null;
$this->data['Ledger']['closed'] = 0;
$this->data['Ledger']['open_stamp'] = $stamp;
$this->data['Ledger']['close_stamp'] = null;
$this->data['Ledger']['comment'] = null;
++$this->data['Ledger']['sequence'];
$this->id = null;
$this->save($this->data, false);
//pr($this->data);
if ($stats['balance'] == 0)
return $this->id;
$this->read();
$ftype = $this->Account->fundamentalType($this->data['Ledger']['account_id']);
$otype = $this->Account->fundamentalOpposite($ftype);
// Create a transaction for balance transfer
$transaction = new Transaction();
$transaction->create();
if (!$transaction->save(array(),
array('validate' => false,
))) {
return null;
}
// Create an entry to carry the balance forward
$carry_entry_data = array
($ftype.'_ledger_id' => $this->id,
$otype.'_ledger_id' => $id,
'transaction_id' => $transaction->id,
'amount' => $stats['balance'],
'comment' => "Ledger Balance Forward",
);
$carry_entry = new LedgerEntry();
$carry_entry->create();
if (!$carry_entry->save($carry_entry_data,
array('validate' => false,
))) {
return null;
}
return $this->id;
}
/**************************************************************************
**************************************************************************
**************************************************************************

View File

@@ -8,6 +8,16 @@ class LedgerEntry extends AppModel {
'amount' => array('money')
);
var $hasMany = array(
'DebitReconciliation' => array(
'className' => 'Reconciliation',
'foreignKey' => 'debit_ledger_entry_id',
),
'CreditReconciliation' => array(
'className' => 'Reconciliation',
'foreignKey' => 'credit_ledger_entry_id',
),
);
var $belongsTo = array(
'MonetarySource',
'Transaction',

15
models/reconciliation.php Normal file
View File

@@ -0,0 +1,15 @@
<?php
class Reconciliation extends AppModel {
var $belongsTo = array(
'DebitLedgerEntry' => array(
'className' => 'LedgerEntry',
//'foreignKey' => 'credit_ledger_entry_id',
),
'CreditLedgerEntry' => array(
'className' => 'LedgerEntry',
//'foreignKey' => 'credit_ledger_entry_id',
),
);
}

View File

@@ -7,7 +7,6 @@ class Transaction extends AppModel {
/* ); */
var $belongsTo = array(
'Customer',
);
var $hasMany = array(
@@ -17,10 +16,15 @@ class Transaction extends AppModel {
function beforeSave() {
if(!empty($this->data['Transaction']['stamp'])) {
if(isset($this->data['Transaction']['stamp']) &&
$this->data['Transaction']['stamp'] !== 'CURRENT_TIMESTAMP') {
$this->data['Transaction']['stamp'] =
$this->dateFormatBeforeSave($this->data['Transaction']['stamp']);
}
else {
$this->data['Transaction']['stamp'] = null;
}
return true;
}