Posts: 1,000
Threads: 253
Joined: Feb 2008
I need to calculate funds that will be available a certain number of business days (Mon-Fri and non-holidays)
I guess the business days would be easy to figure out if SYSTEMTIME st.wDayOfWeek does not equal 0 or 6...but holidays? I figure a list would of dates would work...is there a database or something that has US Bank holidays?
What would be the best way to go about this?
Essentially I'll be calculating available funds deposited based on different types of payment types Cash=0 business days, Checks=5 business days, and Credit Cards=3 business days. That way I'll be able to click a button in my program and get how much I have available right now and how much I have pending. It will save me a phone call to the bank everytime I want to put in an order with a distributor.
Thanks,
Jimmy Vig
Posts: 1,000
Threads: 253
Joined: Feb 2008
Is there a better way than this?
Function Business_Days_Add
out
DATE d.getclock
SYSTEMTIME st
int Days=8
rep Days
,;Run
,d=d+1
,d.tosystemtime(st)
,if st.wDayOfWeek=0
,,goto Run
,if st.wDayOfWeek=6
,,goto Run
out "%i-%i-%i" st.wMonth st.wDay st.wYear
Posts: 12,147
Threads: 143
Joined: Dec 2002
Function IsTodayHoliday
;/
function!
;Returns 1 if today is a holiday (Sunday, Saturday, etc), 0 if not.
;Uses "$my qm$\nbd.ini" that is created using macro "Create Holidays File". Error if the file does not exist.
;EXAMPLE
;if IsTodayHoliday
;,out "holiday"
str inifile="$my qm$\nbd.ini"
if(!dir(inifile)) mes- "File not found:[]%s[][]Read macro 'Create Holidays File'." "" "x" inifile
DATE d.getclock
SYSTEMTIME st
d.tosystemtime(st)
str s1 s2(st.wDay) s3.format("%i-%i" st.wYear st.wMonth)
ret rget(s1 s2 s3 inifile)
Macro Create Holidays File
;This macro creates ini file containing sundays and saturdays of next 10 years and of the remainder of this year.
;Run this macro. Then edit the file: add other holidays and possibly remove sun/saturdays that aren't holidays. For each day, use format daynumber=anything or just daynumber=.
;The file later will be used by IsTodayHoliday.
str inifile.expandpath("$my qm$\nbd.ini")
if(dir(inifile))
,mes- "The file already exists. Overwrite?" "" "OC!"
,mes- "Are you sure?" "" "OC!"
int nyears=10 ;;you can change this; it is number of years not including this year
str ini
DATE d.getclock
SYSTEMTIME st
int y ymax month
rep
,d.tosystemtime(st)
,
,if(st.wYear!=y)
,,y=st.wYear
,,if(!ymax) ymax=y+nyears
,,if(y>ymax) break
,
,if(st.wMonth!=month) month=st.wMonth; ini.formata("[%i-%i][]" y month) ;;write year and month as ini section
,
,sel st.wDayOfWeek
,,case [0,6] ini.formata("%i=%s[]" st.wDay iif(st.wDayOfWeek "sat" "sun")) ;;write sundays and saturdays
,
,;other (or some of other) holidays can be added/removed here instead of editing the ini file. Example:
,sel st.wMonth
,,case 1 sel(st.wDay) case 1 ini.formata("%i=%s[]" st.wDay "New Year")
,,;and so on
,
,d=d+1
;out; out ini
ini.setfile(inifile)
inifile-"''"; inifile+"''"
run "notepad.exe" inifile ;;open for editing
Posts: 1,000
Threads: 253
Joined: Feb 2008
That's pretty good!
I need to be able to send a date to IsTodayHoliday...So that I can count back from d.getclock a certain number of non-holidays.
The only thing is that it creates the Holidays on the same day for each reoccurring year. I need the holidays to be the observed US Bank Holidays which are generally like 3rd monday in January (Martin Luther King's Birthday)
Here's a link for US Bank Holidays: http://www.buyusa.gov/uk/en/us_bank_holidays.html
This will work so far, I'll just have to run it every year...and if I forget...that's trouble.
Posts: 12,147
Threads: 143
Joined: Dec 2002
The macro adds sundays and saturdays for next 10 years. Then open the ini file in notepad and add other holidays for all 10 years. When creating the macro i did not know where to find us bank holidays.
Posts: 1,000
Threads: 253
Joined: Feb 2008
Changed the example too...
Function IsTodayHoliday
function DATE&d
;Returns 1 if today is a holiday (Sunday, Saturday, etc), 0 if not.
;Uses "$my qm$\nbd.ini" that is created using macro "Create Holidays File". Error if the file does not exist.
;EXAMPLE
;DATE d="12/25/09"
;if IsTodayHoliday(d)
,;out "Holiday"
str inifile="$my qm$\nbd.ini"
if(!dir(inifile)) mes- "File not found:[]%s[][]Read macro 'Create Holidays File'." "" "x" inifile
SYSTEMTIME st
d.tosystemtime(st)
str s1 s2(st.wDay) s3.format("%i-%i" st.wYear st.wMonth)
ret rget(s1 s2 s3 inifile)
Posts: 1,000
Threads: 253
Joined: Feb 2008
Bank Holidays are kind of a pain in the neck.
Most of them are a certain Monday in a month, some of them are fixed, and some are the closest weekday...such as Independence Day July 4th
Posts: 1,000
Threads: 253
Joined: Feb 2008
Sorry about posting so much...
Here's a better link: http://www.opm.gov/Operating_Status_Sche...l/2008.asp
Here is a list:
United States Holidays
FIXED HOLIDAYS*
New Year’s Day - January 1
Independence Day - July 4
Veterans Day - November 11
Christmas Day - December 25
ROTATING HOLIDAYS
Birthday of Martin Luther King, Jr. - 3rd Monday in January
Washington’s Birthday - 3rd Monday in February
Memorial Day - Last Monday in May
Labor Day - 1st Monday in September
Columbus Day - 2nd Monday in October
Thanksgiving Day - 4th Thursday in November
*If on a Saturday - Holiday observed on Friday. If on a Sunday - Holiday observed on Monday
Posts: 1,000
Threads: 253
Joined: Feb 2008
Messed with some code today. It works, its a bit clunky and I need to incorporate it into the IsHoliday macro to populate the ini file.
Here's what I got so far:
Function US_Holiday
function [YearDate]
;Example:
;US_Holiday 1999
;Outputs:
;1/1/1999
;1/18/1999
;2/15/1999
;5/31/1999
;9/6/1999
;10/11/1999
;11/11/1999
;11/25/1999
;Just US_Holiday on it's own will output US holidays for the current year
if YearDate=0
,_s.time("yyyy")
,YearDate=val(_s)
_s.format("01/01/%i" YearDate)
DATE d=_s
DATE d2
int i=1
int Month=1
SYSTEMTIME st st1
d.tosystemtime(st)
int Year=st.wYear
int yCounter wCounter
for yCounter 0 48 1
,;Run
,for wCounter 0 7 1
,,d.tosystemtime(st)
,,int month=st.wMonth
,,str Fixed.format("%i/%i" st.wMonth st.wDay)
,,if(month>Month) Month+1;i=1;goto Run
,,_s.format("%i:%i:%i" st.wMonth st.wDayOfWeek i)
,,sel(_s)case ["1:1:3","2:1:3","9:1:1","10:1:2","11:4:4"] ;out d
,,sel(_s)case "5:1:4" d2=d;case "5:1:5" d2=d;case "6:1:1";out d2
,,sel(Fixed)case ["1/1","7/4","11/11","12/25"]
,,,sel(st.wDayOfWeek)case 0 d2=d-1;case 6 d2=d+1;case [1,2,3,4,5] d2=d;out d2
,,d=d+1
,i+1
Thanks again for all your help!!
Jimmy Vig
|