*! version 1.0.2 February 11, 2021 @ 11:50:44
*! finds the number of workdays between date1 and date2
* v1.0.2: fixed embarrassing bug for spaces in file names
* v1.0.1: fixed bug for negative whole-week computations
*           and made computation less obscure-looking
*         updated to version 7 to get longer local macros
program define workdays
version 7.0
#delimit;
	syntax varlist (min=2 max=2 numeric)
	  [if] [in] [using/], GEN(str) [lazy] [holiday(str)];
#delimit cr
	if "`gen'"=="" {
		display in red "I need to generate a new variable!"
		exit 110
		}
	else {
		confirm new var `gen'
		}
	if `"`using'"'=="" {
		if "`holiday'"!="" {
			display in red "The holiday option can be used only if the using option is used!"
			exit 198
			}
		}
	else {
		if "`holiday'"=="" {
			display in red "The using option requires the holiday option!"
			exit 198
			}
      capture confirm file `"`using'"'
      if _rc {
         capture confirm file `"`using'.dta"'
         if _rc {
            display in red `"Neither file "`using'" nor "`using'.dta" found"'
            exit 601
            }
         }
		}

	tempvar useme
	marksample useme

	tokenize `varlist'
	local start  "`1'"
	local end "`2'"

	if `"`using'"'!=`""' {
		if "$S_HOLI"=="" | "`lazy'"=="" {
			// display in blue "about to get rid of sholi"
			global S_HOLI
			preserve
			use `"`using'"', clear
			quietly describe
			local cnt 1
			local max = _N
			while `cnt'<=`max' {
				local newdate = `holiday'[`cnt']
				global S_HOLI "$S_HOLI `newdate'"
				local cnt = `cnt' + 1
				}
			restore
			}
		}

	tempvar diff startsat startsun endsat endsun
   tempvar wkends
	quietly {
		gen byte `startsat' = dow(`start')==6
      gen byte `startsun' = dow(`start')==0
		gen byte `endsat' = dow(`end')==6
      gen byte `endsun' = dow(`end')==0
      // compute offsets with mondays as first day of the week
      local offset = mod(7-dow(0)+1,7)
      gen long `wkends' = floor((`end'-`offset')/7) - floor((`start'-`offset')/7)
		}

	gen long `diff' = `end'-`start'-2*`wkends' ///
     + cond(`end'>=`start',`startsat'+2*`startsun'-`endsat'-2*`endsun',`startsun'-`endsun') ///
	  if `useme'

	if "$S_HOLI"!="" {
		tokenize "$S_HOLI"
		local cnt 1
		while "``cnt''"!="" {
			if dow(``cnt'')!=0 & dow(``cnt'')!=6 {
				quietly replace `diff' = `diff' - ((``cnt''>`start') & (``cnt''<=`end')) if `useme'
				}
			local cnt = `cnt' + 1
			}
		}

	quietly compress `diff'
	label var `diff' "Work days between `start' and `end'"
	rename `diff' `gen'

end