Added a more automated mechanism for adding multiple rent charges to an invoice. Also included is a proration tool. This needs more work though, since it relies on server side data from the lease. Selecting a new lease on the client side will cause this change to fail, and so we'll need to add a column for charged-through. Finally, error messages for invoice and receipt were improved slightly to better explain the error.
git-svn-id: file:///svn-source/pmgr/branches/v0.2.0_work@871 97e9348a-65ac-dc4b-aefc-98561f571b83
This commit is contained in:
@@ -48,24 +48,32 @@ function verifyRequest(formData, jqForm, options) {
|
||||
if (formData[i]['name'] == "data[Customer][id]" &&
|
||||
!(formData[i]['value'] > 0)) {
|
||||
//$("#debug").append('<P>Missing Customer ID');
|
||||
alert("Must select a customer first");
|
||||
alert("Please select a customer first.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (formData[i]['name'] == "data[Transaction][stamp]" &&
|
||||
formData[i]['value'] == '') {
|
||||
//$("#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;
|
||||
}
|
||||
|
||||
// Terrible way to accomplish this...
|
||||
for (var j = 0; j < 20; ++j) {
|
||||
if (formData[i]['name'] == "data[Entry]["+j+"][amount]" &&
|
||||
!(formData[i]['value'] > 0)) {
|
||||
if (formData[i]['name'] == "data[Entry]["+j+"][amount]") {
|
||||
var val = formData[i]['value'].replace(/\$/,'');
|
||||
//$("#debug").append('<P>Bad Amount');
|
||||
alert("Must enter a valid amount");
|
||||
return false;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ $customer = $lease['Customer'];
|
||||
if (isset($lease['Lease']))
|
||||
$lease = $lease['Lease'];
|
||||
|
||||
//pr(compact('unit', 'customer', 'lease', 'movein'));
|
||||
|
||||
/**********************************************************************
|
||||
**********************************************************************
|
||||
@@ -62,19 +63,27 @@ function verifyRequest(formData, jqForm, options) {
|
||||
if (formData[i]['name'] == "data[Transaction][stamp]" &&
|
||||
formData[i]['value'] == '') {
|
||||
//$("#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;
|
||||
}
|
||||
|
||||
// Terrible way to accomplish this...
|
||||
/* for (var j = 0; j < 20; ++j) { */
|
||||
/* if (formData[i]['name'] == "data[Entry]["+j+"][amount]" && */
|
||||
/* !(formData[i]['value'] > 0)) { */
|
||||
/* //$("#debug").append('<P>Bad Amount'); */
|
||||
/* alert("Must enter a valid amount"); */
|
||||
/* return false; */
|
||||
/* } */
|
||||
/* } */
|
||||
for (var j = 0; j < 20; ++j) {
|
||||
if (formData[i]['name'] == "data[Entry]["+j+"][amount]") {
|
||||
var val = formData[i]['value'].replace(/\$/,'');
|
||||
//$("#debug").append('<P>Bad Amount');
|
||||
if (!(val > 0)) {
|
||||
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');
|
||||
@@ -167,6 +176,86 @@ 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 = <?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'])).'")';
|
||||
?>;
|
||||
}
|
||||
|
||||
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) {
|
||||
var id = $("#charge-entry-id").val();
|
||||
addDiv('charge-entry-id', 'charge', 'charges', flash,
|
||||
@@ -178,26 +267,32 @@ function addChargeSource(flash) {
|
||||
echo FormatHelper::phpVarToJavascript
|
||||
($this->element('form_table',
|
||||
array('id' => 'Entry%{id}Form',
|
||||
'class' => "item invoice ledger-entry entry",
|
||||
'class' => "ChargeForm item invoice ledger-entry entry",
|
||||
//'with_name_after' => ':',
|
||||
'field_prefix' => 'Entry.%{id}',
|
||||
'fields' => array
|
||||
("account_id" => array('name' => 'Account',
|
||||
'opts' =>
|
||||
array('options' => $chargeAccounts,
|
||||
array('class' => 'ChargeFormAccount',
|
||||
'options' => $chargeAccounts,
|
||||
'value' => $defaultAccount,
|
||||
),
|
||||
'between' => '<A HREF="#" ONCLICK="setNextRent(\'%{id}\'); return false;">Rent</A>',
|
||||
),
|
||||
"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>',
|
||||
),
|
||||
"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>',
|
||||
),
|
||||
"amount" => array('opts' => array('class' => 'invoice amount')),
|
||||
"comment" => array('opts' => array('size' => 50)),
|
||||
"amount" => array('opts' => array('class' => 'ChargeFormAmount invoice amount'),
|
||||
'between' => '<A HREF="#" ONCLICK="prorate(\'%{id}\'); return false;">Prorate</A>',
|
||||
),
|
||||
"comment" => array('opts' => array('class' => 'ChargeFormComment', 'size' => 50)),
|
||||
),
|
||||
))) . "+\n";
|
||||
?>
|
||||
@@ -330,9 +425,25 @@ Configure::write('debug', '0');
|
||||
$('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(){
|
||||
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']); ?>");
|
||||
<?php else: ?>
|
||||
$("#lease-id").val(0);
|
||||
$("#invoice-lease").html("INTERNAL ERROR");
|
||||
$("#invoice-unit").html("INTERNAL ERROR");
|
||||
@@ -340,6 +451,8 @@ Configure::write('debug', '0');
|
||||
$("#invoice-rent").html("INTERNAL ERROR");
|
||||
$("#invoice-late").html("INTERNAL ERROR");
|
||||
$("#invoice-deposit").html("INTERNAL ERROR");
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
<?php if (empty($movein)): ?>
|
||||
|
||||
@@ -356,7 +469,7 @@ Configure::write('debug', '0');
|
||||
$('#TransactionStamp').after
|
||||
('<input type="hidden"' +
|
||||
' name="data[Transaction][stamp]"' +
|
||||
' value="<?php echo date('m/d/Y', $movein['time']); ?>">');
|
||||
' value="' + $("#TransactionStamp").val() + '">');
|
||||
$("#TransactionComment").val('Move-In Charges');
|
||||
|
||||
<?php if ($movein['deposit'] != 0): ?>
|
||||
@@ -364,61 +477,28 @@ Configure::write('debug', '0');
|
||||
$('#Entry'+id+'Form').removeCol(2);
|
||||
$('#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').after
|
||||
('<input type="hidden"' +
|
||||
' name="data[Entry]['+id+'][effective_date]"' +
|
||||
' value="<?php echo date('m/d/Y', $movein['effective_time']); ?>">');
|
||||
addHidden(id, 'EffectiveDate', 'effective_date');
|
||||
$('#Entry'+id+'AccountId').val(<?php echo $securityDepositAccount; ?>);
|
||||
$('#Entry'+id+'AccountId').after
|
||||
('<input type="hidden"' +
|
||||
' name="data[Entry]['+id+'][account_id]"' +
|
||||
' value="<?php echo $securityDepositAccount; ?>">');
|
||||
addHidden(id, 'AccountId', 'account_id');
|
||||
$('#Entry'+id+'Amount').val("<?php echo FormatHelper::currency($movein['deposit']); ?>");
|
||||
$('#Entry'+id+'Amount').after
|
||||
('<input type="hidden"' +
|
||||
' name="data[Entry]['+id+'][amount]"' +
|
||||
' value="<?php echo FormatHelper::currency($movein['deposit']); ?>">');
|
||||
//$('#Entry'+id+'Comment').val('Move-In Security Deposit');
|
||||
addHidden(id, 'Amount', 'amount');
|
||||
$('#Entry'+id+'Comment').removeAttr('disabled');
|
||||
<?php endif; ?>
|
||||
|
||||
id = addChargeSource(false);
|
||||
$('#Entry'+id+'Form').removeCol(2);
|
||||
$('#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').after
|
||||
('<input type="hidden"' +
|
||||
' name="data[Entry]['+id+'][effective_date]"' +
|
||||
' value="<?php echo date('m/d/Y', $movein['effective_time']); ?>">');
|
||||
$('#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)' : ''); ?>");
|
||||
setNextRent(id);
|
||||
addHidden(id, 'EffectiveDate', 'effective_date');
|
||||
addHidden(id, 'ThroughDate', 'through_date');
|
||||
addHidden(id, 'AccountId', 'account_id');
|
||||
addHidden(id, 'Amount', 'amount');
|
||||
$('#Entry'+id+'Comment').removeAttr('disabled');
|
||||
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
<?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');
|
||||
<?php else: ?>
|
||||
onGridState(null, 'visible');
|
||||
|
||||
Reference in New Issue
Block a user