At my company we use a software product called Mindtouch Core as a company Wiki/intranet. A future post will detail our implementation.
One feature request was to automate the vacation request procedure in our company.
Because we wanted to keep it simple, is it not fully automated or database driven, but automates the sending of email through the use of a HTML form to a php page.
I make no claims on this being ‘good’ code, as I’m not a coder. However, it is functional and serves it’s purpose.
HTML Form
This is the current contents of our HTML form, with comments for explanation.
<!-- Location of the PHP functions to execute email submission. This resides within our Mindtouch file system --> <form method="post" action="/config/vacplanner/vacemail.php"> <!-- Script used to auto-hide the sub-departments. Note the specified sub departments specified in orange. --> <script type="text/javascript">/*<![CDATA[*/ var hide=['business-sub','finacct-sub','next','id2']; function setOpt() { resetOpt(); for(var i=0,sel=document.getElementsByTagName('select');i<sel.length;i++) { sel[i].onchange=function() { if(this.parentNode.tagName.toLowerCase()!='div') resetOpt(); try { document.getElementById(this.value).style.display=''; } catch(e){} ; } } } window.addEventListener?window.addEventListener('load',setOpt,false): window.attachEvent('onload',setOpt); function resetOpt() { for(var i=0;i<hide.length;i++) document.getElementById(hide[i]).style.display='none'; } /*]]>*/</script> Name: <br /> <!-- Using the variables built within Dekiscript (Mindtouch code) we can hide the username but auto-fill it in with whoever is viewing the page. --> <input name="username" type="hidden" value="{{user.name}}" /><br /> <!-- Department field uses the Select function of the form. The values are email addresses, which are passed to the php file to be used as recipients --> Department: <br /> <select name="department"> <option value="" selected="selected"></option> <option value="business-sub">Business</option> <option value="finacct-sub">Finance & Acct</option> <option value="email.address@domain.com">Engineering</option> <option value="email.address@domain.com">Geomatics</option> <option value="email.address@domain.com">Operations</option> <option value="email.address@domain.com">Safety</option> </select> <!-- This is a sub-department, for better organization. This matches the javascript at the top. --> <div id="business-sub">Business Sections: <select name="busdepartment"> <option value="" selected="selected"></option> <option value="email.address@domain.com">Business Admin</option> <option value="email.address@domain.com">HR</option> </select></div> <div id="finacct-sub">Fin&Acct Sections: <select name="finacctdepartment"> <option value="" selected="selected"></option> <option value="email.address@domain.com">Accounting</option> <option value="email.address@domain.com">Facilities</option> <option value="email.address@domain.com">IT</option> </select></div> <div id="id2">Element with an ID of "id2" <select> <option selected="selected">Opt1</option> <option>Opt2</option> <option>Opt3</option> </select></div> <div id="next">"Next" element <select> <option selected="selected">Opt1</option> <option>Opt2</option> <option>Opt3</option> </select></div> <br /> <!--Supervisors are set up the same as the Departments section --> <div id="Supervisors">Supervisor: <br /> <select name="supervisor"> <option value="" selected="selected"></option> <option value="email.address@domain.com">John Doe</option> <option value="email.address@domain.com">John Doe</option> <option value="email.address@domain.com">John Doe</option> <option value="email.address@domain.com">John Doe</option> </select></div> <!--Section to gather vacation date information. Any type of text may be entered here. --> Last Working Date:<br /> <input name="lastworkdate" type="text" /><br /> Vacation Dates Requested:<br /> <input name="vacdatestart" type="text" /> To <input name="vacdateend" type="text" /><br /> Return to Work Date:<br /> <input name="returnworkdate" type="text" /><br /> <input type="submit" value="Submit" /> <!--A hidden field gathers the current date from the wiki, and submits it to the php file. --> <input type="hidden" name="date" value="{{ date.Date(date.now) }}" /> </form>
Here’s what the form looks like:
PHP Backend
Here is the contents of our PHP form, again with comments for explanation:
<?php // Required for email to work. Dependencies on existing files from the wiki. require_once("/var/www/dekiwiki/phpmailer/class.phpmailer.php"); require_once("/var/www/dekiwiki/phpmailer/class.smtp.php"); require_once("/var/www/dekiwiki/phpmailer/language/phpmailer.lang-en.php"); // List of variables to gather from the vacform used on the wiki page. These map to the input boxes and department/supervisor dropdowns $username = $_POST['username']; $department = $_POST['department']; $date = $_POST['date']; $supervisor = $_POST['supervisor']; $lastworkdate = $_POST['lastworkdate']; $vacdatestart = $_POST['vacdatestart']; $vacdateend = $_POST['vacdateend']; $returnworkdate = $_POST['returnworkdate']; $finacctdepartment = $_POST['finacctdepartment']; $busdepartment = $_POST['busdepartment']; // Used in conjunction with the IF statements below to add recipient. $srchstrg = ".domain.com"; $wildcardsearch = preg_match("/$srchstrg/", $department); $wildcardsearch2 = preg_match("/$srchstrg/", $finacctdepartment); $wildcardsearch3 = preg_match("/$srchstrg/", $busdepartment); // For our C-Level staff, we want the CEO to be automatically selected as supervisor. If the username is one of the below, supervisor is automatically set to CEO if ($username=='jdoe' OR $username=='jsmith') { $supervisor = 'big.cheese@domain.com'; } // Error checking on empty fields if ($lastworkdate=="") { echo "Last Work Date was left blank. Please press Back to retry."; die; } // Error checking on empty fields if ($vacdatestart=="") { echo "Vacation Start Date was left blank. Please press Back to retry."; die; } // Error checking on empty fields if ($vacdateend=="") { echo "Vacation End Date was left blank. Please press Back to retry."; die; } // Error checking on empty fields if ($returnworkdate=="") { echo "Return to Work Date was left blank. Please press Back to retry."; die; } // Error checking on empty fields, if all departments are empty if ($department=="" && $finacctdepartment=="" && $busdepartment=="") { echo "A Department was not selected. Please press Back to retry."; die; } // Error checking on empty fields, if Business is selected but no sub-business department is. if ($department=="business-sub" && $busdepartment=="") { echo "A Business sub-department was not selected. Please press Back to retry."; die; } if ($department=="finacct-sub" && $finacctdepartment=="") { echo "A Finance&Accounting sub-department was not selected. Please press Back to retry."; die; } if ($supervisor=="") { echo "A Supervisor was not selected. Please press Back to retry."; die; } if ($username=="") { echo "A name was not entered. Please press Back to retry."; die; } // Begin the code for the mail to be sent. $mail = new PHPMailer(); $mail->IsSMTP(); // telling the class to use SMTP $mail->Host = "smtp.domain.com"; // SMTP server $mail->From = 'email@domain.com'; $mail->FromName = "Vacation Planner"; // Adds supervisor as recipient $mail->AddAddress($supervisor); // Used with wildcard searches above to determine if a department was selected, and if so, set that value as a recipient if ( $wildcardsearch != 0 ) { $mail->AddAddress($department); } else { // Do Nothing } If ( $wildcardsearch2 !=0 ) { $mail->AddAddress($finacctdepartment); } else { // Do Nothing } If ($wildcardsearch3 !=0 ) { $mail->AddAddress($busdepartment); } else { // Do Nothing } // Sets the subject $mail->Subject = "Vacation Request from $username"; $mail->IsHTML(true); // Body is built from variables used in HTML form. $mail->Body = "A request for Vacation time was received by <b>$username</b> on $date. <br> <br> <b>Last Working Date:</b> <br> $lastworkdate <br> <b>Vacation Dates Requested:</b> <br> $vacdatestart To $vacdateend <br> <b>Return to Work Date:</b> <br> $returnworkdate <br> <br> <b>Notes To Supervisor:</b> If approved, please forward this request to appropriate department contact for entering into calendar."; // Mail gets sent if(!$mail->Send()) { echo 'Request was not sent'; echo 'Mailer error: ' . $mail->ErrorInfo; } else { echo 'Thank You. Your request has been submitted.'; } ?> <!-- Refreshes the page after 3 seconds, going back to the form. --> <meta http-equiv="refresh" content="1;url=http://wiki.domain.com/Vacation_Planner" />
And the resulting email: