Merge in the v0.2.0 work

git-svn-id: file:///svn-source/pmgr/trunk@938 97e9348a-65ac-dc4b-aefc-98561f571b83
This commit is contained in:
abijah
2010-03-02 03:25:52 +00:00
9 changed files with 321 additions and 6827 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -47,7 +47,17 @@ class StatementEntriesController extends AppController {
if (!empty($params['post']['custom']['statement_entry_id'])) { if (!empty($params['post']['custom']['statement_entry_id'])) {
$link['ChargeEntry'] = array(); $link['ChargeEntry'] = array();
$link['DisbursementEntry'] = array(); // This query actually represents a union...
// Unpaid Charge/Surplus: ChargeID - NULL; DisbursementID - NULL
// Paid Charge/Refund: ChargeID - NULL; DisbursementID - !NULL
// Disbursement/Reversal: ChargeID - !NULL; DisbursementID - NULL
// <EMPTY SET>: ChargeID - !NULL; DisbursementID - !NULL
//
// The query is really slow unless we add the `id` condition to the join.
// A cleaner query would be nice, but we must work within the Cake framework.
$link['DisbursementEntry'] = array('conditions' =>
'`DisbursementEntry`.`id` = '
. $params['post']['custom']['statement_entry_id']);
} }
return array('link' => $link); return array('link' => $link);

View File

@@ -48,26 +48,34 @@ function verifyRequest(formData, jqForm, options) {
if (formData[i]['name'] == "data[Customer][id]" && if (formData[i]['name'] == "data[Customer][id]" &&
!(formData[i]['value'] > 0)) { !(formData[i]['value'] > 0)) {
//$("#debug").append('<P>Missing Customer ID'); //$("#debug").append('<P>Missing Customer ID');
alert("Must select a customer first"); alert("Please select a customer first.");
return false; return false;
} }
if (formData[i]['name'] == "data[Transaction][stamp]" && if (formData[i]['name'] == "data[Transaction][stamp]" &&
formData[i]['value'] == '') { formData[i]['value'] == '') {
//$("#debug").append('<P>Bad Stamp'); //$("#debug").append('<P>Bad Stamp');
alert("Must enter a valid date stamp"); if (formData[i]['value'] != '')
alert(formData[i]['value'] + " is not valid date stamp. Please correct it.");
else
alert("Please enter a valid date stamp first.");
return false; return false;
} }
// Terrible way to accomplish this... // Terrible way to accomplish this...
for (var j = 0; j < 20; ++j) { for (var j = 0; j < 20; ++j) {
if (formData[i]['name'] == "data[Entry]["+j+"][amount]" && if (formData[i]['name'] == "data[Entry]["+j+"][amount]") {
!(formData[i]['value'] > 0)) { var val = formData[i]['value'].replace(/\$/,'');
//$("#debug").append('<P>Bad Amount'); //$("#debug").append('<P>Bad Amount');
alert("Must enter a valid amount"); if (!(val > 0)) {
if (formData[i]['value'] == '')
alert("Please enter an amount first.");
else
alert('"'+formData[i]['value']+'"' + " is not valid amount. Please correct it.");
return false; return false;
} }
} }
}
} }

View File

