This code sample calculates the schedule (open, closed, or holiday) for
an automated attendant, so that it can plan an appropriate announcement
when someone calls in. The schedule allows for several possibilities;
in fact I had to write a little
document to explain it to people.
This is not original code, I just cleaned it up a bit for
intelligibility.
|
(******************
Check schedule for one AA.
Warning: don't confuse schdule.other and schdule.mode!
*******************)
procedure check_one (aa: integer; schdule: schdule_type; sched_ct: char;
var mode: byte);
var
i, day: byte;
date: bd_date_type;
last_sched: short_time_type;
now: short_time_type;
time: bd_time_type;
use: (use_mode, use_time, use_legend);
begin
bddate (date);
get_day (day, date);
bdtime (time);
use := use_mode;
{ Scheduled holiday closing? }
if schdule[day].other = 'T' then mode := other
{ Override open? }
else if schdule[day].other = 'O' then mode := open
{ Override closed? }
else if schdule[day].other = 'C' then mode := closed
{ Controlled by Legend schedule? }
else if sched_ct = '1' then use := use_legend
{ Controlled by Merlin Mail business schedule? }
else if sched_ct = '2' then
begin
{ Normal closed day? }
if schdule[day].mode = C
then mode := closed
else use := use_time;
end
{ Controlled by both??? }
else if sched_ct = '3' then
begin
{ Special case if today is normally closed. }
if schdule[day].mode = C then
begin
{ Did last mode code arrive on a previous day? If so, ignore it,
business schedule resets at midnight. }
if pxsys.legend_date < date
then mode := closed
else use := use_legend;
end
else
begin
{ Normal schedule. See what happened last, time change or mode code. }
for i := 1 to 4 do now[i] := time[i];
{ Are we after closing, during open, or before open? }
if now >= schdule[day].end_time
then last_sched := schdule[day].end_time
else if now >= schdule[day].start_time
then last_sched := schdule[day].start_time
else last_sched := '0000';
{ Which was more recent, last time change or last mode code? }
if (pxsys.legend_date = date) and (pxsys.legend_time > last_sched)
then use := use_legend
else use := use_time;
end;
end;
{ Finally! If use = use_mode, then mode's all set, else figure it out
from either the last Legend mode code or the time of day. }
if use = use_legend then
begin
if pxsys.legend_night then mode := closed else mode := open
end
else if use = use_time then
begin
if time_within (schdule[day].start_time, schdule[day].end_time)
then mode := open
else mode := closed;
end;
end;
[Back to home page]