298 lines
10 KiB
Plaintext
298 lines
10 KiB
Plaintext
/*******************************************************/
|
||
/* This program calculates three kinds of depreciation */
|
||
/* schedules: straight_line, sum_of_the_years, and */
|
||
/* double_declining. */
|
||
/*******************************************************/
|
||
depreciate:
|
||
procedure options(main);
|
||
%replace
|
||
clear_screen by '^z',
|
||
indent by 15,
|
||
ITC_rate by .1,
|
||
bonus_rate by .1,
|
||
bonus_max by 2000;
|
||
|
||
declare
|
||
selling_price decimal(8,2),
|
||
adjusted_price decimal(8,2),
|
||
residual_value decimal(8,2),
|
||
year_value decimal(8,2),
|
||
depreciation_value decimal(8,2),
|
||
total_depreciation decimal(8,2),
|
||
book_value decimal(8,2),
|
||
tax_rate decimal(3,2),
|
||
sales_tax decimal(8,2),
|
||
tax_bracket decimal(2),
|
||
FYD decimal(8,2),
|
||
ITC decimal(8,2),
|
||
bonus_dep decimal(8,2),
|
||
months_remaining decimal(2),
|
||
new character(4),
|
||
factor decimal(2,1),
|
||
years decimal(2),
|
||
year_sum decimal(3),
|
||
current_year decimal(2),
|
||
select_sched character(1);
|
||
|
||
declare
|
||
copy_to_list character(4),
|
||
output file variable,
|
||
(sysprint, list) file;
|
||
|
||
declare
|
||
schedules character(3) static initial ('syd'),
|
||
schedule (0:3) entry variable;
|
||
|
||
schedule (0) = error;
|
||
schedule (1) = straight_line;
|
||
schedule (2) = sum_of_years;
|
||
schedule (3) = double_declining;
|
||
|
||
open file (sysprint) stream print pagesize(0)
|
||
title ('$con');
|
||
|
||
do while('1'b);
|
||
put list(clear_screen,'^i^i^iDepreciation Schedule');
|
||
put skip(3) list('^i^iSelling Price? ');
|
||
get list(selling_price);
|
||
put list('^i^iResidual Value? ');
|
||
get list(residual_value);
|
||
put list('^i^iSales Tax (%)? ');
|
||
get list(tax_rate);
|
||
put list('^i^iTax Bracket(%)? ');
|
||
get list(tax_bracket);
|
||
put list('^i^iProRate Months? ');
|
||
get list(months_remaining);
|
||
put list('^i^iHow Many Years? ');
|
||
get list(years);
|
||
put list('^i^iNew? (yes/no) ');
|
||
get list(new);
|
||
put edit('^i^iSchedule:',
|
||
'^i^iStraight (s)',
|
||
'^i^iSum-of-Yrs (y)',
|
||
'^i^iDouble Dec (d)? ') (a,skip);
|
||
get list(select_sched);
|
||
put list('^i^iList? (yes/no) ');
|
||
get list(copy_to_list);
|
||
if copy_to_list = 'yes' then
|
||
open file(list) stream print title('$lst');
|
||
factor = 1.5;
|
||
if new = 'yes' then
|
||
factor = 2.0;
|
||
sales_tax = decimal(selling_price*tax_rate,12,2)/100+.005;
|
||
if new = 'yes' | selling_price <= 100000.00 then
|
||
ITC = selling_price * ITC_rate;
|
||
else
|
||
ITC = 100000 * ITC_rate;
|
||
bonus_dep = selling_price * bonus_rate;
|
||
if bonus_dep > bonus_max then
|
||
bonus_dep = bonus_max;
|
||
put list(clear_screen);
|
||
call display(sysprint);
|
||
if copy_to_list = 'yes' then
|
||
call display(list);
|
||
put skip list('^i^i^i Type RETURN to Continue');
|
||
get skip(2);
|
||
end;
|
||
|
||
/******************************************************/
|
||
/* This procedure displays the various depreciation */
|
||
/* schedules. It calls the appropriate schedule with */
|
||
/* an index into an array of entry constants. */
|
||
/******************************************************/
|
||
display:
|
||
procedure(f);
|
||
declare
|
||
f file;
|
||
output = f;
|
||
call schedule (index (schedules,select_sched));
|
||
end display;
|
||
|
||
/********************************************/
|
||
/* This is a global error recovery routine. */
|
||
/********************************************/
|
||
error:
|
||
procedure;
|
||
put file (output) edit('Invalid Schedule - Enter s, y, or d')
|
||
(page,column(indent),x(8),a);
|
||
call line();
|
||
end error;
|
||
|
||
/*******************************************************/
|
||
/* This procedure computes straight_line depreciation. */
|
||
/*******************************************************/
|
||
straight_line:
|
||
procedure;
|
||
adjusted_price = selling_price - bonus_dep;
|
||
put file (output) edit('S T R A I G H T L I N E')
|
||
(page,column(indent),x(14),a);
|
||
call header();
|
||
depreciation_value = adjusted_price - residual_value;
|
||
book_value = adjusted_price;
|
||
total_depreciation = 0;
|
||
do current_year = 1 to years;
|
||
year_value = decimal(depreciation_value/years,8,2) + .005;
|
||
if current_year = 1 then
|
||
do;
|
||
year_value = year_value * months_remaining / 12;
|
||
FYD = year_value;
|
||
end;
|
||
depreciation_value = depreciation_value - year_value;
|
||
total_depreciation = total_depreciation + year_value;
|
||
book_value = adjusted_price - total_depreciation;
|
||
call print_line();
|
||
end;
|
||
call summary();
|
||
end straight_line;
|
||
|
||
/*************************************************/
|
||
/* This procedure computes depreciation based on */
|
||
/* the sum_of_the_years. */
|
||
/*************************************************/
|
||
sum_of_years:
|
||
procedure;
|
||
adjusted_price = selling_price - bonus_dep;
|
||
put file (output) edit('S U M O F T H E Y E A R S')
|
||
(page,column(indent),x(11),a);
|
||
call header();
|
||
depreciation_value = adjusted_price - residual_value;
|
||
book_value = adjusted_price;
|
||
total_depreciation = 0;
|
||
year_sum = 0;
|
||
do current_year = 1 to years;
|
||
year_sum = year_sum + current_year;
|
||
end;
|
||
|
||
do current_year = 1 to years;
|
||
year_value = decimal(depreciation_value *
|
||
(years - current_year + 1),12,2)/ year_sum + .005;
|
||
if current_year = 1 then
|
||
do;
|
||
year_value = year_value * months_remaining / 12;
|
||
FYD = year_value;
|
||
end;
|
||
depreciation_value = depreciation_value - year_value;
|
||
total_depreciation = total_depreciation + year_value;
|
||
book_value = adjusted_price - total_depreciation;
|
||
call print_line();
|
||
end;
|
||
call summary();
|
||
end sum_of_years;
|
||
|
||
/********************************************/
|
||
/* This procedure computes double_declining */
|
||
/* depreciation. */
|
||
/********************************************/
|
||
double_declining:
|
||
procedure;
|
||
adjusted_price = selling_price - bonus_dep;
|
||
put file (output) edit('D O U B L E D E C L I N I N G')
|
||
(page,column(indent),x(10),a);
|
||
call header();
|
||
depreciation_value = adjusted_price - residual_value;
|
||
book_value = adjusted_price;
|
||
total_depreciation = 0;
|
||
do current_year = 1 to years
|
||
while (depreciation_value > 0);
|
||
year_value = decimal(book_value/years,8,2) * factor+.005;
|
||
if current_year = 1 then
|
||
do;
|
||
year_value = year_value * months_remaining / 12;
|
||
FYD = year_value;
|
||
end;
|
||
if year_value > depreciation_value then
|
||
year_value = depreciation_value;
|
||
depreciation_value = depreciation_value - year_value;
|
||
total_depreciation = total_depreciation + year_value;
|
||
book_value = adjusted_price - total_depreciation;
|
||
call print_line();
|
||
end;
|
||
call summary();
|
||
end double_declining;
|
||
|
||
/**************************************************/
|
||
/* This procedure prints an output header record. */
|
||
/**************************************************/
|
||
header:
|
||
procedure;
|
||
declare
|
||
new_or_used character(5);
|
||
|
||
if new = 'yes' then
|
||
new_or_used = ' New';
|
||
else
|
||
new_or_used = ' Used';
|
||
put file (output) edit(
|
||
'--------------------------------------------------',
|
||
'|',selling_price+sales_tax,new_or_used,
|
||
residual_value,' Residual Value|',
|
||
'|',months_remaining,' Months Left ',
|
||
tax_rate,'% Tax',tax_bracket,'% Tax Bracket|')
|
||
(2(skip,column(indent),a),
|
||
2(p'B$$,$$$,$$9.V99',a),
|
||
skip,column(indent),a,x(5),f(2),a,2(x(2),p'B99',a));
|
||
|
||
put file (output) edit(
|
||
'--------------------------------------------------',
|
||
'| Y | Depreciation | Depreciation | Book Value |',
|
||
'| r | For Year | Remaining | |',
|
||
'--------------------------------------------------')
|
||
(skip,column(indent),a);
|
||
end header;
|
||
|
||
/*******************************************/
|
||
/* This procedure prints the current line. */
|
||
/*******************************************/
|
||
print_line:
|
||
procedure;
|
||
put file (output) edit(
|
||
'|',current_year,
|
||
' |',year_value,
|
||
' |',depreciation_value,
|
||
' |',book_value,' |')
|
||
(skip,column(indent),a,f(2),4(a,p'$z,zzz,zz9v.99'));
|
||
end print_line;
|
||
|
||
/***************************************************/
|
||
/* This procedure prints the summary of values for */
|
||
/* each type of depreciation schedule. */
|
||
/***************************************************/
|
||
summary:
|
||
procedure;
|
||
declare
|
||
adj_ITC decimal(8,2),
|
||
total decimal(8,2),
|
||
direct decimal(8,2);
|
||
|
||
call line();
|
||
adj_ITC = ITC * 100 / tax_bracket;
|
||
total = FYD + sales_tax + adj_ITC + bonus_dep;
|
||
direct = total * tax_bracket / 100;
|
||
put file (output) edit(
|
||
'| First Year Reduction in Taxable Income |',
|
||
'--------------------------------------------------',
|
||
'| Depreciation ' ,FYD, '|',
|
||
'| Sales Tax ' ,sales_tax, '|',
|
||
'| ITC (Adjusted) ' ,adj_ITC, '|',
|
||
'| Bonus Depreciation ' ,bonus_dep, '|',
|
||
'| ------------- |',
|
||
'| Total for First Year ' ,total, '|',
|
||
'| Direct Reduction in Tax ' ,direct, '|')
|
||
(2(skip,column(indent),a),2(4(skip,column(indent),a,
|
||
p'$z,zzz,zz9v.99',x(3),a),skip,column(indent),a));
|
||
call line();
|
||
end summary;
|
||
|
||
/*******************************************/
|
||
/* This procedure prints a line of dashes. */
|
||
/*******************************************/
|
||
line:
|
||
procedure;
|
||
put file (output) edit(
|
||
'--------------------------------------------------')
|
||
(skip,column(indent),a);
|
||
end line;
|
||
|
||
|
||
end depreciate;
|
||
|