@@ -11,6 +11,7 @@ $cols['Signed'] = array('index' => 'Lease.lease_date', 'formatter' => 'dat
$cols['Move-In'] = array('index' => 'Lease.movein_date', 'formatter' => 'date'); $cols['Move-In'] = array('index' => 'Lease.movein_date', 'formatter' => 'date');
$cols['Move-Out'] = array('index' => 'Lease.moveout_date', 'formatter' => 'date'); $cols['Move-Out'] = array('index' => 'Lease.moveout_date', 'formatter' => 'date');
$cols['Closed'] = array('index' => 'Lease.close_date', 'formatter' => 'date'); $cols['Closed'] = array('index' => 'Lease.close_date', 'formatter' => 'date');
$cols['Charge-Thru'] = array('index' => 'Lease.charge_through_date', 'formatter' => 'date');
$cols['Paid-Thru'] = array('index' => 'Lease.paid_through_date', 'formatter' => 'date'); $cols['Paid-Thru'] = array('index' => 'Lease.paid_through_date', 'formatter' => 'date');
$cols['Status'] = array('index' => 'status', 'formatter' => 'longenum'); $cols['Status'] = array('index' => 'status', 'formatter' => 'longenum');
$cols['Balance'] = array('index' => 'balance', 'formatter' => 'currency'); $cols['Balance'] = array('index' => 'balance', 'formatter' => 'currency');
@@ -18,7 +19,7 @@ $cols['Comment'] = array('index' => 'Lease.comment', 'formatter' => 'com
if (!empty($this->params['action'])) { if (!empty($this->params['action'])) {
if ($this->params['action'] === 'closed') if ($this->params['action'] === 'closed')
$grid->invalidFields(array('Paid-Thru', 'Status')); $grid->invalidFields(array('Charge-Thru', 'Paid-Thru', 'Status'));
elseif ($this->params['action'] === 'active') elseif ($this->params['action'] === 'active')
$grid->invalidFields(array('Closed')); $grid->invalidFields(array('Closed'));
elseif ($this->params['action'] === 'delinquent') elseif ($this->params['action'] === 'delinquent')
@@ -32,4 +33,4 @@ $grid
->defaultFields(array('Lease')) ->defaultFields(array('Lease'))
->searchFields(array('Customer', 'Unit')) ->searchFields(array('Customer', 'Unit'))
->render($this, isset($config) ? $config : null, ->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Signed', 'Status', 'Comment'))); array_diff(array_keys($cols), array('Signed', 'Charge-Thru', 'Status', 'Comment')));

View File

@@ -10,6 +10,7 @@ $customer = $lease['Customer'];
if (isset($lease['Lease'])) if (isset($lease['Lease']))
$lease = $lease['Lease']; $lease = $lease['Lease'];
//pr(compact('unit', 'customer', 'lease', 'movein'));
/********************************************************************** /**********************************************************************
********************************************************************** **********************************************************************
@@ -25,6 +26,8 @@ Configure::write('debug', '0');
<script type="text/javascript"><!-- <script type="text/javascript"><!--
var lease_charge_through;
// prepare the form when the DOM is ready // prepare the form when the DOM is ready
$(document).ready(function() { $(document).ready(function() {
var options = { var options = {
@@ -62,19 +65,27 @@ function verifyRequest(formData, jqForm, options) {
if (formData[i]['name'] == "data[Transaction][stamp]" && if (formData[i]['name'] == "data[Transaction][stamp]" &&
formData[i]['value'] == '') { formData[i]['value'] == '') {
//$("#debug").append('<P>Bad Stamp'); //$("#debug").append('<P>Bad Stamp');
alert("Must enter a valid date stamp"); if (formData[i]['value'] != '')
alert(formData[i]['value'] + " is not valid date stamp. Please correct it.");
else
alert("Please enter a valid date stamp first.");
return false; return false;
} }
// Terrible way to accomplish this... // Terrible way to accomplish this...
/* for (var j = 0; j < 20; ++j) { */ for (var j = 0; j < 20; ++j) {
/* if (formData[i]['name'] == "data[Entry]["+j+"][amount]" && */ if (formData[i]['name'] == "data[Entry]["+j+"][amount]") {
/* !(formData[i]['value'] > 0)) { */ var val = formData[i]['value'].replace(/\$/,'');
/* //$("#debug").append('<P>Bad Amount'); */ //$("#debug").append('<P>Bad Amount');
/* alert("Must enter a valid amount"); */ if (!(val > 0)) {
/* return false; */ if (formData[i]['value'] == '')
/* } */ alert("Please enter an amount for Charge #"+j+", or remove the Charge completely.");
/* } */ else
alert('"'+formData[i]['value']+'"' + " is not a valid amount for Charge #"+j+". Please correct it.");
return false;
}
}
}
} }
//$("#debug").append('OK'); //$("#debug").append('OK');
@@ -142,6 +153,7 @@ function onRowSelect(grid_id, lease_id) {
$("#invoice-deposit").html($(grid_id).getCell(lease_id, 'Lease-deposit') $("#invoice-deposit").html($(grid_id).getCell(lease_id, 'Lease-deposit')
? $(grid_id).getCell(lease_id, 'Lease-deposit') ? $(grid_id).getCell(lease_id, 'Lease-deposit')
: '-'); : '-');
lease_charge_through = $(grid_id).getCell(lease_id, 'Lease-charge_through_date')
// Hide the "no lease" message and show the current lease // Hide the "no lease" message and show the current lease
$(".lease-selection-invalid").hide(); $(".lease-selection-invalid").hide();
@@ -167,6 +179,78 @@ function onGridState(grid_id, state) {
} }
} }
function setNextRent(id) {
var chg_thru;
$('.ChargeForm').each( function(i) {
if ($('.ChargeFormThroughDate', this).attr('id') == 'Entry'+id+'ThroughDate')
return;
if ($('.ChargeFormAccount option:selected', this).val() == <?php echo $rentAccount ?>
&& $('.ChargeFormThroughDate', this).val()) {
var dt = new Date($('.ChargeFormThroughDate', this).val());
//$('#debug').append('Rent in ' + i + '; date ' + dt + '<BR>');
if (chg_thru == null || dt > chg_thru)
chg_thru = dt;
}
});
if (!chg_thru)
chg_thru = new Date(lease_charge_through);
if (chg_thru < dateEOM(chg_thru)) {
// Add a charge to finish out the month
datepickerSet('Entry'+id+'EffectiveDate', dateTomorrow(chg_thru));
datepickerSet('Entry'+id+'ThroughDate', dateEOM(chg_thru));
} else {
// Add a whole month's charge for next month
datepickerSet('Entry'+id+'EffectiveDate', dateNextBOM(chg_thru));
datepickerSet('Entry'+id+'ThroughDate', dateNextEOM(chg_thru));
}
// Now add in the amount owed based on the calculated
// effective and through dates.
prorate(id);
}
function prorate(id) {
var edt = datepickerGet('Entry'+id+'EffectiveDate');
var tdt = datepickerGet('Entry'+id+'ThroughDate');
var rent = $('#invoice-rent').html().replace(/\$/,'');
// Reset the comment. It might wipe out a user comment,
// but it's probably low risk/concern
$('#Entry'+id+'Comment').val('');
if (edt == null || tdt == null) {
alert('Can only prorate with both effective and through dates');
rent = 0;
}
else if (edt > tdt) {
alert('Effective date is later than the Through date');
rent = 0;
}
else if (tdt.getMonth() == edt.getMonth() + 1 &&
edt.getDate() == tdt.getDate() + 1) {
// appears to be anniversary billing, one full cycle
}
else if (edt.getTime() == dateBOM(edt).getTime() &&
tdt.getTime() == dateEOM(edt).getTime()) {
// appears to be one full month
}
else {
var one_day=1000*60*60*24;
var days = Math.ceil((tdt.getTime()-edt.getTime()+1)/(one_day));
var dim =
((edt.getMonth() == tdt.getMonth())
? dateEOM(edt).getDate() // prorated within the month.
: 30); // prorated across months.
rent *= days / dim;
$('#Entry'+id+'Comment').val('Rent proration: '+days+'/'+dim+' days');
}
$('#Entry'+id+'Amount').val(fmtCurrency(rent));
}
function addChargeSource(flash) { function addChargeSource(flash) {
var id = $("#charge-entry-id").val(); var id = $("#charge-entry-id").val();
addDiv('charge-entry-id', 'charge', 'charges', flash, addDiv('charge-entry-id', 'charge', 'charges', flash,
@@ -178,26 +262,32 @@ function addChargeSource(flash) {
echo FormatHelper::phpVarToJavascript echo FormatHelper::phpVarToJavascript
($this->element('form_table', ($this->element('form_table',
array('id' => 'Entry%{id}Form', array('id' => 'Entry%{id}Form',
'class' => "item invoice ledger-entry entry", 'class' => "ChargeForm item invoice ledger-entry entry",
//'with_name_after' => ':', //'with_name_after' => ':',
'field_prefix' => 'Entry.%{id}', 'field_prefix' => 'Entry.%{id}',
'fields' => array 'fields' => array
("account_id" => array('name' => 'Account', ("account_id" => array('name' => 'Account',
'opts' => 'opts' =>
array('options' => $chargeAccounts, array('class' => 'ChargeFormAccount',
'options' => $chargeAccounts,
'value' => $defaultAccount, 'value' => $defaultAccount,
), ),
'between' => '<A HREF="#" ONCLICK="setNextRent(\'%{id}\'); return false;">Rent</A>',
), ),
"effective_date" => array('opts' => "effective_date" => array('opts' =>
array('type' => 'text'), array('class' => 'ChargeFormEffectiveDate',
'type' => 'text'),
'between' => '<A HREF="#" ONCLICK="datepickerBOM(\'TransactionStamp\',\'Entry%{id}EffectiveDate\'); return false;">BOM</A>', 'between' => '<A HREF="#" ONCLICK="datepickerBOM(\'TransactionStamp\',\'Entry%{id}EffectiveDate\'); return false;">BOM</A>',
), ),
"through_date" => array('opts' => "through_date" => array('opts' =>
array('type' => 'text'), array('class' => 'ChargeFormThroughDate',
'type' => 'text'),
'between' => '<A HREF="#" ONCLICK="datepickerEOM(\'Entry%{id}EffectiveDate\',\'Entry%{id}ThroughDate\'); return false;">EOM</A>', 'between' => '<A HREF="#" ONCLICK="datepickerEOM(\'Entry%{id}EffectiveDate\',\'Entry%{id}ThroughDate\'); return false;">EOM</A>',
), ),
"amount" => array('opts' => array('class' => 'invoice amount')), "amount" => array('opts' => array('class' => 'ChargeFormAmount invoice amount'),
"comment" => array('opts' => array('size' => 50)), 'between' => '<A HREF="#" ONCLICK="prorate(\'%{id}\'); return false;">Prorate</A>',
),
"comment" => array('opts' => array('class' => 'ChargeFormComment', 'size' => 50)),
), ),
))) . "+\n"; ))) . "+\n";
?> ?>
@@ -233,7 +323,8 @@ if (empty($movein))
array('gridstate' => array('gridstate' =>
'onGridState("#"+$(this).attr("id"), gridstate)'), 'onGridState("#"+$(this).attr("id"), gridstate)'),
), ),
'exclude' => array('Closed'), 'include' => array('Charge-Thru'),
'exclude' => array('Closed', 'Paid-Thru'),
'action' => 'active', 'action' => 'active',
'nolinks' => true, 'nolinks' => true,
'limit' => 10, 'limit' => 10,
@@ -330,9 +421,34 @@ Configure::write('debug', '0');
$('tr td:nth-child('+col+'), tr th:nth-child('+col+')', this).remove(); $('tr td:nth-child('+col+'), tr th:nth-child('+col+')', this).remove();
}; };
function addHidden(id, fld, name) {
$('#Entry'+id+fld).after
('<input type="hidden"' +
' name="data[Entry]['+id+']['+name+']"' +
' value="' + $('#Entry'+id+fld).val() + '">');
}
$(document).ready(function(){ $(document).ready(function(){
datepicker('TransactionStamp'); datepicker('TransactionStamp');
<?php if (isset($lease['id'])): ?>
$("#lease-id").val(<?php echo $lease['id']; ?>);
$("#invoice-lease").html("<?php echo '#'.$lease['number']; ?>");
$("#invoice-unit").html("<?php echo $unit['name']; ?>");
$("#invoice-customer").html("<?php echo $customer['name']; ?>");
$("#invoice-rent").html("<?php echo FormatHelper::currency($lease['rent']); ?>");
$("#invoice-late").html("<?php echo FormatHelper::currency($defaultLate); ?>");
$("#invoice-deposit").html("<?php echo FormatHelper::currency($lease['deposit']); ?>");
lease_charge_through = <?php
if ($lease['charge_through_date'])
echo 'new Date("'.date('m/d/Y', strtotime($lease['charge_through_date'])).'")';
elseif ($lease['paid_through_date'])
echo 'new Date("'.date('m/d/Y', strtotime($lease['paid_through_date'])).'")';
else
echo 'dateYesterday("'.date('m/d/Y', strtotime($lease['movein_date'])).'")';
?>;
<?php else: ?>
$("#lease-id").val(0); $("#lease-id").val(0);
$("#invoice-lease").html("INTERNAL ERROR"); $("#invoice-lease").html("INTERNAL ERROR");
$("#invoice-unit").html("INTERNAL ERROR"); $("#invoice-unit").html("INTERNAL ERROR");
@@ -340,6 +456,8 @@ Configure::write('debug', '0');
$("#invoice-rent").html("INTERNAL ERROR"); $("#invoice-rent").html("INTERNAL ERROR");
$("#invoice-late").html("INTERNAL ERROR"); $("#invoice-late").html("INTERNAL ERROR");
$("#invoice-deposit").html("INTERNAL ERROR"); $("#invoice-deposit").html("INTERNAL ERROR");
<?php endif; ?>
<?php if (empty($movein)): ?> <?php if (empty($movein)): ?>
@@ -356,7 +474,7 @@ Configure::write('debug', '0');
$('#TransactionStamp').after $('#TransactionStamp').after
('<input type="hidden"' + ('<input type="hidden"' +
' name="data[Transaction][stamp]"' + ' name="data[Transaction][stamp]"' +
' value="<?php echo date('m/d/Y', $movein['time']); ?>">'); ' value="' + $("#TransactionStamp").val() + '">');
$("#TransactionComment").val('Move-In Charges'); $("#TransactionComment").val('Move-In Charges');
<?php if ($movein['deposit'] != 0): ?> <?php if ($movein['deposit'] != 0): ?>
@@ -364,61 +482,28 @@ Configure::write('debug', '0');
$('#Entry'+id+'Form').removeCol(2); $('#Entry'+id+'Form').removeCol(2);
$('#Entry'+id+'Form input, #Entry'+id+'Form select').attr('disabled', true); $('#Entry'+id+'Form input, #Entry'+id+'Form select').attr('disabled', true);
$('#Entry'+id+'EffectiveDate').val("<?php echo date('m/d/Y', $movein['effective_time']); ?>"); $('#Entry'+id+'EffectiveDate').val("<?php echo date('m/d/Y', $movein['effective_time']); ?>");
$('#Entry'+id+'EffectiveDate').after addHidden(id, 'EffectiveDate', 'effective_date');
('<input type="hidden"' +
' name="data[Entry]['+id+'][effective_date]"' +
' value="<?php echo date('m/d/Y', $movein['effective_time']); ?>">');
$('#Entry'+id+'AccountId').val(<?php echo $securityDepositAccount; ?>); $('#Entry'+id+'AccountId').val(<?php echo $securityDepositAccount; ?>);
$('#Entry'+id+'AccountId').after addHidden(id, 'AccountId', 'account_id');
('<input type="hidden"' +
' name="data[Entry]['+id+'][account_id]"' +
' value="<?php echo $securityDepositAccount; ?>">');
$('#Entry'+id+'Amount').val("<?php echo FormatHelper::currency($movein['deposit']); ?>"); $('#Entry'+id+'Amount').val("<?php echo FormatHelper::currency($movein['deposit']); ?>");
$('#Entry'+id+'Amount').after addHidden(id, 'Amount', 'amount');
('<input type="hidden"' +
' name="data[Entry]['+id+'][amount]"' +
' value="<?php echo FormatHelper::currency($movein['deposit']); ?>">');
//$('#Entry'+id+'Comment').val('Move-In Security Deposit');
$('#Entry'+id+'Comment').removeAttr('disabled'); $('#Entry'+id+'Comment').removeAttr('disabled');
<?php endif; ?> <?php endif; ?>
id = addChargeSource(false); id = addChargeSource(false);
$('#Entry'+id+'Form').removeCol(2); $('#Entry'+id+'Form').removeCol(2);
$('#Entry'+id+'Form input, #Entry'+id+'Form select').attr('disabled', true); $('#Entry'+id+'Form input, #Entry'+id+'Form select').attr('disabled', true);
$('#Entry'+id+'EffectiveDate').val("<?php echo date('m/d/Y', $movein['effective_time']); ?>"); setNextRent(id);
$('#Entry'+id+'EffectiveDate').after addHidden(id, 'EffectiveDate', 'effective_date');
('<input type="hidden"' + addHidden(id, 'ThroughDate', 'through_date');
' name="data[Entry]['+id+'][effective_date]"' + addHidden(id, 'AccountId', 'account_id');
' value="<?php echo date('m/d/Y', $movein['effective_time']); ?>">'); addHidden(id, 'Amount', 'amount');
$('#Entry'+id+'ThroughDate').val("<?php echo date('m/d/Y', $movein['through_time']); ?>");
$('#Entry'+id+'ThroughDate').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][through_date]"' +
' value="<?php echo date('m/d/Y', $movein['through_time']); ?>">');
$('#Entry'+id+'AccountId').val(<?php echo $rentAccount; ?>);
$('#Entry'+id+'AccountId').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][account_id]"' +
' value="<?php echo $rentAccount; ?>">');
$('#Entry'+id+'Amount').val("<?php echo FormatHelper::currency($movein['prorated_rent']); ?>");
$('#Entry'+id+'Amount').after
('<input type="hidden"' +
' name="data[Entry]['+id+'][amount]"' +
' value="<?php echo FormatHelper::currency($movein['prorated_rent']); ?>">');
$('#Entry'+id+'Comment').val("<?php echo($movein['prorated'] ? 'Move-In Rent (Prorated)' : ''); ?>");
$('#Entry'+id+'Comment').removeAttr('disabled'); $('#Entry'+id+'Comment').removeAttr('disabled');
<?php endif; ?> <?php endif; ?>
<?php if (isset($lease['id'])): ?> <?php if (isset($lease['id'])): ?>
$("#lease-id").val(<?php echo $lease['id']; ?>);
$("#invoice-lease").html("<?php echo '#'.$lease['number']; ?>");
$("#invoice-unit").html("<?php echo $unit['name']; ?>");
$("#invoice-customer").html("<?php echo $customer['name']; ?>");
$("#invoice-rent").html("<?php echo FormatHelper::currency($lease['rent']); ?>");
$("#invoice-late").html("<?php echo FormatHelper::currency($defaultLate); ?>");
$("#invoice-deposit").html("<?php echo FormatHelper::currency($lease['deposit']); ?>");
onGridState(null, 'hidden'); onGridState(null, 'hidden');
<?php else: ?> <?php else: ?>
onGridState(null, 'visible'); onGridState(null, 'visible');

View File

@@ -33,8 +33,10 @@ for ($i=1; $i<=4; ++$i)
if (!empty($ttype["data{$i}_name"])) if (!empty($ttype["data{$i}_name"]))
$rows[] = array($ttype["data{$i}_name"], $tender["data{$i}"]); $rows[] = array($ttype["data{$i}_name"], $tender["data{$i}"]);
if (!empty($tender['deposit_transaction_id'])) $rows[] = array('Deposit',
$rows[] = array('Deposit', $html->link('#'.$tender['deposit_transaction_id'], empty($tender['deposit_transaction_id'])
? "-"
: $html->link('#'.$tender['deposit_transaction_id'],
array('controller' => 'transactions', array('controller' => 'transactions',
'action' => 'deposit_slip', 'action' => 'deposit_slip',
$tender['deposit_transaction_id']))); $tender['deposit_transaction_id'])));

View File

@@ -16,6 +16,14 @@ div#debug-kit-toolbar
{ display: none; } { display: none; }
/************************************************************
* Form inputs
*/
/* The "page N / M" input box... make it look like normal text */
input[type='button'], input[type='submit'], input[type='reset']
{ display: none; }
/************************************************************ /************************************************************
* Grid display * Grid display
*/ */

View File

@@ -67,7 +67,17 @@ function dump(element, limit, depth) {
if (props.length == 0) if (props.length == 0)
return ''; return '';
return pad + '<ol><li>' + props.join("</li>\n" + pad + pad1 + "<li>") + "</li>\n" + pad + "</ol>"; if (typeof dump.dumpid == 'undefined')
dump.dumpid = 0;
++dump.dumpid;
return (pad
+ '<A HREF="#" ONCLICK="$(\'#dumpid-'+dump.dumpid+'\').toggle(); return false;">(hide members)</A><BR>'
+ '<ol id="dumpid-'+dump.dumpid+'" STYLE="padding-top:0; margin-top:0;">'
+ '<li>'
+ props.join("</li>\n" + pad + pad1 + '<li id="dumpid-'+dump.dumpid+'">')
+ "</li>\n"
+ pad + "</ol>");
} }
function dump_window(element, limit) { function dump_window(element, limit) {
@@ -158,69 +168,102 @@ function datepicker(id) {
} }
} }
function datepickerGet(id) {
function datepickerNow(id, usetime) { if (id == null)
var now = new Date();
if ($("#"+id).datepicker != null) {
// datepicker seems to squash the time portion,
// so we have to pass in a copy of now instead.
$("#"+id).datepicker('setDate', new Date(now));
}
else {
$("#"+id).val(((now.getMonth()+1) < 10 ? '0' : '')
+ (now.getMonth()+1) + '/'
+ (now.getDate() < 10 ? '0' : '')
+ now.getDate() + '/'
+ now.getFullYear());
}
if (usetime == null)
usetime = true;
$("#"+id).val($("#"+id).val() +
(usetime
? (' '
+ (now.getHours() < 10 ? '0' : '')
+ now.getHours() + ':'
+ (now.getMinutes() < 10 ? '0' : '')
+ now.getMinutes())
: ''));
}
function datepickerSet(fromid, id, a, b) {
var dt;
if (fromid == null)
dt = new Date(); dt = new Date();
else { else {
if ($("#"+id).datepicker != null) if ($("#"+id).datepicker != null && $("#"+id).datepicker('getDate') != null)
dt = new Date($("#"+fromid).datepicker('getDate')); dt = new Date($("#"+id).datepicker('getDate'));
else if ($("#"+id).val())
dt = new Date($("#"+id).val());
else else
dt = new Date($("#"+fromid).val()); dt = null;
} }
if (a != null) return dt;
dt.setDate(a); }
if (b != null)
dt.setDate(b);
if ($("#"+id).datepicker != null) function datepickerStr(id) {
$("#"+id).datepicker('setDate', dt); return dateStr(datepickerGet(id));
}
function datepickerSet(id, dt_or_str, usetime) {
if ($("#"+id).datepicker != null && $("#"+id).datepicker('getDate') != null) {
// datepicker seems to squash the time portion,
// so we have to pass in a copy of dt instead.
$("#"+id).datepicker('setDate', new Date(dt_or_str));
if (usetime)
$("#"+id).val($("#"+id).val() + ' ' + timeStr(dt_or_str));
}
else { else {
$("#"+id).val(((dt.getMonth()+1) < 10 ? '0' : '') $("#"+id).val(dateStr(dt_or_str), usetime);
}
}
function datepickerNow(id, usetime) {
datepickerSet(id, new Date(), usetime == null ? true : usetime);
}
function dateStr(dt_or_str, usetime) {
var dt = new Date(dt_or_str);
return (((dt.getMonth()+1) < 10 ? '0' : '')
+ (dt.getMonth()+1) + '/' + (dt.getMonth()+1) + '/'
+ (dt.getDate() < 10 ? '0' : '') + (dt.getDate() < 10 ? '0' : '')
+ dt.getDate() + '/' + dt.getDate() + '/'
+ dt.getFullYear()); + dt.getFullYear()
} + (usetime ? ' ' + timeStr(dt) : ''));
} }
function datepickerBOM(fromid, id) { function timeStr(dt_or_str) {
datepickerSet(fromid, id, 1); var dt = new Date(dt_or_str);
return ((dt.getHours() < 10 ? '0' : '')
+ dt.getHours() + ':'
+ (dt.getMinutes() < 10 ? '0' : '')
+ dt.getMinutes());
} }
function datepickerEOM(fromid, id) { function dateAdd(dt_or_str, a, b, m, d) {
datepickerSet(fromid, id, 32, 0); var dt = new Date(dt_or_str);
if (m != null) {
dt.setDate(1);
dt.setMonth(dt.getMonth() + m);
//$('#debug').append('set month ('+m+') ' + (dt.getMonth() + m) + '= ' + dt + '<BR>');
} }
if (d != null) {
dt.setDate(dt.getDate() + d);
//$('#debug').append('set day ('+d+') ' + (dt.getDate() + d) + '= ' + dt + '<BR>');
}
if (a != null) {
dt.setDate(a);
//$('#debug').append('set date ('+a+') = ' + dt + '<BR>');
}
if (b != null) {
dt.setDate(b);
//$('#debug').append('set date ('+b+') = ' + dt + '<BR>');
}
return dt;
}
function dateYesterday(dt) { return dateAdd(dt,null,null,null,-1); }
function dateTomorrow(dt) { return dateAdd(dt,null,null,null,1); }
function dateBOM(dt) { return dateAdd(dt,1); }
function dateNextBOM(dt) { return dateAdd(dt,1,null,1); }
function dateEOM(dt) { return dateAdd(dt,32,0); }
function dateNextEOM(dt) { return dateAdd(dt,32,0,1); }
function datepickerBOM(fromid, id)
{ datepickerSet(id, dateBOM(datepickerGet(fromid))); }
function datepickerEOM(fromid, id)
{ datepickerSet(id, dateEOM(datepickerGet(fromid))); }
function datepickerNextBOM(fromid, id)
{ datepickerSet(id, dateNextBOM(datepickerGet(fromid))); }
function datepickerNextEOM(fromid, id)
{ datepickerSet(id, dateNextEOM(datepickerGet(fromid))); }
// REVISIT <AP>: 20090617 // REVISIT <AP>: 20090617

