Leave management workflow using Windows Workflow Foundation

  1. using System;  
  2. using System.ComponentModel;  
  3. using System.ComponentModel.Design;  
  4. using System.Collections;  
  5. using System.Workflow.ComponentModel.Compiler;  
  6. using System.Workflow.ComponentModel.Serialization;  
  7. using System.Workflow.ComponentModel;  
  8. using System.Workflow.ComponentModel.Design;  
  9. using System.Workflow.Runtime;  
  10. using System.Workflow.Activities;  
  11. using System.Workflow.Activities.Rules;  
  12. using System.Net.Mail;  
  13. using System.Configuration;  
  14.   
  15. namespace SampleWorkflow_LM  
  16. {  
  17.     /// <summary>  
  18.     /// author:praveen alwar  
  19.     /// </summary>  
  20.     public sealed partial class Requestworkflow : SequentialWorkflowActivity  
  21.     {  
  22.         /// <summary>  
  23.         /// hashtable to hold the email data  
  24.         /// </summary>  
  25.         private Hashtable _requestordata;  
  26.   
  27.         public Hashtable requestorleavedata  
  28.         {  
  29.             get { return _requestordata; }  
  30.             set { _requestordata = value; }  
  31.         }  
  32.         //mailer class to be sent to the smtp server  
  33.         private MailData _maildata = new MailData();  
  34.   
  35.         /// <summary>  
  36.         /// this method will be invoked from the approver notification code activity   
  37.         /// </summary>  
  38.         /// <param name="sender"></param>  
  39.         /// <param name="e"></param>  
  40.         private void NotifyApprover(object sender, EventArgs e)  
  41.         {  
  42.   
  43.             try  
  44.             {  
  45.                  
  46.                 ////Send email to Approver  
  47.                 fillMailClass(0);  
  48.                 bool ismailsent = SendMail(_maildata);  
  49.             }  
  50.             catch (Exception ex)  
  51.             {  
  52.                 //log the error   
  53.   
  54.             }  
  55.   
  56.         }  
  57.   
  58.         /// <summary>  
  59.         /// this method will be invoked from the applier notification code activity   
  60.         /// </summary>  
  61.         /// <param name="sender"></param>  
  62.         /// <param name="e"></param>  
  63.         private void NotifyApplier(object sender, EventArgs e)  
  64.         {  
  65.   
  66.             try  
  67.             {  
  68.   
  69.                 ////Send email to Applier  
  70.                 fillMailClass(1);  
  71.                 bool ismailsent = SendMail(_maildata);  
  72.             }  
  73.             catch (Exception ex)  
  74.             {  
  75.                 //log the error   
  76.   
  77.             }  
  78.   
  79.         }  
  80.   
  81.         private void fillMailClass(int mailtype)  
  82.         {  
  83.             //if mailtype ->0 then approver notification, mail type->1 , then notify applier  
  84.   
  85.             switch (mailtype)  
  86.             {  
  87.                 case 0:  
  88.                     #region build the email details class for approver  
  89.                     _maildata.MailTo = requestorleavedata["rmemail"].ToString() ;  
  90.                     _maildata.MailSubject = ConfigurationManager.AppSettings["NewLeaveRequest"].ToString();  
  91.                     _maildata.MailFrom = ConfigurationManager.AppSettings["mailfrom"].ToString();  
  92.                     _maildata.MailBody = requestorleavedata["emailbody"].ToString();  
  93.                     //_maildata.IsHtmlBody = true;  
  94.                  
  95.                     #endregion  
  96.                     break;  
  97.                 case 1:  
  98.                     #region build the email details class for resource  
  99.                     _maildata.MailTo = requestorleavedata["resourceemail"].ToString();  
  100.                     #endregion  
  101.                     break;  
  102.   
  103.             }  
  104.         }  
  105.   
  106.         private static bool SendMail(MailData emailDetails)  
  107.         {  
  108.             //Instantiate the MailMessage Class from the framework.Mail message class represents the email that has to be sent  
  109.             MailMessage message = new MailMessage();  
  110.             //counter is used to check the number of MAILTO instances  
  111.             
  112.             try  
  113.             {  
  114.                 //Read the message from settings  
  115.                 message.From = new MailAddress(emailDetails.MailFrom);  
  116.                 //Check if the mailto is not null  
  117.                 if (emailDetails.MailTo != null)  
  118.                 {  
  119.                     // Add all recipent of mail  
  120.                   
  121.                         message.To.Add(new MailAddress(emailDetails.MailTo));  
  122.                   }  
  123.                 
  124.   
  125.                  message.Body = emailDetails.MailBody;  
  126.                 //check if the email has to be sent in HTML format  
  127.                   message.BodyEncoding = System.Text.Encoding.Unicode;  
  128.                 //assign the mail subject  
  129.                 message.Subject = emailDetails.MailSubject;  
  130.            
  131.                 //double-check if mail to has been supplied. atleast one email address has to be provided.  
  132.                 if (emailDetails.MailTo != null)  
  133.                 {  
  134.                     //Instantiate the SMTP client to send the email  
  135.                     SmtpClient client = new SmtpClient();  
  136.   
  137.                      client.Send(message);  
  138.                 }  
  139.                 else  
  140.                 {  
  141.                     //if the mail to is not specified, log error and return false  
  142.                     //log the error  
  143.                     return false;  
  144.                 }  
  145.             }  
  146.             catch (SmtpException ex)  
  147.             {  
  148.                 //catch and log the error  
  149.                 ex.Data.Add("Error sending mail", ex.InnerException.Message);  
  150.                //log the error  
  151.                 return false;  
  152.             }  
  153.             catch (Exception ex)  
  154.             {  
  155.                 //catch and log the error  
  156.                 ex.Data.Add("Error sending mail", ex.InnerException.Message);  
  157.                //log the error  
  158.                 return false;  
  159.             }  
  160.             finally  
  161.             {  
  162.                 message.Dispose();  
  163.             }  
  164.   
  165.             return true;  
  166.         }  
  167.   
  168.   
  169.   
  170.         public Requestworkflow()  
  171.         {  
  172.             InitializeComponent();  
  173.         }  
  174.     }  
  175.   
  176. }