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
This commit is contained in:
abijah
2009-06-23 19:04:41 +00:00
parent 7aa1100cac
commit 80f8bd36d5
18 changed files with 502 additions and 409 deletions

View File

@@ -866,15 +866,18 @@ LOCK TABLES `pmgr_accounts` WRITE;
INSERT INTO `pmgr_accounts` (`type`, `name`, `trackable`) INSERT INTO `pmgr_accounts` (`type`, `name`, `trackable`)
VALUES VALUES
('ASSET', 'A/R', 1), ('ASSET', 'A/R', 1),
('ASSET', 'Invoice', 1),
('ASSET', 'Receipt', 1),
('LIABILITY', 'A/P', 1), ('LIABILITY', 'A/P', 1),
('LIABILITY', 'Tax', 0), ('LIABILITY', 'Tax', 0),
('LIABILITY', 'Customer Credit', 1), ('LIABILITY', 'Customer Credit', 1),
('ASSET', 'Bank', 0), ('ASSET', 'Bank', 0),
('ASSET', 'Payment', 0), ('ASSET', 'Till', 0),
('LIABILITY', 'Security Deposit', 1), ('LIABILITY', 'Security Deposit', 1),
('INCOME', 'Rent', 0), ('INCOME', 'Rent', 0),
('INCOME', 'Late Charge', 0), ('INCOME', 'Late Charge', 0),
('EXPENSE', 'Concession', 0); ('EXPENSE', 'Concession', 0),
('EXPENSE', 'Bad Debt', 0);
UNLOCK TABLES; UNLOCK TABLES;
@@ -965,6 +968,8 @@ CREATE TABLE `pmgr_ledger_entries` (
`name` VARCHAR(80) DEFAULT NULL, `name` VARCHAR(80) DEFAULT NULL,
`monetary_source_id` INT(10) UNSIGNED DEFAULT NULL, -- NULL if internal transfer `monetary_source_id` INT(10) UNSIGNED DEFAULT NULL, -- NULL if internal transfer
`transaction_id` INT(10) UNSIGNED NOT NULL, `transaction_id` INT(10) UNSIGNED NOT NULL,
`customer_id` INT(10) UNSIGNED DEFAULT NULL,
`lease_id` INT(10) UNSIGNED DEFAULT NULL,
`amount` FLOAT(12,2) NOT NULL, `amount` FLOAT(12,2) NOT NULL,
`debit_ledger_id` INT(10) UNSIGNED NOT NULL, `debit_ledger_id` INT(10) UNSIGNED NOT NULL,
@@ -986,8 +991,7 @@ CREATE TABLE `pmgr_reconciliations` (
`debit_ledger_entry_id` INT(10) UNSIGNED NOT NULL, `debit_ledger_entry_id` INT(10) UNSIGNED NOT NULL,
`credit_ledger_entry_id` INT(10) UNSIGNED NOT NULL, `credit_ledger_entry_id` INT(10) UNSIGNED NOT NULL,
`terminal_ledger_entry_id` INT(10) UNSIGNED DEFAULT NULL, `amount` FLOAT(12,2) NOT NULL,
`amount` FLOAT(12,2) NOT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

View File

@@ -4,6 +4,8 @@ use DBI;
use Data::Dumper; use Data::Dumper;
use File::Copy; use File::Copy;
my $use_ir = 0;
# Internally adjust all numbers coming from the database to # Internally adjust all numbers coming from the database to
# be in inches. Not necessary to go to this detail, but the # be in inches. Not necessary to go to this detail, but the
# actual units used is irrelevant, provided everything is to # actual units used is irrelevant, provided everything is to
@@ -145,7 +147,13 @@ sub executeSchema {
sub buildTables { sub buildTables {
foreach my $table (values %{$newdb{'tables'}}) { foreach my $table (values %{$newdb{'tables'}}) {
printf(STDERR "%-30s : %d rows\n", $table->{'name'}, int(@{$table->{'rows'}})); my $count = 0;
foreach (@{$table->{'rows'}}) {
next unless defined $_;
++$count;
}
printf(STDERR "%-30s : %d rows\n", $table->{'name'}, $count);
foreach (@{$table->{'rows'}}) { foreach (@{$table->{'rows'}}) {
next unless defined $_; next unless defined $_;
@@ -437,9 +445,9 @@ foreach $row (@$result) {
'comment' => undef }); 'comment' => undef });
$newdb{'lookup'}{'account'}{$row->{'name'}} $newdb{'lookup'}{'account'}{$row->{'name'}}
= {'account' => $row->{'id'}, = {'account_id' => $row->{'id'},
'tillable' => $row->{'tillable'}, 'tillable' => $row->{'tillable'},
'ledger' => $newdb{'tables'}{'ledgers'}{'autoid'} }; 'ledger_id' => $newdb{'tables'}{'ledgers'}{'autoid'} };
if ((!defined $newdb{'tables'}{'accounts'}{'autoid'}) || if ((!defined $newdb{'tables'}{'accounts'}{'autoid'}) ||
$row->{'id'} > $newdb{'tables'}{'accounts'}{'autoid'}) { $row->{'id'} > $newdb{'tables'}{'accounts'}{'autoid'}) {
@@ -449,7 +457,7 @@ foreach $row (@$result) {
# For compatibility, while deciding on account names # For compatibility, while deciding on account names
$newdb{'lookup'}{'account'}{'Cash'} $newdb{'lookup'}{'account'}{'Cash'}
= $newdb{'lookup'}{'account'}{'Payment'}; = $newdb{'lookup'}{'account'}{'Till'};
$newdb{'lookup'}{'charge_type'} = {}; $newdb{'lookup'}{'charge_type'} = {};
$newdb{'lookup'}{'charge_type'}{'Rent'} = $newdb{'lookup'}{'charge_type'}{'Rent'} =
@@ -474,15 +482,15 @@ foreach $row (@$result) {
$newdb{'lookup'}{'payment_type'} = {}; $newdb{'lookup'}{'payment_type'} = {};
$newdb{'lookup'}{'payment_type'}{1} $newdb{'lookup'}{'payment_type'}{1}
= { 'name' => 'Cash', 'account' => 'Cash', 'monetary_type' => $newdb{'lookup'}{'monetary_type'}{'Cash'} }; = { 'name' => 'Cash', 'account_name' => 'Cash', 'monetary_type' => $newdb{'lookup'}{'monetary_type'}{'Cash'} };
$newdb{'lookup'}{'payment_type'}{2} $newdb{'lookup'}{'payment_type'}{2}
= { 'name' => 'Check', 'account' => 'Cash', 'monetary_type' => $newdb{'lookup'}{'monetary_type'}{'Check'} }; = { 'name' => 'Check', 'account_name' => 'Cash', 'monetary_type' => $newdb{'lookup'}{'monetary_type'}{'Check'} };
$newdb{'lookup'}{'payment_type'}{3} $newdb{'lookup'}{'payment_type'}{3}
= { 'name' => 'Money Order', 'account' => 'Cash', 'monetary_type' => $newdb{'lookup'}{'monetary_type'}{'Money Order'} }; = { 'name' => 'Money Order', 'account_name' => 'Cash', 'monetary_type' => $newdb{'lookup'}{'monetary_type'}{'Money Order'} };
$newdb{'lookup'}{'payment_type'}{4} $newdb{'lookup'}{'payment_type'}{4}
= { 'name' => 'ACH', 'account' => 'Bank', 'monetary_type' => $newdb{'lookup'}{'monetary_type'}{'ACH'} }; = { 'name' => 'ACH', 'account_name' => 'Bank', 'monetary_type' => $newdb{'lookup'}{'monetary_type'}{'ACH'} };
$newdb{'lookup'}{'payment_type'}{12} $newdb{'lookup'}{'payment_type'}{12}
= { 'name' => 'Concession', 'account' => 'Concession', 'monetary_type' => $newdb{'lookup'}{'monetary_type'}{'Other Non-Tillable'} }; = { 'name' => 'Concession', 'account_name' => 'Concession', 'monetary_type' => $newdb{'lookup'}{'monetary_type'}{'Other Non-Tillable'} };
$newdb{'ids'}{'monetary_source'} = {}; $newdb{'ids'}{'monetary_source'} = {};
@@ -490,14 +498,14 @@ $newdb{'ids'}{'monetary_source'}{'internal'} = undef;
addRow('monetary_sources', addRow('monetary_sources',
{ 'monetary_type_id' => $newdb{'lookup'}{'monetary_type'}{'Cash'}{'id'}, { 'monetary_type_id' => $newdb{'lookup'}{'monetary_type'}{'Cash'}{'id'},
'name' => 'Cash Source', 'name' => 'Cash',
'comment' => 'Monetary source used for any cash transaction' }); 'comment' => 'Monetary source used for any cash transaction' });
$newdb{'ids'}{'monetary_source'}{'Cash'} = $newdb{'ids'}{'monetary_source'}{'Cash'} =
$newdb{'tables'}{'monetary_sources'}{'autoid'}; $newdb{'tables'}{'monetary_sources'}{'autoid'};
addRow('monetary_sources', addRow('monetary_sources',
{ 'monetary_type_id' => $newdb{'lookup'}{'monetary_type'}{'Other Non-Tillable'}{'id'}, { 'monetary_type_id' => $newdb{'lookup'}{'monetary_type'}{'Other Non-Tillable'}{'id'},
'name' => 'Closing Monies Credited', 'name' => 'Closing',
'comment' => 'Credited at the closing table' }); 'comment' => 'Credited at the closing table' });
$newdb{'ids'}{'monetary_source'}{'Closing'} = $newdb{'ids'}{'monetary_source'}{'Closing'} =
$newdb{'tables'}{'monetary_sources'}{'autoid'}; $newdb{'tables'}{'monetary_sources'}{'autoid'};
@@ -660,35 +668,21 @@ foreach $row (@{query($sdbh, $query)}) {
$newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'id'} = $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'id'} =
$newdb{'tables'}{'contacts'}{'autoid'}; $newdb{'tables'}{'contacts'}{'autoid'};
$newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'account_id'} =
# Every customer gets their own account $newdb{'lookup'}{'account'}{'A/R'}{'account_id'};
addRow('accounts', $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'ledger_id'} =
{ 'type' => 'ASSET', $newdb{'lookup'}{'account'}{'A/R'}{'ledger_id'};
'trackable' => 1,
'name' => ('Customer #' . ($newdb{'tables'}{'customers'}{'autoid'}+1) .
' ('.$newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'name'} . ')'),
'comment' => undef });
#'comment' => 'For direct customer transaction, NOT lease charges!' });
addRow('ledgers',
{ 'account_id' => $newdb{'tables'}{'accounts'}{'autoid'},
'open_stamp' => '2009-01-01',
'comment' => undef });
$newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'account'} =
$newdb{'tables'}{'accounts'}{'autoid'};
$newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'ledger'} =
$newdb{'tables'}{'ledgers'}{'autoid'};
addRow('customers', addRow('customers',
{ 'name' => "$row->{'LastName'}, $row->{'FirstName'}", { 'name' => "$row->{'LastName'}, $row->{'FirstName'}",
'primary_contact_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'id'}, 'primary_contact_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'id'},
'account_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'account'} }); 'account_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'account_id'} });
$newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'cust'} = $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'customer_id'} =
$newdb{'tables'}{'customers'}{'autoid'}; $newdb{'tables'}{'customers'}{'autoid'};
addRow('contacts_customers', addRow('contacts_customers',
{ 'customer_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'cust'}, { 'customer_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'customer_id'},
'contact_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'id'}, 'contact_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'id'},
'type' => 'TENANT' }, 'type' => 'TENANT' },
1); 1);
@@ -754,7 +748,7 @@ foreach $row (@{query($sdbh, $query)}) {
$newdb{'tables'}{'contacts'}{'autoid'}; $newdb{'tables'}{'contacts'}{'autoid'};
addRow('contacts_customers', addRow('contacts_customers',
{ 'customer_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'cust'}, { 'customer_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'customer_id'},
'contact_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'alt'}, 'contact_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'alt'},
'type' => 'ALTERNATE' }, 'type' => 'ALTERNATE' },
1); 1);
@@ -800,52 +794,26 @@ $query = "SELECT L.*, A.TenantID FROM TenantLedger L LEFT JOIN `Access` A ON A.L
foreach $row (@{query($sdbh, $query)}) { foreach $row (@{query($sdbh, $query)}) {
$newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}} $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}
= { 'cust' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'cust'} }; = { 'customer_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'customer_id'} };
if (1) { $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'account_id'}
# Every lease gets its own account = $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'account_id'};
addRow('accounts', $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'ledger_id'}
{ 'type' => 'ASSET', = $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'ledger_id'};
'trackable' => 1,
'name' => ('Lease #' . $row->{'LedgerID'}
. ' ('.$newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'name'} . ')'),
'comment' => undef });
#'comment' => 'For lease related transaction, NOT personal charges!' });
addRow('ledgers',
{ 'account_id' => $newdb{'tables'}{'accounts'}{'autoid'},
'open_stamp' => datefmt($row->{'DateIn'}),
'comment' => undef });
$newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'account'}
= $newdb{'tables'}{'accounts'}{'autoid'};
$newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'ledger'}
= $newdb{'tables'}{'ledgers'}{'autoid'};
}
else {
$newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'account'}
= $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'account'};
$newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'ledger'}
= $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'ledger'};
}
$newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'cust_account'}
= $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'account'};
$newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'cust_ledger'}
= $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'ledger'};
addRow('leases', addRow('leases',
{ 'number' => $row->{'LedgerID'}, { 'number' => $row->{'LedgerID'},
'lease_type_id' => $newdb{'tables'}{'lease_types'}{'autoid'}, 'lease_type_id' => $newdb{'tables'}{'lease_types'}{'autoid'},
'unit_id' => $newdb{'lookup'}{'unit'}{$row->{'UnitID'}}{'id'}, 'unit_id' => $newdb{'lookup'}{'unit'}{$row->{'UnitID'}}{'id'},
'customer_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'cust'}, 'customer_id' => $newdb{'lookup'}{'tenant'}{$row->{'TenantID'}}{'customer_id'},
'account_id' => $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'account'}, 'account_id' => $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'account_id'},
'lease_date' => datefmt($row->{'DateIn'}), 'lease_date' => datefmt($row->{'DateIn'}),
'movein_date' => datefmt($row->{'DateIn'}), 'movein_date' => datefmt($row->{'DateIn'}),
'moveout_date' => datefmt($row->{'DateOut'}), 'moveout_date' => datefmt($row->{'DateOut'}),
'close_date' => datefmt($row->{'DateClosed'}), 'close_date' => datefmt($row->{'DateClosed'}),
'amount' => $row->{'Rent'} }); 'amount' => $row->{'Rent'} });
$newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'lease'} = $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'lease_id'} =
$newdb{'tables'}{'leases'}{'autoid'}; $newdb{'tables'}{'leases'}{'autoid'};
} }
@@ -868,6 +836,8 @@ $newdb{'lookup'}{'charge'} = {};
$query = "SELECT * FROM Charges ORDER BY ChargeID"; $query = "SELECT * FROM Charges ORDER BY ChargeID";
foreach $row (@{query($sdbh, $query)}) { foreach $row (@{query($sdbh, $query)}) {
my $credit_ledger_id;
my $ledger_entry_id;
addRow('transactions', addRow('transactions',
{ 'stamp' => datefmt($row->{'ChargeDate'}), { 'stamp' => datefmt($row->{'ChargeDate'}),
@@ -875,57 +845,93 @@ foreach $row (@{query($sdbh, $query)}) {
$newdb{'lookup'}{'charge'}{$row->{'ChargeID'}} $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}
= { 'tx' => $newdb{'tables'}{'transactions'}{'autoid'}, = { 'tx' => $newdb{'tables'}{'transactions'}{'autoid'},
'ledger' => $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'ledger'}, 'ledger_id' => $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'ledger_id'},
#'ledger_id' => $newdb{'lookup'}{'account'}{'Invoice'}{'ledger_id'},
'amount' => $row->{'ChargeAmount'}, 'amount' => $row->{'ChargeAmount'},
'tax_amount' => $row->{'TaxAmount'}, 'tax_amount' => $row->{'TaxAmount'},
'customer_id' => $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'customer_id'},
'lease_id' => $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'lease_id'},
}; };
addRow('ledger_entries', $credit_ledger_id = $newdb{'lookup'}{'charge_type'}{$row->{'ChargeDescription'}}{'ledger_id'};
{ 'monetary_source_id' => $newdb{'ids'}{'monetary_source'}{'internal'}, if ($use_ir) {
'transaction_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'tx'}, addRow('ledger_entries',
'debit_ledger_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger'}, { 'monetary_source_id' => $newdb{'ids'}{'monetary_source'}{'internal'},
'credit_ledger_id' => $newdb{'lookup'}{'charge_type'}{$row->{'ChargeDescription'}}{'ledger'}, 'transaction_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'tx'},
'amount' => $row->{'ChargeAmount'}, 'debit_ledger_id' => $newdb{'lookup'}{'account'}{'Invoice'}{'ledger_id'},
'comment' => "Charge: $row->{'ChargeID'}; Ledger: $row->{'LedgerID'}" }); 'credit_ledger_id' => $credit_ledger_id,
'customer_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'customer_id'},
my $debit_entry_id = $newdb{'tables'}{'ledger_entries'}{'autoid'}, 'lease_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'lease_id'},
'amount' => $row->{'ChargeAmount'},
'comment' => "Charge: $row->{'ChargeID'}; Ledger: $row->{'LedgerID'}" });
$ledger_entry_id = $newdb{'tables'}{'ledger_entries'}{'autoid'};
$credit_ledger_id = $newdb{'lookup'}{'account'}{'Invoice'}{'ledger_id'};
}
addRow('ledger_entries', addRow('ledger_entries',
{ 'monetary_source_id' => $newdb{'ids'}{'monetary_source'}{'internal'}, { 'monetary_source_id' => $newdb{'ids'}{'monetary_source'}{'internal'},
'transaction_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'tx'}, 'transaction_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'tx'},
'debit_ledger_id' => $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'cust_ledger'}, 'debit_ledger_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger_id'},
'credit_ledger_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger'}, 'credit_ledger_id' => $credit_ledger_id,
'customer_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'customer_id'},
'lease_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'lease_id'},
'amount' => $row->{'ChargeAmount'}, 'amount' => $row->{'ChargeAmount'},
'comment' => "Charge: $row->{'ChargeID'}; Ledger: $row->{'LedgerID'}" }); 'comment' => "Charge: $row->{'ChargeID'}; Ledger: $row->{'LedgerID'}" });
$newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'terminal'} $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger_entry_id'}
= $debit_entry_id; = $newdb{'tables'}{'ledger_entries'}{'autoid'};
$newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'entry'}
= $newdb{'tables'}{'ledger_entries'}{'autoid'},
$newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger'}
= $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'cust_ledger'};
addRow('reconciliations',
{ 'debit_ledger_entry_id' => $debit_entry_id,
'credit_ledger_entry_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'entry'},
'terminal_ledger_entry_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'terminal'},
'amount' => $row->{'ChargeAmount'},
});
if ($use_ir) {
# Reconcile the invoice account. Since this is from the perspective
# of the invoice, the entry crediting the charge is the debit, and
# the entry debiting A/R is the credit.
addRow('reconciliations',
{ 'debit_ledger_entry_id' => $ledger_entry_id,
'credit_ledger_entry_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger_entry_id'},
'amount' => $row->{'ChargeAmount'},
});
}
next unless $row->{'TaxAmount'}; next unless $row->{'TaxAmount'};
$credit_ledger_id = $newdb{'lookup'}{'charge_type'}{'Tax'}{'ledger_id'};
if ($use_ir) {
addRow('ledger_entries',
{ 'monetary_source_id' => $newdb{'ids'}{'monetary_source'}{'internal'},
'transaction_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'tx'},
'debit_ledger_id' => $newdb{'lookup'}{'account'}{'Invoice'}{'ledger_id'},
'credit_ledger_id' => $credit_ledger_id,
'customer_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'customer_id'},
'lease_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'lease_id'},
'amount' => $row->{'TaxAmount'},
'comment' => undef });
$ledger_entry_id = $newdb{'tables'}{'ledger_entries'}{'autoid'};
$credit_ledger_id = $newdb{'lookup'}{'account'}{'Invoice'}{'ledger_id'};
}
addRow('ledger_entries', addRow('ledger_entries',
{ 'monetary_source_id' => $newdb{'ids'}{'monetary_source'}{'internal'}, { 'monetary_source_id' => $newdb{'ids'}{'monetary_source'}{'internal'},
'transaction_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'tx'}, 'transaction_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'tx'},
'debit_ledger_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger'}, 'debit_ledger_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger_id'},
'credit_ledger_id' => $newdb{'lookup'}{'charge_type'}{'Tax'}{'ledger'}, 'credit_ledger_id' => $credit_ledger_id,
'customer_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'customer_id'},
'lease_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'lease_id'},
'amount' => $row->{'TaxAmount'}, 'amount' => $row->{'TaxAmount'},
'comment' => undef }); 'comment' => undef });
$newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'tax_entry'} $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'tax_entry'}
= $newdb{'tables'}{'ledger_entries'}{'autoid'}, = $newdb{'tables'}{'ledger_entries'}{'autoid'};
if ($use_ir) {
# Reconcile the invoice account. Since this is from the perspective
# of the invoice, the entry crediting the charge is the debit, and
# the entry debiting A/R is the credit.
addRow('reconciliations',
{ 'debit_ledger_entry_id' => $ledger_entry_id,
'credit_ledger_entry_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'tax_entry'},
'amount' => $row->{'TaxAmount'},
});
}
} }
@@ -944,10 +950,10 @@ $query =
foreach $row (@{query($sdbh, $query)}) { foreach $row (@{query($sdbh, $query)}) {
if ($newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}) { if ($newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}) {
die unless ($newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{'cust'} die unless ($newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{'customer_id'}
== $newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{'cust'}); == $newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{'customer_id'});
push(@{$newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{'ledgers'}}, push(@{$newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{'ledgers'}},
$newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'ledger'}); $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'ledger_id'});
#print Dumper $receipt_map{$row->{'ReceiptNum'}}; #print Dumper $receipt_map{$row->{'ReceiptNum'}};
next; next;
} }
@@ -958,8 +964,12 @@ foreach $row (@{query($sdbh, $query)}) {
$newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}} $newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}
= {'tx' => $newdb{'tables'}{'transactions'}{'autoid'}, = {'tx' => $newdb{'tables'}{'transactions'}{'autoid'},
'cust' => $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'cust'}, # NOTE: Use of 'lease_id' would be invalid, since the
'ledgers' => [ $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'ledger'} ] }; # receipt could be for multiple leases. 'customer_id'
# could be OK, but better to avoid this issue all
# together by excluding them both from this lookup.
'ledgers' => [ $newdb{'lookup'}{'ledger'}{$row->{'LedgerID'}}{'ledger_id'} ] };
} }
@@ -976,47 +986,86 @@ $query = "SELECT * FROM Payments ORDER BY PaymentID";
foreach $row (@{query($sdbh, $query)}) foreach $row (@{query($sdbh, $query)})
{ {
my $monetary_source_id; my $monetary_source_id;
my $payment_acct;
my $debit_ledger_id;
my $ledger_entry_id;
if ($row->{'PaymentDate'} =~ m%3/25/2009%) { if ($row->{'PaymentDate'} =~ m%3/25/2009%) {
$monetary_source_id = $newdb{'ids'}{'monetary_source'}{'closing'}; $monetary_source_id = $newdb{'ids'}{'monetary_source'}{'Closing'};
$payment_acct = 'Bank';
} }
else { else {
$monetary_source_id = $newdb{'ids'}{'monetary_source'}{ $monetary_source_id = $newdb{'ids'}{'monetary_source'}{
$newdb{'lookup'}{'payment_type'}{$row->{'PaymentType'}}{'name'} $newdb{'lookup'}{'payment_type'}{$row->{'PaymentType'}}{'name'}
}; };
$payment_acct = $newdb{'lookup'}{'payment_type'}{$row->{'PaymentType'}}{'account_name'};
} }
if (!defined $monetary_source_id) { if (!$newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{$row->{'PaymentType'}}{'monetary_source_id'}) {
addRow('monetary_sources', if (!defined $monetary_source_id) {
{ 'monetary_type_id' => $newdb{'lookup'}{'payment_type'}{$row->{'PaymentType'}}{'monetary_type'}{'id'}, my $name;
'name' => $row->{'RecdFrom'}, $name = $newdb{'lookup'}{'payment_type'}{$row->{'PaymentType'}}{'name'};
'comment' => "Payment: $row->{'PaymentID'}; Type: $row->{'PaymentType'}; Check: $row->{'CheckNum'}; $row->{'Memo'}" }); if ($name eq 'Check') {
$monetary_source_id = $newdb{'tables'}{'monetary_sources'}{'autoid'}; $name = 'Check #' . $row->{'CheckNum'};
} }
addRow('monetary_sources',
{ 'monetary_type_id' => $newdb{'lookup'}{'payment_type'}{$row->{'PaymentType'}}{'monetary_type'}{'id'},
'name' => $name,
'comment' => "Payment: $row->{'PaymentID'}; Type: $row->{'PaymentType'}; Check: $row->{'CheckNum'}; $row->{'Memo'}" });
$monetary_source_id = $newdb{'tables'}{'monetary_sources'}{'autoid'};
}
my $payment_acct = $newdb{'lookup'}{'payment_type'}{$row->{'PaymentType'}}{'account'}; $newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{$row->{'PaymentType'}}{'monetary_source_id'}
= $monetary_source_id;
}
addRow('ledger_entries', $debit_ledger_id = $newdb{'lookup'}{'account'}{$payment_acct}{'ledger_id'};
{ 'monetary_source_id' => $monetary_source_id, if ($use_ir) {
'transaction_id' => $newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{'tx'}, addRow('ledger_entries',
'debit_ledger_id' => $newdb{'lookup'}{'account'}{$payment_acct}{'ledger'}, { 'monetary_source_id' => $newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{$row->{'PaymentType'}}{'monetary_source_id'},
'credit_ledger_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger'}, 'transaction_id' => $newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{'tx'},
'amount' => $row->{'PaymentAmount'}, 'debit_ledger_id' => $debit_ledger_id,
'comment' => "Receipt: $row->{'ReceiptNum'}; Payment: $row->{'PaymentID'}; Charge: $row->{'ChargeID'}" }); 'credit_ledger_id' => $newdb{'lookup'}{'account'}{'Receipt'}{'ledger_id'},
'customer_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'customer_id'},
'lease_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'lease_id'},
'amount' => $row->{'PaymentAmount'},
'comment' => "Receipt: $row->{'ReceiptNum'}; Payment: $row->{'PaymentID'}; Charge: $row->{'ChargeID'}" });
$ledger_entry_id = $newdb{'tables'}{'ledger_entries'}{'autoid'};
$debit_ledger_id = $newdb{'lookup'}{'account'}{'Receipt'}{'ledger_id'};
}
addRow('ledger_entries',
{ 'monetary_source_id' => $newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{$row->{'PaymentType'}}{'monetary_source_id'},
'transaction_id' => $newdb{'lookup'}{'receipt'}{$row->{'ReceiptNum'}}{'tx'},
'debit_ledger_id' => $debit_ledger_id,
'credit_ledger_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger_id'},
'customer_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'customer_id'},
'lease_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'lease_id'},
'amount' => $row->{'PaymentAmount'},
'comment' => "Receipt: $row->{'ReceiptNum'}; Payment: $row->{'PaymentID'}; Charge: $row->{'ChargeID'}" });
$newdb{'lookup'}{'payment'}{$row->{'PaymentID'}} $newdb{'lookup'}{'payment'}{$row->{'PaymentID'}}
= { 'entry' => $newdb{'tables'}{'ledger_entries'}{'autoid'} }; = { 'ledger_entry_id' => $newdb{'tables'}{'ledger_entries'}{'autoid'} };
if ($use_ir) {
# Reconcile the receipt account. Since this is from the perspective
# of the receipt, the entry crediting the A/R is the debit, and
# the entry debiting Cash/Bank/etc is the credit.
addRow('reconciliations',
{ 'debit_ledger_entry_id' => $ledger_entry_id,
'credit_ledger_entry_id' => $newdb{'lookup'}{'payment'}{$row->{'PaymentID'}}{'ledger_entry_id'},
'amount' => $row->{'PaymentAmount'},
});
}
# Reconcile Payment to the Charge. Since tracking is due to
# the A/R account (Lease Account in this case), credit/debit
# is from the perspective of that account. Namely, the charge
# was the debit to the A/R, and the payment was the credit.
my $reconcile_amount = $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'amount'}; my $reconcile_amount = $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'amount'};
$reconcile_amount = $row->{'PaymentAmount'} if $row->{'PaymentAmount'} <= $reconcile_amount; $reconcile_amount = $row->{'PaymentAmount'} if $row->{'PaymentAmount'} <= $reconcile_amount;
# Reconcile the A/R account. Since this is from the perspective
# of the A/R, charge is the debit, and payment is the credit
addRow('reconciliations', addRow('reconciliations',
{ 'debit_ledger_entry_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'entry'}, { 'debit_ledger_entry_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'ledger_entry_id'},
'credit_ledger_entry_id' => $newdb{'lookup'}{'payment'}{$row->{'PaymentID'}}{'entry'}, 'credit_ledger_entry_id' => $newdb{'lookup'}{'payment'}{$row->{'PaymentID'}}{'ledger_entry_id'},
'terminal_ledger_entry_id' => $newdb{'lookup'}{'charge'}{$row->{'ChargeID'}}{'terminal'},
'amount' => $reconcile_amount, 'amount' => $reconcile_amount,
}); });
@@ -1033,11 +1082,12 @@ foreach $row (@{query($sdbh, $query)})
## Fake Data for Testing ## Fake Data for Testing
my %fake = my %fake =
('custid' => 2, ('customer_id' => 4,
'ledger_id' => 4,
'invoice' => [ { 'id' => 1000, 'invoice' => [ { 'id' => 1000,
'date' => '2009-05-05', 'date' => '2009-05-05',
'entry' => [ { 'id' => 2100, 'entry' => [ { 'id' => 2100,
'account' => 'Security Deposit', 'account_name' => 'Security Deposit',
'amount' => 10, 'amount' => 10,
'tax' => 0 }, 'tax' => 0 },
], ],
@@ -1046,7 +1096,7 @@ my %fake =
'date' => '2009-05-01', 'date' => '2009-05-01',
'thru' => '2009-05-31', 'thru' => '2009-05-31',
'entry' => [ { 'id' => 2110, 'entry' => [ { 'id' => 2110,
'account' => 'Rent', 'account_name' => 'Rent',
'amount' => 100, 'amount' => 100,
'tax' => 5 }, 'tax' => 5 },
], ],
@@ -1054,7 +1104,7 @@ my %fake =
{ 'id' => 1002, { 'id' => 1002,
'date' => '2009-05-11', 'date' => '2009-05-11',
'entry' => [ { 'id' => 2120, 'entry' => [ { 'id' => 2120,
'account' => 'Late Charge', 'account_name' => 'Late Charge',
'amount' => 25, 'amount' => 25,
'tax' => 0 }, 'tax' => 0 },
], ],
@@ -1115,105 +1165,137 @@ my %fake =
); );
sub fakeTesting {
$newdb{'ids'}{'ledger'}{'Cash-Old'} =
$newdb{'lookup'}{'account'}{'Cash'}{'ledger_id'};
$newdb{'ids'}{'ledger'}{'Cash-Old'} = addRow('ledgers',
$newdb{'lookup'}{'account'}{'Cash'}{'ledger'}; { 'account_id' => $newdb{'lookup'}{'account'}{'Cash'}{'account_id'},
'open_stamp' => 'NOW()',
'sequence' => 2,
'comment' => 'Opened new ledger for testing' });
addRow('ledgers', $newdb{'lookup'}{'account'}{'Cash'}{'ledger_id'} =
{ 'account_id' => $newdb{'lookup'}{'account'}{'Cash'}{'account'}, $newdb{'tables'}{'ledgers'}{'autoid'};
'open_stamp' => 'NOW()',
'sequence' => 2,
'comment' => 'Opened new ledger for testing' });
$newdb{'lookup'}{'account'}{'Cash'}{'ledger'} = my $balance = 0;
$newdb{'tables'}{'ledgers'}{'autoid'}; foreach $row (@{$newdb{'tables'}{'ledger_entries'}{'rows'}}) {
next unless defined $row;
$balance += $row->{'amount'}
if $row->{'debit_ledger_id'} == $newdb{'ids'}{'ledger'}{'Cash-Old'};
$balance -= $row->{'amount'}
if $row->{'credit_ledger_id'} == $newdb{'ids'}{'ledger'}{'Cash-Old'};
}
my $balance = 0; addRow('transactions',
foreach $row (@{$newdb{'tables'}{'ledger_entries'}{'rows'}}) { { 'stamp' => '2009-05-10' });
next unless defined $row;
$balance += $row->{'amount'}
if $row->{'debit_ledger_id'} == $newdb{'ids'}{'ledger'}{'Cash-Old'};
$balance -= $row->{'amount'}
if $row->{'credit_ledger_id'} == $newdb{'ids'}{'ledger'}{'Cash-Old'};
}
addRow('transactions', addRow('ledger_entries',
{ 'stamp' => '2009-05-10' }); { 'monetary_source_id' => $newdb{'ids'}{'monetary_source'}{'internal'},
'transaction_id' => $newdb{'tables'}{'transactions'}{'autoid'},
addRow('ledger_entries', 'debit_ledger_id' => $newdb{'lookup'}{'account'}{'Cash'}{'ledger_id'},
{ 'monetary_source_id' => $newdb{'ids'}{'monetary_source'}{'internal'}, 'credit_ledger_id' => $newdb{'ids'}{'ledger'}{'Cash-Old'},
'transaction_id' => $newdb{'tables'}{'transactions'}{'autoid'}, 'amount' => $balance,
'debit_ledger_id' => $newdb{'lookup'}{'account'}{'Cash'}{'ledger'}, 'name' => "Close Out ($newdb{'ids'}{'ledger'}{'Cash-Old'} -> $newdb{'tables'}{'transactions'}{'autoid'})",
'credit_ledger_id' => $newdb{'ids'}{'ledger'}{'Cash-Old'}, 'comment' => "Carrying forward old ledger balance onto new ledger" });
'amount' => $balance,
'name' => "Close Out ($newdb{'ids'}{'ledger'}{'Cash-Old'} -> $newdb{'tables'}{'transactions'}{'autoid'})",
'comment' => "Carrying forward old ledger balance onto new ledger" });
# NOTE: no tracking for the Cash account # NOTE: no tracking for the Cash account
$newdb{'tables'}{'ledgers'}{'rows'}[$newdb{'ids'}{'ledger'}{'Cash-Old'}]{'closed'} = 1; $newdb{'tables'}{'ledgers'}{'rows'}[$newdb{'ids'}{'ledger'}{'Cash-Old'}]{'closed'} = 1;
$newdb{'tables'}{'ledgers'}{'rows'}[$newdb{'ids'}{'ledger'}{'Cash-Old'}]{'close_stamp'} = 'NOW()'; $newdb{'tables'}{'ledgers'}{'rows'}[$newdb{'ids'}{'ledger'}{'Cash-Old'}]{'close_stamp'} = 'NOW()';
foreach my $ir ('invoice', 'receipt') { foreach my $ir ('invoice', 'receipt') {
foreach my $tx (@{$fake{$ir}}) { foreach my $tx (@{$fake{$ir}}) {
#print Dumper ${%$tx{'date'}}; #print Dumper ${%$tx{'date'}};
#exit; #exit;
addRow('transactions', addRow('transactions',
{ 'id' => $tx->{'id'}, { 'id' => $tx->{'id'},
'stamp' => $tx->{'date'}, 'stamp' => $tx->{'date'},
'through_date' => $tx->{'thru'}, 'through_date' => $tx->{'thru'},
'comment' => "Fake $ir" }, 'comment' => "Fake $ir" },
1); 1);
foreach my $e (@{$tx->{'entry'}}) { foreach my $e (@{$tx->{'entry'}}) {
my $dr = ($ir eq 'invoice') ? 'A/R' : 'Cash'; my $crdr = ($ir eq 'invoice') ? 'Invoice' : 'Receipt';
my $cr = ($ir eq 'invoice') ? $e->{'account'} : 'A/R'; my $dr = ($ir eq 'invoice') ? 'A/R' : 'Cash';
my $monetary_source_id; $crdr = $dr;
my $cr = ($ir eq 'invoice') ? $e->{'account_name'} : 'A/R';
my $monetary_source_id;
if (defined $e->{'type'}) { if (defined $e->{'type'}) {
addRow('monetary_sources', addRow('monetary_sources',
{ 'monetary_type_id' => $e->{'type'}, { 'monetary_type_id' => $e->{'type'},
'name' => "Money of type " . $e->{'type'}, 'name' => "Money of type " . $e->{'type'},
'comment' => "Fake Money For " . $e->{'id'} }); 'comment' => "Fake Money For " . $e->{'id'} });
$monetary_source_id = $newdb{'tables'}{'monetary_sources'}{'autoid'}; $monetary_source_id = $newdb{'tables'}{'monetary_sources'}{'autoid'};
} }
else { else {
$monetary_source_id = $newdb{'ids'}{'monetary_source'}{'internal'}; $monetary_source_id = $newdb{'ids'}{'monetary_source'}{'internal'};
} }
addRow('ledger_entries', addRow('ledger_entries',
{ 'id' => $e->{'id'}, { 'id' => $e->{'id'},
'monetary_source_id' => $monetary_source_id, 'monetary_source_id' => $monetary_source_id,
'transaction_id' => $tx->{'id'}, 'transaction_id' => $tx->{'id'},
'debit_ledger_id' => $newdb{'lookup'}{'account'}{$dr}{'ledger'}, 'debit_ledger_id' => $newdb{'lookup'}{'account'}{$crdr}{'ledger_id'},
'credit_ledger_id' => $newdb{'lookup'}{'account'}{$cr}{'ledger'}, 'credit_ledger_id' => $newdb{'lookup'}{'account'}{$cr}{'ledger_id'},
'amount' => $e->{'amount'}, 'customer_id' => $fake{'customer_id'},
'comment' => "Fake $ir entry" }, 'lease_id' => $fake{'lease_id'},
1); 'amount' => $e->{'amount'},
'comment' => "Fake $ir entry" },
1);
foreach my $t (@{$e->{'track'}}) { # addRow('ledger_entries',
addRow('reconciliations', # { 'id' => $e->{'id'},
{ 'debit_ledger_entry_id' => $t->{'debit'}, # 'monetary_source_id' => $monetary_source_id,
'credit_ledger_entry_id' => $e->{'id'}, # 'transaction_id' => $tx->{'id'},
'terminal_ledger_entry_id' => $t->{'debit'}, # 'debit_ledger_id' => $newdb{'lookup'}{'account'}{$dr}{'ledger_id'},
'amount' => $t->{'amount'} # 'credit_ledger_id' => $newdb{'lookup'}{'account'}{$crdr}{'ledger_id'},
}); # 'customer_id' => $fake{'customer_id'},
} # 'lease_id' => $fake{'lease_id'},
# 'amount' => $e->{'amount'},
# 'comment' => "Fake $ir entry" },
# 1);
next unless $e->{'tax'}; foreach my $t (@{$e->{'track'}}) {
addRow('reconciliations',
{ 'debit_ledger_entry_id' => $t->{'debit'},
'credit_ledger_entry_id' => $e->{'id'},
'amount' => $t->{'amount'}
});
}
addRow('ledger_entries', next unless $e->{'tax'};
{ 'id' => $e->{'id'}+1,
'monetary_source_id' => $monetary_source_id, addRow('ledger_entries',
'transaction_id' => $tx->{'id'}, { 'id' => $e->{'id'}+1,
'debit_ledger_id' => $newdb{'lookup'}{'account'}{$dr}{'ledger'}, 'monetary_source_id' => $monetary_source_id,
'credit_ledger_id' => $newdb{'lookup'}{'account'}{'Tax'}{'ledger'}, 'transaction_id' => $tx->{'id'},
'amount' => $e->{'tax'}, 'debit_ledger_id' => $newdb{'lookup'}{'account'}{$crdr}{'ledger_id'},
'comment' => "Fake Tax" }, 'credit_ledger_id' => $newdb{'lookup'}{'account'}{'Tax'}{'ledger_id'},
1); 'customer_id' => $fake{'customer_id'},
} 'lease_id' => $fake{'lease_id'},
} 'amount' => $e->{'amount'},
'comment' => "Fake Tax" },
1);
# addRow('ledger_entries',
# { 'id' => $e->{'id'}+1,
# 'monetary_source_id' => $monetary_source_id,
# 'transaction_id' => $tx->{'id'},
# 'debit_ledger_id' => $newdb{'lookup'}{'account'}{$dr}{'ledger_id'},
# 'credit_ledger_id' => $newdb{'lookup'}{'account'}{$crdr}{'ledger_id'},
# 'customer_id' => $fake{'customer_id'},
# 'lease_id' => $fake{'lease_id'},
# 'amount' => $e->{'tax'},
# 'comment' => "Fake Tax" },
# 1);
}
}
}
} }
#fakeTesting();
$Data::Dumper::Sortkeys = 1; $Data::Dumper::Sortkeys = 1;
print Dumper \%newdb; print Dumper \%newdb;
# exit; # exit;

View File

@@ -305,7 +305,13 @@ class AppController extends Controller {
$id = 'id'; $id = 'id';
extract(array_intersect_key($fields, array_flip($special))); extract(array_intersect_key($fields, array_flip($special)));
foreach ($records AS &$record) { foreach ($records AS &$record) {
if (!isset($record[$table]))
continue;
foreach (array_diff_key($fields, array_flip($special)) AS $field) { foreach (array_diff_key($fields, array_flip($special)) AS $field) {
if (!isset($record[$table][$id]) || !isset($record[$table][$field]))
continue;
// DEBUG PURPOSES ONLY! // DEBUG PURPOSES ONLY!
//$params['linkrecord'][] = compact('table', 'field', 'id', 'controller', 'record'); //$params['linkrecord'][] = compact('table', 'field', 'id', 'controller', 'record');
$record[$table][$field] = $record[$table][$field] =

View File

@@ -71,6 +71,7 @@ class LeasesController extends AppController {
function jqGridRecordLinks(&$params, &$model, &$records, $links) { function jqGridRecordLinks(&$params, &$model, &$records, $links) {
$links['Lease'] = array('number'); $links['Lease'] = array('number');
$links['Unit'] = array('name'); $links['Unit'] = array('name');
$links['Customer'] = array('name');
return parent::jqGridRecordLinks($params, $model, $records, $links); return parent::jqGridRecordLinks($params, $model, $records, $links);
} }
@@ -107,7 +108,6 @@ class LeasesController extends AppController {
array(// Models array(// Models
'LeaseType', 'LeaseType',
'Unit', 'Unit',
'Account' => array('CurrentLedger'),
'Customer', 'Customer',
), ),
'conditions' => array(array('Lease.id' => $id)), 'conditions' => array(array('Lease.id' => $id)),
@@ -115,23 +115,15 @@ class LeasesController extends AppController {
) )
); );
// Summarize each ledger
$this->Lease->statsMerge($lease,
$this->Lease->stats($lease['Lease']['id']));
// Obtain the overall lease balance // Obtain the overall lease balance
$this->Lease->statsMerge($lease['Lease'], $this->Lease->statsMerge($lease['Lease'],
array('stats' => $this->Lease->stats($id))); array('stats' => $this->Lease->stats($id)));
$outstanding_balance = $lease['Lease']['stats']['Account']['Ledger']['balance']; $outstanding_balance = $lease['Lease']['stats']['balance'];
// Determine the lease security deposit // Determine the lease security deposit
$deposits = $this->Lease->findSecurityDeposits($lease['Lease']['id']); $deposits = $this->Lease->findSecurityDeposits($lease['Lease']['id']);
$outstanding_deposit = $deposits['summary']['balance']; $outstanding_deposit = $deposits['summary']['balance'];
// Move the Leder stats into our alias 'CurrentLedger'
$lease['Account']['CurrentLedger'] += $lease['Account']['Ledger'];
unset($lease['Account']['Ledger']);
// Prepare to render // Prepare to render
$title = 'Lease: #' . $lease['Lease']['id']; $title = 'Lease: #' . $lease['Lease']['id'];
$this->set(compact('lease', 'title', $this->set(compact('lease', 'title',

View File

@@ -36,6 +36,16 @@ class LedgerEntriesController extends AppController {
array('fields' => array('id', 'name'), array('fields' => array('id', 'name'),
), ),
'Customer' =>
array('fields' => array('id', 'name'),
),
'Lease' =>
array('fields' => array('id', 'number'),
'Unit' =>
array('fields' => array('id', 'name'),
),
),
); );
if (isset($params['custom']['account_ftype'])) { if (isset($params['custom']['account_ftype'])) {
@@ -118,20 +128,64 @@ class LedgerEntriesController extends AppController {
$conditions[] = array('Reconciliation.'.$ftype.'_ledger_entry_id' => $params['custom']['reconcile_id']); $conditions[] = array('Reconciliation.'.$ftype.'_ledger_entry_id' => $params['custom']['reconcile_id']);
} }
if (isset($params['custom']['customer_id'])) {
$conditions[] =
array('Customer.id' => $params['custom']['customer_id']);
/* $Account = new Account(); */
/* if (isset($params['custom']['account_ftype']) || */
/* isset($params['custom']['ledger_id'])) { */
/* $conditions[] = */
/* array('OR' => array('Account.id' => $Account->invoiceAccountID(), */
/* 'Account.id' => $Account->receiptAccountID())); */
/* } else { */
/* $conditions[] = */
/* array('OR' => array('DebitAccount.id' => $Account->invoiceAccountID(), */
/* //'CreditAccount.id' => $Account->invoiceAccountID(), */
/* //'DebitAccount.id' => $Account->receiptAccountID(), */
/* 'CreditAccount.id' => $Account->receiptAccountID(), */
/* )); */
/* } */
}
if (isset($params['custom']['lease_id'])) {
$conditions[] =
array('Lease.id' => $params['custom']['lease_id']);
/* $Account = new Account(); */
/* if (isset($params['custom']['account_ftype']) || */
/* isset($params['custom']['ledger_id'])) { */
/* $conditions[] = */
/* array('OR' => array('Account.id' => $Account->invoiceAccountID(), */
/* 'Account.id' => $Account->receiptAccountID())); */
/* } else { */
/* $conditions[] = */
/* array('OR' => array('DebitAccount.id' => $Account->invoiceAccountID(), */
/* //'CreditAccount.id' => $Account->invoiceAccountID(), */
/* //'DebitAccount.id' => $Account->receiptAccountID(), */
/* 'CreditAccount.id' => $Account->receiptAccountID(), */
/* )); */
/* } */
}
if (isset($params['custom']['transaction_id'])) {
$conditions[] =
array('Transaction.id' => $params['custom']['transaction_id']);
}
return $conditions; return $conditions;
} }
function jqGridRecordLinks(&$params, &$model, &$records, $links) { function jqGridRecordLinks(&$params, &$model, &$records, $links) {
$links['Transaction'] = array('id'); $links['Transaction'] = array('id');
$links['LedgerEntry'] = array('id'); $links['LedgerEntry'] = array('id');
if (isset($params['custom']['account_ftype']) || isset($params['custom']['ledger_id'])) { $links['Account'] = array('controller' => 'accounts', 'name');
$links['Account'] = array('controller' => 'accounts', 'name'); $links['DebitAccount'] = array('controller' => 'accounts', 'name');
} $links['CreditAccount'] = array('controller' => 'accounts', 'name');
else {
$links['DebitAccount'] = array('controller' => 'accounts', 'name');
$links['CreditAccount'] = array('controller' => 'accounts', 'name');
}
$links['MonetarySource'] = array('name'); $links['MonetarySource'] = array('name');
$links['Customer'] = array('name');
$links['Lease'] = array('number');
$links['Unit'] = array('name');
return parent::jqGridRecordLinks($params, $model, $records, $links); return parent::jqGridRecordLinks($params, $model, $records, $links);
} }
@@ -145,8 +199,13 @@ class LedgerEntriesController extends AppController {
function jqGridDataOrder(&$params, &$model, $index, $direction) { function jqGridDataOrder(&$params, &$model, $index, $direction) {
/* if ($index === 'balance') */ /* if ($index === 'balance') */
/* return ($index .' '. $direction); */ /* return ($index .' '. $direction); */
$order = parent::jqGridDataOrder($params, $model, $index, $direction);
return parent::jqGridDataOrder($params, $model, $index, $direction); if ($index === 'Transaction.stamp') {
$order[] = 'LedgerEntry.id ' . $direction;
}
return $order;
} }
@@ -167,6 +226,7 @@ class LedgerEntriesController extends AppController {
$entry = $this->LedgerEntry->find $entry = $this->LedgerEntry->find
('first', ('first',
array('contain' => array('MonetarySource.id', array('contain' => array('MonetarySource.id',
'MonetarySource.name',
'MonetarySource.MonetaryType.id', 'MonetarySource.MonetaryType.id',
'Transaction.id', 'Transaction.id',
'Transaction.stamp', 'Transaction.stamp',
@@ -176,6 +236,9 @@ class LedgerEntriesController extends AppController {
'CreditLedger.id', 'CreditLedger.id',
'CreditLedger.sequence', 'CreditLedger.sequence',
'CreditLedger.account_id', 'CreditLedger.account_id',
'Customer.id',
'Customer.name',
'Lease.id',
), ),
'fields' => array('LedgerEntry.id', 'fields' => array('LedgerEntry.id',

View File

@@ -121,7 +121,7 @@ class UnitsController extends AppController {
// Get the balance on each lease. // Get the balance on each lease.
foreach ($unit['Lease'] AS &$lease) { foreach ($unit['Lease'] AS &$lease) {
$stats = $this->Unit->Lease->stats($lease['id']); $stats = $this->Unit->Lease->stats($lease['id']);
$lease['balance'] = $stats['Account']['Ledger']['balance']; $lease['balance'] = $stats['balance'];
} }
$outstanding_balance = 0; $outstanding_balance = 0;
@@ -130,7 +130,7 @@ class UnitsController extends AppController {
// Figure out the outstanding balance of the current lease. // Figure out the outstanding balance of the current lease.
$stats = $this->Unit->stats($id); $stats = $this->Unit->stats($id);
$outstanding_balance = $outstanding_balance =
$stats['CurrentLease']['Account']['Ledger']['balance']; $stats['CurrentLease']['balance'];
// Figure out the total security deposit for the current lease. // Figure out the total security deposit for the current lease.
$deposits = $this->Unit->Lease->findSecurityDeposits($unit['CurrentLease']['id']); $deposits = $this->Unit->Lease->findSecurityDeposits($unit['CurrentLease']['id']);

View File

@@ -82,37 +82,26 @@ class Account extends AppModel {
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
************************************************************************** **************************************************************************
* function: securityDepositAccountID * function: accountNameToID
* - Returns the ID of the Security Deposit Account * - Returns the ID of the named account
*/ */
function securityDepositAccountID() { function accountNameToID($name) {
$this->cacheQueries = true; $this->cacheQueries = true;
$account = $this->find('first', array $account = $this->find('first', array
('recursive' => -1, ('recursive' => -1,
'conditions' => array 'conditions' => compact('name'),
(array('name' => 'Security Deposit')),
)); ));
$this->cacheQueries = false; $this->cacheQueries = false;
return $account['Account']['id']; return $account['Account']['id'];
} }
function securityDepositAccountID() { return $this->accountNameToID('Security Deposit'); }
/************************************************************************** function rentAccountID() { return $this->accountNameToID('Rent'); }
************************************************************************** function accountReceivableAccountID() { return $this->accountNameToID('A/R'); }
************************************************************************** function invoiceAccountID() { return $this->accountReceivableAccountID(); }
* function:rentAccountID function receiptAccountID() { return $this->accountReceivableAccountID(); }
* - Returns the ID of the Rent Account //function invoiceAccountID() { return $this->accountNameToID('Invoice'); }
*/ //function receiptAccountID() { return $this->accountNameToID('Receipt'); }
function rentAccountID() {
$this->cacheQueries = true;
$account = $this->find('first', array
('recursive' => -1,
'conditions' => array
(array('name' => 'Rent')),
));
$this->cacheQueries = false;
return $account['Account']['id'];
}
/************************************************************************** /**************************************************************************
@@ -122,22 +111,19 @@ class Account extends AppModel {
* - Returns an array of ledger ids from the given account * - Returns an array of ledger ids from the given account
*/ */
function ledgers($id, $all = false) { function ledgers($id, $all = false) {
$cachekey = $all ? 'all' : 'current';
if (isset($this->cache[$id]['ledgers'][$cachekey])) {
return $this->cache[$id]['ledgers'][$cachekey];
}
if ($all) { if ($all) {
$contain = array('Ledger' => array('fields' => array('Ledger.id'))); $contain = array('Ledger' => array('fields' => array('Ledger.id')));
} else { } else {
$contain = array('CurrentLedger' => array('fields' => array('CurrentLedger.id'))); $contain = array('CurrentLedger' => array('fields' => array('CurrentLedger.id')));
} }
$this->cacheQueries = true;
$account = $this->find('first', array $account = $this->find('first', array
('contain' => $contain, ('contain' => $contain,
'fields' => array(), 'fields' => array(),
'conditions' => array(array('Account.id' => $id)), 'conditions' => array(array('Account.id' => $id)),
)); ));
$this->cacheQueries = false;
if ($all) { if ($all) {
$ledger_ids = array(); $ledger_ids = array();
@@ -148,14 +134,11 @@ class Account extends AppModel {
$ledger_ids = array($account['CurrentLedger']['id']); $ledger_ids = array($account['CurrentLedger']['id']);
} }
// Save the ledgers in our cache for future reference
$this->cache[$id]['ledgers'][$cachekey] = $ledger_ids;
/* pr(array('function' => 'Account::ledgers', */ /* pr(array('function' => 'Account::ledgers', */
/* 'args' => compact('id', 'all'), */ /* 'args' => compact('id', 'all'), */
/* 'return' => $this->cache[$id]['ledgers'][$cachekey])); */ /* 'return' => $ledger_ids)); */
return $this->cache[$id]['ledgers'][$cachekey]; return $ledger_ids;
} }
@@ -234,7 +217,11 @@ class Account extends AppModel {
* (such as charges not paid). * (such as charges not paid).
*/ */
function findUnreconciledLedgerEntries($id = null, $fundamental_type = null) { function findUnreconciledLedgerEntries($id = null, $fundamental_type = null, $cond = null) {
if (!isset($cond))
$cond = array();
$cond[] = array('Account.id' => $id);
foreach (($fundamental_type foreach (($fundamental_type
? array($fundamental_type) ? array($fundamental_type)
: array('debit', 'credit')) AS $fund) { : array('debit', 'credit')) AS $fund) {
@@ -260,7 +247,7 @@ class Account extends AppModel {
'group' => ("LedgerEntry.id" . 'group' => ("LedgerEntry.id" .
" HAVING LedgerEntry.amount" . " HAVING LedgerEntry.amount" .
" <> COALESCE(SUM(Reconciliation.amount),0)"), " <> COALESCE(SUM(Reconciliation.amount),0)"),
'conditions' => array('Account.id' => $id), 'conditions' => $cond,
'fields' => array(), 'fields' => array(),
)); ));
$balance = 0; $balance = 0;
@@ -290,7 +277,7 @@ class Account extends AppModel {
* whatever algorithm is simplest. * whatever algorithm is simplest.
*/ */
function reconcileNewLedgerEntry($id, $fundamental_type, $amount) { function reconcileNewLedgerEntry($id, $fundamental_type, $amount, $cond = null) {
$ofund = $this->fundamentalOpposite($fundamental_type); $ofund = $this->fundamentalOpposite($fundamental_type);
$unreconciled = array($ofund => array('entry'=>array(), 'balance'=>0)); $unreconciled = array($ofund => array('entry'=>array(), 'balance'=>0));
$applied = 0; $applied = 0;
@@ -298,7 +285,7 @@ class Account extends AppModel {
// if there is no money in the entry, it can reconcile nothing // if there is no money in the entry, it can reconcile nothing
// don't bother wasting time sifting ledger entries. // don't bother wasting time sifting ledger entries.
if ($amount > 0) { if ($amount > 0) {
$unreconciled = $this->findUnreconciledLedgerEntries($id, $ofund); $unreconciled = $this->findUnreconciledLedgerEntries($id, $ofund, $cond);
foreach ($unreconciled[$ofund]['entry'] AS $i => &$entry) { foreach ($unreconciled[$ofund]['entry'] AS $i => &$entry) {
// Determine if amount is sufficient to cover the entry // Determine if amount is sufficient to cover the entry

View File

@@ -8,7 +8,6 @@ class Customer extends AppModel {
); );
var $belongsTo = array( var $belongsTo = array(
'Account',
'PrimaryContact' => array( 'PrimaryContact' => array(
'className' => 'Contact', 'className' => 'Contact',
), ),
@@ -20,11 +19,19 @@ class Customer extends AppModel {
'conditions' => 'CurrentLease.close_date IS NULL', 'conditions' => 'CurrentLease.close_date IS NULL',
), ),
'Lease', 'Lease',
'Transaction', 'LedgerEntry',
// Cheat to get Account set as part of this class
'Account',
); );
var $hasAndBelongsToMany = array( var $hasAndBelongsToMany = array(
'Contact', 'Contact',
'Transaction' => array(
'joinTable' => 'ledger_entries',
'foreignKey' => 'customer_id',
'associationForeignKey' => 'transaction_id',
),
); );
@@ -80,16 +87,9 @@ class Customer extends AppModel {
/* )); */ /* )); */
$entries = $this->Account->findLedgerEntriesRelatedToAccount $entries = $this->Account->findLedgerEntriesRelatedToAccount
($this->accountId($id), ($this->Account->invoiceAccountID(),
$this->Account->securityDepositAccountID(), $this->Account->securityDepositAccountID(),
true, null, $link); true, array('LedgerEntry.customer_id' => $id), $link);
foreach ($this->leaseIds($id) AS $lease_id) {
$ledger_entries = $this->Lease->findSecurityDeposits($lease_id, $link);
$this->statsMerge($entries['summary'], $ledger_entries['summary']);
$entries['Entries'] = array_merge($entries['Entries'],
$ledger_entries['Entries']);
}
/* pr(array('function' => 'Customer::findSecurityDeposits', */ /* pr(array('function' => 'Customer::findSecurityDeposits', */
/* 'args' => compact('id', 'link'), */ /* 'args' => compact('id', 'link'), */
@@ -110,22 +110,10 @@ class Customer extends AppModel {
*/ */
function findUnreconciledLedgerEntries($id = null, $fundamental_type = null) { function findUnreconciledLedgerEntries($id = null, $fundamental_type = null) {
$unreconciled = $this->Account->findUnreconciledLedgerEntries $unreconciled = $this->Account->findUnreconciledLedgerEntries
($this->accountId($id), $fundamental_type); ($this->Account->accountReceivableAccountID(),
$fundamental_type,
foreach ($this->leaseIds($id) AS $lease_id) { array('LedgerEntry.customer_id' => $id));
$unrec = $this->Lease->findUnreconciledLedgerEntries($lease_id,
$fundamental_type);
foreach (array_keys($unreconciled) AS $type) {
$left = &$unreconciled[$type];
$right = &$unrec[$type];
$left['entry'] = array_merge($left['entry'], $right['entry']);
$left['balance'] += $right['balance'];
}
}
return $unreconciled; return $unreconciled;
} }
@@ -146,25 +134,11 @@ class Customer extends AppModel {
*/ */
function reconcileNewLedgerEntry($id, $fundamental_type, $amount) { function reconcileNewLedgerEntry($id, $fundamental_type, $amount) {
$reconciled = $this->Account->reconcileNewLedgerEntry $reconciled = $this->Account->reconcileNewLedgerEntry
($this->accountId($id), $fundamental_type, $amount); ($this->Account->accountReceivableAccountID(),
$fundamental_type,
foreach ($this->leaseIds($id) AS $lease_id) { $amount,
foreach (array_keys($reconciled) AS $type) { array('LedgerEntry.customer_id' => $id));
$rec = $this->Lease->reconcileNewLedgerEntry($lease_id,
$fundamental_type,
$reconciled[$type]['unapplied']);
$left = &$reconciled[$type];
$right = &$rec[$type];
$left['entry'] = array_merge($left['entry'], $right['entry']);
$left['balance'] += $right['balance'];
$left['applied'] += $right['applied'];
$left['unapplied'] = $right['unapplied'];
}
}
return $reconciled; return $reconciled;
} }
@@ -189,7 +163,6 @@ class Customer extends AppModel {
'ContactEmail', 'ContactEmail',
'ContactAddress', 'ContactAddress',
), ),
'Account',
'Lease' => 'Lease' =>
array('Unit' => array('Unit' =>
array('order' => array('sort_order'), array('order' => array('sort_order'),
@@ -201,22 +174,12 @@ class Customer extends AppModel {
'conditions' => array('Customer.id' => $id), 'conditions' => array('Customer.id' => $id),
)); ));
// Add the lease balance to each lease. // Figure out the outstanding balance for this customer
foreach ($customer['Lease'] AS &$lease) {
$stats = $this->Lease->stats($lease['id']);
$lease['balance'] = $stats['Account']['Ledger']['balance'];
}
// Figure out the outstanding balance of the current lease.
$customer['stats'] = $this->stats($id); $customer['stats'] = $this->stats($id);
// Figure out the total security deposit for the current lease. // Figure out the total security deposit for the current lease.
$customer['deposits'] = $this->findSecurityDeposits($id); $customer['deposits'] = $this->findSecurityDeposits($id);
// Add statistics into the customer account.
$customer['Account'] = array_merge($customer['Account'],
$customer['stats']['Account']['Ledger']);
return $customer; return $customer;
} }
@@ -232,29 +195,11 @@ class Customer extends AppModel {
if (!$id) if (!$id)
return null; return null;
// Get the basic information necessary $stats = $this->Account->stats($this->Account->accountReceivableAccountID(), true,
$customer = $this->find('first', array('LedgerEntry.customer_id' => $id));
array('contain' =>
array('Account' => array
('fields' => array('Account.id')),
'Lease' => array
('fields' => array('Lease.id'))
),
'conditions' => array
(array('Customer.id' => $id))));
// Get stats from the customer account, and each lease
$stats['Account'] = $this->Account->stats($customer['Account']['id']);
foreach ($customer['Lease'] AS $lease) {
$this->statsMerge($stats['Lease'], $this->Lease->stats($lease['id']));
}
// Merge the stats from both the customer specific account, as
// well as the leases. This will provide current customer standing.
$this->statsMerge($stats, $stats['Account']['Ledger']);
$this->statsMerge($stats, $stats['Lease']['Account']['Ledger']);
// Pull to the top level and return
$stats = $stats['Ledger'];
return $stats; return $stats;
} }

View File

@@ -25,11 +25,18 @@ class Lease extends AppModel {
var $belongsTo = array( var $belongsTo = array(
'LeaseType', 'LeaseType',
'Unit', 'Unit',
'Account',
'Customer', 'Customer',
'LateSchedule', 'LateSchedule',
); );
var $hasMany = array(
'LedgerEntry',
// Cheat to get Account set as part of this class
'Account',
);
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
************************************************************************** **************************************************************************
@@ -37,15 +44,7 @@ class Lease extends AppModel {
* - Returns the accountId of the given lease * - Returns the accountId of the given lease
*/ */
function accountId($id) { function accountId($id) {
$this->cacheQueries = true; return $this->Account->invoiceAccountID();
$lease = $this->find('first', array
('recursive' => -1,
'fields' => array('account_id'),
'conditions' => array(array('id' => $id)),
));
$this->cacheQueries = false;
return $lease['Lease']['account_id'];
} }
@@ -61,6 +60,10 @@ class Lease extends AppModel {
/* 'args' => compact('id', 'all', 'cond', 'link'), */ /* 'args' => compact('id', 'all', 'cond', 'link'), */
/* )); */ /* )); */
if (!isset($cond))
$cond = array();
$cond[] = array('LedgerEntry.lease_id' => $id);
$entries = $this->Account->findLedgerEntries($this->accountId($id), $entries = $this->Account->findLedgerEntries($this->accountId($id),
$all, $cond, $link); $all, $cond, $link);
@@ -87,7 +90,7 @@ class Lease extends AppModel {
$entries = $this->Account->findLedgerEntriesRelatedToAccount $entries = $this->Account->findLedgerEntriesRelatedToAccount
($this->accountId($id), ($this->accountId($id),
$this->Account->securityDepositAccountID(), $this->Account->securityDepositAccountID(),
true, null, $link); true, array('LedgerEntry.lease_id' => $id), $link);
/* pr(array('function' => 'Lease::findSecurityDeposits', */ /* pr(array('function' => 'Lease::findSecurityDeposits', */
/* 'args' => compact('id', 'link'), */ /* 'args' => compact('id', 'link'), */
@@ -108,7 +111,7 @@ class Lease extends AppModel {
function findUnreconciledLedgerEntries($id = null, $fundamental_type = null) { function findUnreconciledLedgerEntries($id = null, $fundamental_type = null) {
return $this->Account->findUnreconciledLedgerEntries return $this->Account->findUnreconciledLedgerEntries
($this->accountId($id), $fundamental_type); ($this->accountId($id), $fundamental_type, array('LedgerEntry.lease_id' => $id));
} }
@@ -128,7 +131,7 @@ class Lease extends AppModel {
function reconcileNewLedgerEntry($id, $fundamental_type, $amount) { function reconcileNewLedgerEntry($id, $fundamental_type, $amount) {
return $this->Account->reconcileNewLedgerEntry return $this->Account->reconcileNewLedgerEntry
($this->accountId($id), $fundamental_type, $amount); ($this->accountId($id), $fundamental_type, $amount, array('LedgerEntry.lease_id' => $id));
} }
@@ -143,18 +146,11 @@ class Lease extends AppModel {
if (!$id) if (!$id)
return null; return null;
// Find the associated account. $stats = $this->Account->stats($this->Account->accountReceivableAccountID(), true,
$lease = $this->find('first', array('LedgerEntry.lease_id' => $id));
array('recursive' => -1,
'conditions' => array(array('Lease.id' => $id))));
// Pull the stats from the account.
$stats['Account'] = $this->Account->stats($lease['Lease']['account_id']);
// Place a summary of the stats (one lease account in this case)
// at the top level for easy summarized access.
$this->statsMerge($stats, $stats['Account']['Ledger']);
// Pull to the top level and return
$stats = $stats['Ledger'];
return $stats; return $stats;
} }

View File

@@ -115,6 +115,9 @@ class Ledger extends AppModel {
* - Returns summary data from the requested ledger. * - Returns summary data from the requested ledger.
*/ */
function stats($id, $cond = null) { function stats($id, $cond = null) {
if (!isset($cond))
$cond = array();
$cond[] = array('Ledger.id' => $id);
$stats = $this->find $stats = $this->find
('first', array ('first', array
@@ -138,8 +141,7 @@ class Ledger extends AppModel {
) * IF(LedgerEntry.amount, LedgerEntry.amount, 0) ) * IF(LedgerEntry.amount, LedgerEntry.amount, 0)
) AS balance", ) AS balance",
"COUNT(LedgerEntry.id) AS entries"), "COUNT(LedgerEntry.id) AS entries"),
'conditions' => array(isset($cond) ? $cond : array(), 'conditions' => $cond,
array('Ledger.id' => $id)),
'group' => 'Ledger.id', 'group' => 'Ledger.id',
)); ));

View File

@@ -11,6 +11,8 @@ class LedgerEntry extends AppModel {
var $belongsTo = array( var $belongsTo = array(
'MonetarySource', 'MonetarySource',
'Transaction', 'Transaction',
'Customer',
'Lease',
'DebitLedger' => array( 'DebitLedger' => array(
'className' => 'Ledger', 'className' => 'Ledger',

View File

@@ -63,12 +63,13 @@ echo $this->element('leases',
/********************************************************************** /**********************************************************************
* Account * Customer Account History
*/ */
echo $this->element('accounts', echo $this->element('ledger_entries',
array('caption' => 'Account', array('caption' => 'Account',
'accounts' => array($customer['Account']))); 'customer_id' => $customer['Customer']['id'],
));
/* End "detail supporting" div */ /* End "detail supporting" div */

View File

@@ -143,8 +143,12 @@ foreach ($jqGridColumns AS &$col) {
} }
// Set the default sort column // Set the default sort column
reset($jqGridColumns); if (isset($sort_column)) {
$sortname = current($jqGridColumns); $sortname = $jqGridColumns[$sort_column];
} else {
reset($jqGridColumns);
$sortname = current($jqGridColumns);
}
$sortname = $sortname['index']; $sortname = $sortname['index'];
// Configure the grid setup, giving priority to user defined parameters // Configure the grid setup, giving priority to user defined parameters

View File

@@ -21,6 +21,9 @@ else {
$cols['Debit Account'] = array('index' => 'DebitAccount.name', 'formatter' => 'longname'); $cols['Debit Account'] = array('index' => 'DebitAccount.name', 'formatter' => 'longname');
$cols['Credit Account'] = array('index' => 'CreditAccount.name', 'formatter' => 'longname'); $cols['Credit Account'] = array('index' => 'CreditAccount.name', 'formatter' => 'longname');
} }
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'name');
$cols['Lease'] = array('index' => 'Lease.number', 'formatter' => 'id');
$cols['Unit'] = array('index' => 'Unit.name', 'formatter' => 'name');
$cols['Source'] = array('index' => 'MonetarySource.name', 'formatter' => 'name'); $cols['Source'] = array('index' => 'MonetarySource.name', 'formatter' => 'name');
$cols['Comment'] = array('index' => 'LedgerEntry.comment', 'formatter' => 'comment', 'width'=>150); $cols['Comment'] = array('index' => 'LedgerEntry.comment', 'formatter' => 'comment', 'width'=>150);
if (isset($ledger_id)) { if (isset($ledger_id)) {
@@ -34,7 +37,8 @@ if (isset($reconcile_id)) {
$cols['Applied'] = array('index' => "Reconciliation.amount", 'formatter' => 'currency'); $cols['Applied'] = array('index' => "Reconciliation.amount", 'formatter' => 'currency');
} }
$custom_post_data = compact('ledger_id', 'account_type', 'account_ftype', 'notxgroup'); $custom_post_data = compact('ledger_id', 'account_type', 'account_ftype',
'customer_id', 'lease_id', 'transaction_id', 'notxgroup');
$jqGrid_options = array('jqGridColumns' => $cols, $jqGrid_options = array('jqGridColumns' => $cols,
'controller' => 'ledger_entries', 'controller' => 'ledger_entries',
@@ -42,11 +46,6 @@ $jqGrid_options = array('jqGridColumns' => $cols,
$jqGrid_options += compact('grid_div_id', 'grid_id', 'caption', 'grid_setup', 'limit'); $jqGrid_options += compact('grid_div_id', 'grid_id', 'caption', 'grid_setup', 'limit');
if (isset($ledger_id)) {
$jqGrid_options += array('action' => 'ledger',
'limit' => 50);
}
if (isset($ledger_entries)) { if (isset($ledger_entries)) {
$jqGrid_options += array('custom_ids' => $jqGrid_options += array('custom_ids' =>
array_map(create_function('$data', array_map(create_function('$data',
@@ -54,6 +53,10 @@ if (isset($ledger_entries)) {
$ledger_entries), $ledger_entries),
'limit' => 10); 'limit' => 10);
} }
else {
$jqGrid_options += array('action' => 'ledger',
'limit' => 50);
}
if (isset($reconcile_id)) { if (isset($reconcile_id)) {
$custom_post_data += compact('reconcile_id'); $custom_post_data += compact('reconcile_id');
@@ -61,5 +64,6 @@ if (isset($reconcile_id)) {
} }
$jqGrid_options += compact('custom_post_data'); $jqGrid_options += compact('custom_post_data');
$jqGrid_options['sort_column'] = 'Date';
echo $this->element('jqGrid', $jqGrid_options); echo $this->element('jqGrid', $jqGrid_options);

View File

@@ -11,7 +11,6 @@ echo '<div class="lease view">' . "\n";
$lease_type = $lease['LeaseType']; $lease_type = $lease['LeaseType'];
$customer = $lease['Customer']; $customer = $lease['Customer'];
$account = $lease['Account'];
$unit = $lease['Unit']; $unit = $lease['Unit'];
if (isset($lease['Lease'])) if (isset($lease['Lease']))
@@ -36,10 +35,6 @@ $rows = array(array('ID', $lease['id']),
array('Notice Given', FormatHelper::date($lease['notice_given_date'], true)), array('Notice Given', FormatHelper::date($lease['notice_given_date'], true)),
array('Notice Received', FormatHelper::date($lease['notice_received_date'], true)), array('Notice Received', FormatHelper::date($lease['notice_received_date'], true)),
array('Closed', FormatHelper::date($lease['close_date'], true)), array('Closed', FormatHelper::date($lease['close_date'], true)),
array('Account', $html->link($account['name'],
array('controller' => 'accounts',
'action' => 'view',
$account['id']))),
array('Deposit', FormatHelper::currency($lease['deposit'])), array('Deposit', FormatHelper::currency($lease['deposit'])),
array('Rent', FormatHelper::currency($lease['amount'])), array('Rent', FormatHelper::currency($lease['amount'])),
array('Comment', $lease['comment'])); array('Comment', $lease['comment']));
@@ -53,7 +48,7 @@ echo $this->element('table',
/********************************************************************** /**********************************************************************
* Account Info Box * Lease Info Box
*/ */
echo '<div class="infobox">' . "\n"; echo '<div class="infobox">' . "\n";
@@ -80,15 +75,15 @@ echo '<div CLASS="detail supporting">' . "\n";
/********************************************************************** /**********************************************************************
* Current Ledger * Lease Account History
*/ */
echo $this->element('ledger_entries', echo $this->element('ledger_entries',
array('caption' => "Current Ledger: (#{$account['id']}-{$account['CurrentLedger']['sequence']})", array('caption' => 'Account',
'ledger_id' => $account['CurrentLedger']['id'], 'lease_id' => $lease['id'],
'account_type' => $account['type'],
)); ));
/* End "detail supporting" div */ /* End "detail supporting" div */
echo '</div>' . "\n"; echo '</div>' . "\n";

View File

@@ -13,6 +13,8 @@ $transaction = $entry['Transaction'];
$debit_ledger = $entry['DebitLedger']; $debit_ledger = $entry['DebitLedger'];
$credit_ledger = $entry['CreditLedger']; $credit_ledger = $entry['CreditLedger'];
$source = $entry['MonetarySource']; $source = $entry['MonetarySource'];
$customer = $entry['Customer'];
$lease = $entry['Lease'];
$entry = $entry['LedgerEntry']; $entry = $entry['LedgerEntry'];
$rows = array(array('ID', $entry['id']), $rows = array(array('ID', $entry['id']),
@@ -21,8 +23,16 @@ $rows = array(array('ID', $entry['id']),
'action' => 'view', 'action' => 'view',
$transaction['id']))), $transaction['id']))),
array('Timestamp', FormatHelper::datetime($transaction['stamp'])), array('Timestamp', FormatHelper::datetime($transaction['stamp'])),
array('Monetary Source', (isset($source['id']) array('Customer', $html->link($customer['name'],
? $html->link('#'.$source['id'], array('controller' => 'customers',
'action' => 'view',
$customer['id']))),
array('Lease', $html->link('#'.$lease['id'],
array('controller' => 'leases',
'action' => 'view',
$lease['id']))),
array('Monetary Source', (isset($source['name'])
? $html->link($source['name'],
array('controller' => 'monetary_sources', array('controller' => 'monetary_sources',
'action' => 'view', 'action' => 'view',
$source['id'])) $source['id']))

View File

@@ -54,7 +54,8 @@ echo '<div CLASS="detail supporting">' . "\n";
echo $this->element('ledger_entries', echo $this->element('ledger_entries',
array('caption' => 'Entries in Transaction', array('caption' => 'Entries in Transaction',
'ledger_entries' => $transaction['LedgerEntry'], //'ledger_entries' => $transaction['LedgerEntry'],
'transaction_id' => $transaction['Transaction']['id'],
'notxgroup' => true, 'notxgroup' => true,
)); ));

View File

@@ -57,16 +57,15 @@ echo $this->element('leases',
/********************************************************************** /**********************************************************************
* Ledger History * Current Tenant Lease Account History
*/ */
/* foreach($unit['Lease'] AS $lease) { */
/* pr($lease); */ echo $this->element('ledger_entries',
/* $caption = 'Lease #'.$lease['number'].' (Tenant: '.$lease['Customer']['name'].')'; */ array('caption' => ('Current Lease Account (' .
/* echo $this->element('lease', */ $unit['CurrentLease']['Customer']['name']
/* array('caption' => $caption, */ . ')'),
/* 'entries' => $lease['Customer']['Transaction'], */ 'lease_id' => $unit['CurrentLease']['id'],
/* 'ledger' => array('mix'=>1))); */ ));
/* } */
/* End "detail supporting" div */ /* End "detail supporting" div */