View File

@@ -1,3 +1,9 @@
Reversing a rent charge is not considered as part of the
"charged-through" date on the lease. Consequently, the
reversal itself ensures the charge is fully "paid", and
the "paid-through" date is also out of whack.
Add NSF Fee to the NSF entry page (It's hardcoded right now Add NSF Fee to the NSF entry page (It's hardcoded right now
in Transaction to $35). in Transaction to $35).
@@ -15,13 +21,6 @@ be closed and no more charges are possible. The other option
would just be a checkbox to say "close lease (no more charges)", would just be a checkbox to say "close lease (no more charges)",
or let them clear it and have them close the lease manually. or let them clear it and have them close the lease manually.
Invoice
- Have some sort of rent-proration tool
- Have Rent automatically populate the Effective/Through
as well as rent (pro-rating if necessary). The dates
should take into account the customer charge through
date, as well as any other rents on the invoice.
Allow waiving a complete charge, even if it already has payments Allow waiving a complete charge, even if it already has payments
applied (at the moment, we just can waive the charge balance). applied (at the moment, we just can waive the charge balance).
@@ -188,3 +187,37 @@ Unit Size has no controller. Either remove the link from the
units grid, or implement the controller. units grid, or implement the controller.
When performing a move-in, the receipt page is broken
when trying to enter a concession. javascript complains about
an invalid value, and the page is not submitted.
- Allegedly. I believe Shirley's browser was acting up
on her, and based on the logs, it seems that indeed
what ultimately worked just fine for a concession entry
was really the exact same page that was stuck. While
on the phone it was evident that here browser was
doing a javascript wig-out, and it wasn't related to
a slow internet connection.
Add invoice rent helpers
- monthly proration tool
- select from/to dates, and hit "prorate"
- charge through date
- enter charge through date, and the invoice
will automatically have charges for each month
from the current charge-through date to the
new charge-through date.
- charge N months
- enter number of months, and the invoice
will automatically have charges for each month
from the current charge-through date for N months
- next rent
- same as, or instead of, "charge N months", where
N is 1
Invoice
- Have some sort of rent-proration tool
- Have Rent automatically populate the Effective/Through
as well as rent (pro-rating if necessary). The dates
should take into account the customer charge through
date, as well as any other rents on the invoice.