public Boolean createPdfSheetForSubmission(ServiceSheetViewModel serviceSubmissionSheet)
        {
            Boolean successful = false;
            currentSheet = serviceSubmissionSheet;

            serviceSheetDoc = new Document();

            defineDocumentStyles();
            createSheetTitle();
            createJobDetailsSection();
            createTimesheetSection();
            createServiceReportSection();
            createFollowupSection();
            createSignoffSection();
            createFooter();
            createHeader();
            createWatermark();

            PdfDocumentRenderer docRenderer = new PdfDocumentRenderer();
            docRenderer.Document = serviceSheetDoc;
            docRenderer.RenderDocument();

            //RT 5/7/16 - Adding save dialog
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.Filter = "pdf files (*.pdf)|*.pdf";
            Nullable<bool> result = saveDialog.ShowDialog();

            if (result == true)
            {
                string filename = saveDialog.FileName;
                docRenderer.Save(filename);
                Process.Start(filename);

                successful = true;
            }
            else
            {
                successful = false;
            }

            return successful;
        }
 //Class constructors
 public ServiceDayViewModel(DateTime dtTravelStart, DateTime dtArrivalOnsite, DateTime dtDepartSite, DateTime dtTravelEnd, int mileageEntered, bool dailyAllowanceEntered,
     bool overnightAllowanceEntered, bool barrierPaymentEntered, double travelTimeToSiteEntered, double travelTimeFromSiteEntered, double totalTravelTimeEntered, double timeOnsiteEntered, string dailyReportEntered,
     string partsSuppliedEntered, DateTime dtServiceDateEntered, ServiceSheetViewModel parentVM)
 {
     this.TravelStartTime = dtTravelStart;
     this.ArrivalOnsiteTime = dtArrivalOnsite;
     this.DepartureSiteTime = dtDepartSite;
     this.TravelEndTime = dtTravelEnd;
     this.Mileage = mileageEntered;
     this.DailyAllowance = dailyAllowanceEntered;
     this.OvernightAllowance = overnightAllowanceEntered;
     this.BarrierPayment = barrierPaymentEntered;
     this.TravelTimeToSite = travelTimeToSiteEntered;
     this.TravelTimeFromSite = travelTimeFromSiteEntered;
     this.TotalTravelTime = totalTravelTimeEntered;
     this.TotalOnsiteTime = timeOnsiteEntered;
     this.DailyReport = dailyReportEntered;
     this.PartsSuppliedToday = partsSuppliedEntered;
     this.DtReport = dtServiceDateEntered;
     this.ParentServiceSheetVM = parentVM;
 }
        private void createExportLinesForSubmission(ServiceSheetViewModel submission)
        {
            //A line is created for each service day, not submission, so we need to go through the number of days.  
            //There will be multiple duplicated fields.
            AllServiceDayViewModels allServiceDays = submission.AllServiceDays;
            //ObservableCollection<ServiceDayViewModel> serviceDays = submission.AllServiceDayVMs;

            foreach (ServiceDayViewModel day in allServiceDays.AllServiceDayVMs)
            {
                //extract the sections from the service sheet that go into the CSV export
                //Start date and end date are not taken - They only appear in the csv export
                csvWriterOutput.WriteField("");
                csvWriterOutput.WriteField("");
                int submissionNo = submission.SubmissionNumber;
                csvWriterOutput.WriteField(submissionNo);
                //Export app name - set manually
                csvWriterOutput.WriteField("Service Sheet");
                string username = submission.Username;
                csvWriterOutput.WriteField(username);
                string userLastName = submission.UserSurname;
                csvWriterOutput.WriteField(userLastName);
                string userFirstName = submission.UserFirstName;
                csvWriterOutput.WriteField(userFirstName);
                string responseId = submission.CanvasResponseId;
                csvWriterOutput.WriteField(responseId);
                DateTime responseDate = submission.DtResponse;
                csvWriterOutput.WriteField(responseDate);
                DateTime dtDevice = submission.DtDevice;
                csvWriterOutput.WriteField(dtDevice);
                //Submission form name set manually
                csvWriterOutput.WriteField("Service Sheet");
                int formVersion = submission.SubmissionFormVersion;
                csvWriterOutput.WriteField(formVersion);
                string customer = submission.Customer;
                csvWriterOutput.WriteField(customer);
                string address1 = submission.AddressLine1;
                csvWriterOutput.WriteField(address1);
                string address2 = submission.AddressLine2;
                csvWriterOutput.WriteField(address2);
                string townCity = submission.TownCity;
                csvWriterOutput.WriteField(townCity);
                string postcode = submission.Postcode;
                csvWriterOutput.WriteField(postcode);
                string customerContact = submission.CustomerContact;
                csvWriterOutput.WriteField(customerContact);
                string customerPhone = submission.CustomerPhoneNo;
                csvWriterOutput.WriteField(customerPhone);
                string makeModel = submission.MachineMakeModel;
                csvWriterOutput.WriteField(makeModel);
                string serialNo = submission.MachineSerial;
                csvWriterOutput.WriteField(serialNo);
                string cncControl = submission.CncControl;
                csvWriterOutput.WriteField(cncControl);
                DateTime dtStart = submission.DtJobStart;
                csvWriterOutput.WriteField(dtStart);
                string orderNo = submission.CustomerOrderNo;
                csvWriterOutput.WriteField(orderNo);
                string mttJobNo = submission.MttJobNumber;
                csvWriterOutput.WriteField(mttJobNo);
                string jobDescription = submission.JobDescription;
                csvWriterOutput.WriteField(jobDescription);

                //ServiceDayViewModel currentDay = day;
                createExportLineForDay(day);

                double totalTimeOnsite = submission.JobTotalTimeOnsite;
                csvWriterOutput.WriteField(totalTimeOnsite);
                double totalTravelTime = submission.JobTotalTravelTime;
                csvWriterOutput.WriteField(totalTravelTime);
                double mileage = submission.JobTotalMileage;
                csvWriterOutput.WriteField(mileage);
                double totalDailyAllowances = submission.TotalDailyAllowances;
                csvWriterOutput.WriteField(totalDailyAllowances);
                double totalOvernightAllowances = submission.TotalOvernightAllowances;
                csvWriterOutput.WriteField(totalOvernightAllowances);
                double totalBarrierPayments = submission.TotalBarrierPayments;
                csvWriterOutput.WriteField(totalBarrierPayments);
                string jobStatus = submission.JobStatus;
                csvWriterOutput.WriteField(jobStatus);
                string finalJobReport = submission.FinalJobReport;
                csvWriterOutput.WriteField(finalJobReport);
                //Follow up work field is blank
                csvWriterOutput.WriteField("");
                string additionalFaultsFound = submission.AdditionalFaults;
                csvWriterOutput.WriteField(additionalFaultsFound);
                Boolean followupWorkQuote = submission.QuoteRequired;
                csvWriterOutput.WriteField(followupWorkQuote);
                string partsForFollowup = submission.FollowUpPartsRequired;
                csvWriterOutput.WriteField(partsForFollowup);
                //Images for follow-up work - Doesn't need to be set
                csvWriterOutput.WriteField("");
                //RT 11/8/2016 - Adding in the start of the image url. 
                //RT 23/11/16 - Changing this to a method
                writeUrl(submission.Image1Url);
                //string imageUrlStart = "http://www.gocanvas.com/values/";
                //string image1 = imageUrlStart + submission.Image1Url;
                //csvWriterOutput.WriteField(image1);
                writeUrl(submission.Image2Url);
                //string image2 = imageUrlStart + submission.Image2Url;
                //csvWriterOutput.WriteField(image2);
                writeUrl(submission.Image3Url);
                //string image3 = imageUrlStart + submission.Image3Url;
                //csvWriterOutput.WriteField(image3);
                //string image4 = imageUrlStart + submission.Image4Url;
                writeUrl(submission.Image4Url);
                //csvWriterOutput.WriteField(image4);
                //string image5 = imageUrlStart + submission.Image5Url;
                writeUrl(submission.Image5Url);
                //csvWriterOutput.WriteField(image5);
                //Certify is next - don't set
                csvWriterOutput.WriteField("");
                //string customerSignature = imageUrlStart + submission.CustomerSignatureUrl;
                //csvWriterOutput.WriteField(customerSignature);
                writeUrl(submission.CustomerSignatureUrl);
                string customerName = submission.CustomerName;
                csvWriterOutput.WriteField(customerName);
                DateTime dtSigned = submission.DtSigned;
                csvWriterOutput.WriteField(dtSigned);
                //string mttSignature = imageUrlStart + submission.MttEngSignatureUrl;
                //csvWriterOutput.WriteField(mttSignature);
                writeUrl(submission.MttEngSignatureUrl);
                csvWriterOutput.NextRecord();
            }

            //int noOfDays = serviceDays.Count;

            //for (int counter = 0; counter < noOfDays ; counter++)
            //{
            //    //extract the sections from the service sheet that go into the CSV export
            //    //Start date and end date are not taken - They only appear in the csv export
            //    csvWriterOutput.WriteField("");
            //    csvWriterOutput.WriteField("");
            //    int submissionNo = submission.SubmissionNumber;
            //    csvWriterOutput.WriteField(submissionNo);
            //    //Export app name - set manually
            //    csvWriterOutput.WriteField("Service Sheet");
            //    string username = submission.Username;
            //    csvWriterOutput.WriteField(username);
            //    string userLastName = submission.UserSurname;
            //    csvWriterOutput.WriteField(userLastName);
            //    string userFirstName = submission.UserFirstName;
            //    csvWriterOutput.WriteField(userFirstName);
            //    string responseId = submission.ResponseId;
            //    csvWriterOutput.WriteField(responseId);
            //    DateTime responseDate = submission.DtResponse;
            //    csvWriterOutput.WriteField(responseDate);
            //    DateTime dtDevice = submission.DtDevice;
            //    csvWriterOutput.WriteField(dtDevice);
            //    //Submission form name set manually
            //    csvWriterOutput.WriteField("Service Sheet");
            //    int formVersion = submission.SubmissionVersion;
            //    csvWriterOutput.WriteField(formVersion);
            //    string customer = submission.Customer;
            //    csvWriterOutput.WriteField(customer);
            //    string address1 = submission.AddressLine1;
            //    csvWriterOutput.WriteField(address1);
            //    string address2 = submission.AddressLine2;
            //    csvWriterOutput.WriteField(address2);
            //    string townCity = submission.TownCity;
            //    csvWriterOutput.WriteField(townCity);
            //    string postcode = submission.Postcode;
            //    csvWriterOutput.WriteField(postcode);
            //    string customerContact = submission.CustomerContact;
            //    csvWriterOutput.WriteField(customerContact);
            //    string customerPhone = submission.CustomerPhone;
            //    csvWriterOutput.WriteField(customerPhone);
            //    string makeModel = submission.MachineMakeModel;
            //    csvWriterOutput.WriteField(makeModel);
            //    string serialNo = submission.MachineSerialNo;
            //    csvWriterOutput.WriteField(serialNo);
            //    string cncControl = submission.MachineController;
            //    csvWriterOutput.WriteField(cncControl);
            //    DateTime dtStart = submission.JobStartDate;
            //    csvWriterOutput.WriteField(dtStart);
            //    string orderNo = submission.CustomerOrderNo;
            //    csvWriterOutput.WriteField(orderNo);
            //    string mttJobNo = submission.MttJobNo;
            //    csvWriterOutput.WriteField(mttJobNo);
            //    string jobDescription = submission.JobDescription;
            //    csvWriterOutput.WriteField(jobDescription);

            //    ServiceDayViewModel currentDay = serviceDays[counter];
            //    createExportLineForDay(currentDay);

            //    double totalTimeOnsite = submission.TotalTimeOnsite;
            //    csvWriterOutput.WriteField(totalTimeOnsite);
            //    double totalTravelTime = submission.TotalTravelTime;
            //    csvWriterOutput.WriteField(totalTravelTime);
            //    double mileage = submission.TotalMileage;
            //    csvWriterOutput.WriteField(mileage);
            //    double totalDailyAllowances = submission.TotalDailyAllowances;
            //    csvWriterOutput.WriteField(totalDailyAllowances);
            //    double totalOvernightAllowances = submission.TotalOvernightAllowances;
            //    csvWriterOutput.WriteField(totalOvernightAllowances);
            //    double totalBarrierPayments = submission.TotalBarrierPayments;
            //    csvWriterOutput.WriteField(totalBarrierPayments);
            //    string jobStatus = submission.JobStatus;
            //    csvWriterOutput.WriteField(jobStatus);
            //    string finalJobReport = submission.FinalJobReport;
            //    csvWriterOutput.WriteField(finalJobReport);
            //    //Follow up work field is blank
            //    csvWriterOutput.WriteField("");
            //    string additionalFaultsFound = submission.AdditionalFaultsFound;
            //    csvWriterOutput.WriteField(additionalFaultsFound);
            //    Boolean followupWorkQuote = submission.QuoteRequired;
            //    csvWriterOutput.WriteField(followupWorkQuote);
            //    string partsForFollowup = submission.PartsForFollowup;
            //    csvWriterOutput.WriteField(partsForFollowup);
            //    //Images for follow-up work - Doesn't need to be set
            //    csvWriterOutput.WriteField("");
            //    //RT 11/8/2016 - Adding in the start of the image url. 
            //    //RT 23/11/16 - Changing this to a method
            //    writeUrl(submission.Image1Url);
            //    //string imageUrlStart = "http://www.gocanvas.com/values/";
            //    //string image1 = imageUrlStart + submission.Image1Url;
            //    //csvWriterOutput.WriteField(image1);
            //    writeUrl(submission.Image2Url);
            //    //string image2 = imageUrlStart + submission.Image2Url;
            //    //csvWriterOutput.WriteField(image2);
            //    writeUrl(submission.Image3Url);
            //    //string image3 = imageUrlStart + submission.Image3Url;
            //    //csvWriterOutput.WriteField(image3);
            //    //string image4 = imageUrlStart + submission.Image4Url;
            //    writeUrl(submission.Image4Url);
            //    //csvWriterOutput.WriteField(image4);
            //    //string image5 = imageUrlStart + submission.Image5Url;
            //    writeUrl(submission.Image5Url);
            //    //csvWriterOutput.WriteField(image5);
            //    //Certify is next - don't set
            //    csvWriterOutput.WriteField("");
            //    //string customerSignature = imageUrlStart + submission.CustomerSignatureUrl;
            //    //csvWriterOutput.WriteField(customerSignature);
            //    writeUrl(submission.CustomerSignatureUrl);
            //    string customerName = submission.CustomerSignedName;
            //    csvWriterOutput.WriteField(customerName);
            //    DateTime dtSigned = submission.DtSigned;
            //    csvWriterOutput.WriteField(dtSigned);
            //    //string mttSignature = imageUrlStart + submission.MttEngSignatureUrl;
            //    //csvWriterOutput.WriteField(mttSignature);
            //    writeUrl(submission.MttEngSignatureUrl);
            //    csvWriterOutput.NextRecord();
            //}

        }
        //RT 28/11/16 - Rewriting this to use the MVVM pattern
        //private void loadDayForSubmission(string[] row, ServiceSheetViewModel currentSubmission)
        //{
        //    string dateFormatMinutes = "d/M/yyyy HH:mm";
        //    string dateFormatSeconds = "d/M/yyyy H:mm:ss";

        //    //Need to set the submission on the service day
        //    ServiceDayViewModel currentDay = new ServiceDayViewModel(currentSubmission);
        //    //The times may be with / without the date, depending on when they were imported.
        //    //Need to load the service date first, in case we need it for the times
        //    string serviceDate = row[40];
        //    currentDay.DtReport = DateTime.ParseExact(serviceDate, "d/M/yyyy", CultureInfo.InvariantCulture);

        //    string travelStartTime = row[26];
        //    try
        //    {
        //        currentDay.TravelStartTime = DateTime.ParseExact(travelStartTime, dateFormatMinutes, CultureInfo.InvariantCulture);
        //    }
        //    catch
        //    {
        //        try
        //        {
        //            currentDay.TravelStartTime = DateTime.ParseExact(travelStartTime, dateFormatSeconds, CultureInfo.InvariantCulture);
        //        }
        //        catch
        //        {
        //            string travelStartIncDate = serviceDate + " " + travelStartTime;
        //            currentDay.TravelStartTime = DateTime.ParseExact(travelStartIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
        //        }
        //    }

        //    string arrivalTimeOnsite = row[27];
        //    try
        //    {
        //        currentDay.ArrivalOnsiteTime = DateTime.ParseExact(arrivalTimeOnsite, dateFormatMinutes, CultureInfo.InvariantCulture);
        //    }
        //    catch
        //    {
        //        try
        //        {
        //            currentDay.ArrivalOnsiteTime = DateTime.ParseExact(arrivalTimeOnsite, dateFormatSeconds, CultureInfo.InvariantCulture);
        //        }
        //        catch
        //        {
        //            string arrivalOnsiteIncDate = serviceDate + " " + arrivalTimeOnsite;
        //            currentDay.ArrivalOnsiteTime = DateTime.ParseExact(arrivalOnsiteIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
        //        }
        //    }

        //    string departureTime = row[28];
        //    try
        //    {
        //        currentDay.DepartSiteTime = DateTime.ParseExact(departureTime, dateFormatMinutes, CultureInfo.InvariantCulture);
        //    }
        //    catch
        //    {
        //        try
        //        {
        //            currentDay.DepartSiteTime = DateTime.ParseExact(departureTime, dateFormatSeconds, CultureInfo.InvariantCulture);
        //        }
        //        catch
        //        {
        //            string departureIncDate = serviceDate + " " + departureTime;
        //            currentDay.DepartSiteTime = DateTime.ParseExact(departureIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
        //        }
        //    }

        //    string travelEndTime = row[29];
        //    try
        //    {
        //        currentDay.TravelEndTime = DateTime.ParseExact(travelEndTime, dateFormatMinutes, CultureInfo.InvariantCulture);
        //    }
        //    catch
        //    {
        //        try
        //        {
        //            currentDay.TravelEndTime = DateTime.ParseExact(travelEndTime, dateFormatSeconds, CultureInfo.InvariantCulture);
        //        }
        //        catch
        //        {
        //            string travelEndIncDate = serviceDate + " " + travelEndTime;
        //            currentDay.TravelEndTime = DateTime.ParseExact(travelEndIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
        //        }
        //    }

        //    currentDay.Mileage = Convert.ToInt32(row[30]);
        //    //try
        //    //{
        //    //    currentDay.ServiceDay.DailyAllowance = Convert.ToBoolean(row[31]);
        //    //}
        //    //catch
        //    //{
        //    //If this fails, then it nust be an integer
        //    //    int dailyAllowance = Convert.ToInt32(row[31]);
        //    //    if (dailyAllowance == 1)
        //    //    {
        //    //        currentDay.ServiceDay.DailyAllowance = true;
        //    //    }
        //    //    else
        //    //    {
        //    //        currentDay.ServiceDay.DailyAllowance = false;
        //    //    }
        //    ////}

        //    currentDay.DailyAllowance = Convert.ToBoolean(row[31]);

        //    //try
        //    //{
        //    //    currentDay.ServiceDay.OvernightAllowance = Convert.ToBoolean(row[32]);
        //    //}
        //    //catch
        //    //{
        //    //    //If this fails, then it nust be an integer
        //    //    int overnightAllowance = Convert.ToInt32(row[32]);
        //    //    if (overnightAllowance == 1)
        //    //    {
        //    //        currentDay.ServiceDay.OvernightAllowance = true;
        //    //    }
        //    //    else
        //    //    {
        //    //        currentDay.ServiceDay.OvernightAllowance = false;
        //    //    }
        //    //}
        //    currentDay.OvernightAllowance = Convert.ToBoolean(row[32]);
        //    //try
        //    //{
        //    //    currentDay.ServiceDay.BarrierPayment = Convert.ToBoolean(row[33]);
        //    //}
        //    //catch
        //    //{
        //    //    //If this fails, then it nust be an integer
        //    //    int barrierPayment = Convert.ToInt32(row[33]);
        //    //    if (barrierPayment == 1)
        //    //    {
        //    //        currentDay.ServiceDay.BarrierPayment = true;
        //    //    }
        //    //    else
        //    //    {
        //    //        currentDay.ServiceDay.BarrierPayment = false;
        //    //    }
        //    //}
        //    currentDay.BarrierPayment = Convert.ToBoolean(row[33]);

        //    currentDay.TravelTimeToSite = Convert.ToDouble(row[34]);
        //    currentDay.TravelTimeFromSite = Convert.ToDouble(row[35]);
        //    currentDay.TotalTravelTime = Convert.ToDouble(row[36]);
        //    currentDay.TotalTimeOnsite = Convert.ToDouble(row[37]);
        //    currentDay.DailyReport = row[38];
        //    currentDay.PartsSupplied = row[39];

        //    //RT 16/8/16 - Saving the timesheet
        //    //currentSubmission.AllServiceDayVMs.
        //}
        private void loadDayForSubmission(string[] row, ServiceSheetViewModel currentSubmission)
        {
            //RT 6/12/16 - If the first date is blank, then we are loading a csv created with this application
            bool serviceReaderCsv = false;
            string startDateStr = row[0];
            if (String.IsNullOrEmpty(startDateStr))
            {
                serviceReaderCsv = true;
            }

            string dateFormatMinutes = "d/M/yyyy HH:mm";
            //RT 6/12/16 - varable no longer needed.  Added by accident
            //string dateFormatSeconds = "d/M/yyyy H:mm:ss";

            //Need to set the submission on the service day
            //ServiceDayViewModel currentDay = new ServiceDayViewModel(currentSubmission);
            //The times may be with / without the date, depending on when they were imported.
            //Need to load the service date first, in case we need it for the times
            string serviceDate = row[40];
            //RT 6/12/16 - From canvas csv, this is a date, datetime from service reader
            DateTime dtReport;
            if (serviceReaderCsv)
            {
                dtReport = DateTime.ParseExact(serviceDate, dateFormatMinutes, CultureInfo.InvariantCulture);
            }
            else
            {
                dtReport = DateTime.ParseExact(serviceDate, "d/M/yyyy", CultureInfo.InvariantCulture);
            }

            string travelStartTime = row[26];

            //RT 6/12/16 - Canvas created csv's are time only.  Service Reader ones include 
            DateTime dtTravelStart;
            if (serviceReaderCsv)
            {
                dtTravelStart = DateTime.ParseExact(travelStartTime, dateFormatMinutes, CultureInfo.InvariantCulture);
            }
            else
            {
                string travelStartIncDate = serviceDate + " " + travelStartTime;
                dtTravelStart = DateTime.ParseExact(travelStartIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
            }
            //try
            //{
            //    dtTravelStart = DateTime.ParseExact(travelStartTime, dateFormatMinutes, CultureInfo.InvariantCulture);
            //}
            //catch
            //{
            //    try
            //    {
            //        dtTravelStart = DateTime.ParseExact(travelStartTime, dateFormatSeconds, CultureInfo.InvariantCulture);
            //    }
            //    catch
            //    {
            //        string travelStartIncDate = serviceDate + " " + travelStartTime;
            //        dtTravelStart = DateTime.ParseExact(travelStartIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
            //    }
            //}

            string arrivalTimeOnsite = row[27];
            DateTime dtArrivalOnsite;
            if (serviceReaderCsv)
            {
                dtArrivalOnsite = DateTime.ParseExact(arrivalTimeOnsite, dateFormatMinutes, CultureInfo.InvariantCulture);
            }
            else
            {
                string arrivalOnsiteIncDate = serviceDate + " " + arrivalTimeOnsite;
                dtArrivalOnsite = DateTime.ParseExact(arrivalOnsiteIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
            }

            //try
            //{
            //    dtArrivalOnsite = DateTime.ParseExact(arrivalTimeOnsite, dateFormatMinutes, CultureInfo.InvariantCulture);
            //}
            //catch
            //{
            //    try
            //    {
            //        dtArrivalOnsite = DateTime.ParseExact(arrivalTimeOnsite, dateFormatSeconds, CultureInfo.InvariantCulture);
            //    }
            //    catch
            //    {
            //        string arrivalOnsiteIncDate = serviceDate + " " + arrivalTimeOnsite;
            //        dtArrivalOnsite = DateTime.ParseExact(arrivalOnsiteIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
            //    }
            //}

            string departureTime = row[28];
            DateTime dtDeparture;
            if (serviceReaderCsv)
            {
                dtDeparture = DateTime.ParseExact(departureTime, dateFormatMinutes, CultureInfo.InvariantCulture);
            }
            else
            {
                string departureIncDate = serviceDate + " " + departureTime;
                dtDeparture = DateTime.ParseExact(departureIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
            }
            //try
            //{
            //    dtDeparture = DateTime.ParseExact(departureTime, dateFormatMinutes, CultureInfo.InvariantCulture);
            //}
            //catch
            //{
            //    try
            //    {
            //        dtDeparture = DateTime.ParseExact(departureTime, dateFormatSeconds, CultureInfo.InvariantCulture);
            //    }
            //    catch
            //    {
            //        string departureIncDate = serviceDate + " " + departureTime;
            //        dtDeparture = DateTime.ParseExact(departureIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
            //    }
            //}

            string travelEndTime = row[29];
            DateTime dtTravelEnd;
            if (serviceReaderCsv)
            {
                dtTravelEnd = DateTime.ParseExact(travelEndTime, dateFormatMinutes, CultureInfo.InvariantCulture);
            }
            else
            {
                string travelEndIncDate = serviceDate + " " + travelEndTime;
                dtTravelEnd = DateTime.ParseExact(travelEndIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
            }
            //try
            //{
            //    dtTravelEnd = DateTime.ParseExact(travelEndTime, dateFormatMinutes, CultureInfo.InvariantCulture);
            //}
            //catch
            //{
            //    try
            //    {
            //        dtTravelEnd = DateTime.ParseExact(travelEndTime, dateFormatSeconds, CultureInfo.InvariantCulture);
            //    }
            //    catch
            //    {
            //        string travelEndIncDate = serviceDate + " " + travelEndTime;
            //        dtTravelEnd = DateTime.ParseExact(travelEndIncDate, dateFormatMinutes, CultureInfo.InvariantCulture);
            //    }
            //}

            int mileage = Convert.ToInt32(row[30]);
            //RT 6/12/16  - The allowances are 1/0.  Need to convert to bool
            string daStr = row[31];
            bool dailyAllowance;
            if (daStr.Equals("1"))
            {
                dailyAllowance = true;
            }
            else
            {
                dailyAllowance = false;
            }
            //bool dailyAllowance = Convert.ToBoolean(row[31]);
            bool overnightAllowance;
            string onStr = row[32];
            if (onStr.Equals("1"))
            {
                overnightAllowance = true;
            }
            else
            {
                overnightAllowance = false;
            }
            //bool overnightAllowance = Convert.ToBoolean(row[32]);
            bool barrierPayment;
            string bpStr = row[33];
            if (bpStr.Equals("1"))
            {
                barrierPayment = true;
            }
            else
            {
                barrierPayment = false;
            }
            //bool barrierPayment = Convert.ToBoolean(row[33]);
            double travelTimeToSite = Convert.ToDouble(row[34]);
            double travelTimeFromSite = Convert.ToDouble(row[35]);
            double totalTravelTime = Convert.ToDouble(row[36]);
            double totalTimeOnsite = Convert.ToDouble(row[37]);
            string dailyReport = row[38];
            string partsSupplied = row[39];
            //Now create the serviceDayVM
            ServiceDayViewModel retval = new ServiceDayViewModel(dtTravelStart, dtArrivalOnsite, dtDeparture, dtTravelEnd, mileage, dailyAllowance, overnightAllowance, barrierPayment,
                travelTimeToSite, travelTimeFromSite, totalTravelTime, totalTimeOnsite, dailyReport, partsSupplied, dtReport, currentSubmission);
            currentSubmission.AddServiceDayViewModel(retval);
            //This doesn't need to return anything, as the day has been set on the submission.
        }
        //This class imports the historical data from a csv file and displays it in the application

        public Boolean importCsvData()
        {
            //First get the user to select the file with the data
            string csvFilename = openFilename();
            //RT 18/8/16 - csv filename can return empty string if cancelled.
            if (csvFilename.Equals(""))
            {
                MessageBox.Show("No csv file selected");
                return false;
            }
            csvTextReader = File.OpenText(csvFilename);
            csvReaderInput = new CsvReader(csvTextReader);
            csvReaderInput.Configuration.Delimiter = ",";

            //For each record in the csv file, we need to create a submission with all the days
            //Loop through all the rows in the csv import

            //If the row submission no matches the current submission number, then we are loading days.
            //If not, then it it a new submssion

            int currentReadSubmissionNo = -1;
            importedSubmissions = new ObservableCollection<ServiceSheetViewModel>();

            while (csvReaderInput.Read())
            {
                var row = csvReaderInput.CurrentRecord;
                int submissionNo = Convert.ToInt32(row[2]);

                //If first time through, then set the current submission no
                //Load the first row
                if (currentReadSubmissionNo == -1)
                {
                    currentReadSubmissionNo = submissionNo;
                    currentServiceSubmission = new ServiceSheetViewModel();
                    loadNewSubmission(row);
                    continue;
                }

                if (currentReadSubmissionNo == submissionNo)
                {
                    loadDayForSubmission(row, currentServiceSubmission);
                }
                else
                {
                    //RT - 20/8/16 - Need to recalculate the times as we have added the last day
                    //RT - 24/11/16 - No we don't, this is done at the end!
                    //currentServiceSubmission.updateTimes();
                    importedSubmissions.Add(currentServiceSubmission);
                    Console.WriteLine("Submission: " + currentReadSubmissionNo + " created");
                    currentReadSubmissionNo = submissionNo;
                    currentServiceSubmission = new ServiceSheetViewModel();
                    loadNewSubmission(row);
                    
                }
                
            }

            //RT - 20/8/16 - Need to recalculate the times as we have added the last day
            currentServiceSubmission.updateAllTimes();

            //RT 18/8/16 - Need to save the last submssion
            importedSubmissions.Add(currentServiceSubmission);

            return true;
        }
        //public static oldServiceSubmissionModel createSubmissionForXml(XElement submissionXml)
        //RT  - 29/11/16 - Rewriting to use the VM
        public static ServiceSheetViewModel createSubmissionForXml(XElement submissionXml)
        {
            //ServiceSheetViewModel retval = new ServiceSheetViewModel();
            //ServiceSheet serviceSheetReturn = new ServiceSheet();
            int submissionNumberEntered = Int32.Parse(submissionXml.Element(SUBMISSION_NUMBER).Value);
            //RT 11/8/16 - Adding in the response id
            string canvasResponseIdEntered = submissionXml.Element(RESPONSE_ID).Value;
            //Adding response date time
            string responseDateStr = submissionXml.Element(RESPONSE_DATE_TIME).Value;
            DateTime dtResponseEntered = Convert.ToDateTime(responseDateStr);
            //Adding device date
            string deviceDateStr = submissionXml.Element(DEVICE_DATE_TIME).Value;
            DateTime dtDeviceEntered = Convert.ToDateTime(deviceDateStr);
            //Submission version is in the form element
            XElement formDetailsXml = submissionXml.Element(FORM);
            int submissionFormVersionEntered = Int32.Parse(formDetailsXml.Element(SUBMISSION_VERSION).Value);
            string usernameEntered = submissionXml.Element(USERNAME).Value;
            string userFirstNameEntered = submissionXml.Element(FIRST_NAME).Value;
            string userSurnameEntered = submissionXml.Element(SURNAME).Value;

            string customerEntered = "";
            string addressLine1Entered = "";
            string addressLine2Entered = "";
            string townCityEntered = "";
            string postcodeEntered = "";
            string customerContactEntered = "";
            string customerPhoneNoEntered = "";
            string machineMakeModelEntered = "";
            string machineSerialEntered = "";
            string cncControlEntered = "";
            string jobStartStr = "";
            DateTime dtJobStartEntered = new DateTime();
            string customerOrderNoEntered = "";
            string mttJobNumberEntered = "";
            string jobDescriptionEntered = "";
            double jobTotalTimeOnsiteEntered;
            double jobTotalTravelTimeEntered;
            int mileageEntered;
            int totalDaEntered;
            int totalOaEntered;
            int totalBpEntered;
            string jobStatusEntered = "";
            string finalJobReportEntered = "";
            string additionalFaultsEntered = "";
            bool quoteRequiredEntered;
            string followUpPartsRequiredEntered = "";
            string image1UrlEntered = "";
            string image2UrlEntered = "";
            string image3UrlEntered = "";
            string image4UrlEntered = "";
            string image5UrlEntered = "";
            string customerSignatureUrlEntered = "";
            string customerNameEntered = "";
            DateTime dtSignedEntered;
            string mttEngSignatureUrlEntered = "";
            AllServiceDayViewModels dayVMs = null;

            XElement sectionsXml = submissionXml.Element(SECTIONS);
            // Loop through the sections
            foreach (XElement sectionXml in sectionsXml.Elements())
            {
                string sectionName = sectionXml.Element(SECTION_NAME).Value;
                if (sectionName.Equals(JOB_DETAILS))
                {
                    XElement screensXml = sectionXml.Element(SCREENS);
                    XElement screenXml = screensXml.Element(SCREEN);
                    XElement responsesXml = screenXml.Element(RESPONSES);
                    //Parse the job details

                    customerEntered = xmlResult(CUSTOMER, responsesXml);
                    addressLine1Entered = xmlResult(ADDRESS_1, responsesXml);
                    addressLine2Entered = xmlResult(ADDRESS_2, responsesXml);
                    townCityEntered = xmlResult(TOWN_CITY, responsesXml);
                    postcodeEntered = xmlResult(POSTCODE, responsesXml);
                    customerContactEntered = xmlResult(CUSTOMER_CONTACT, responsesXml);
                    customerPhoneNoEntered = xmlResult(CUSTOMER_PHONE, responsesXml);
                    machineMakeModelEntered = xmlResult(MACHINE_MAKE_MODEL, responsesXml);
                    machineSerialEntered = xmlResult(SERIAL_NUMBER, responsesXml);

                    cncControlEntered = xmlResult(MACHINE_CONTROL, responsesXml);
                    jobStartStr = xmlResult(JOB_START_DATE, responsesXml);
                    dtJobStartEntered = Convert.ToDateTime(jobStartStr);
                    customerOrderNoEntered = xmlResult(CUSTOMER_ORDER, responsesXml);
                    mttJobNumberEntered = xmlResult(MTT_JOB_NO, responsesXml);
                    jobDescriptionEntered = xmlResult(JOB_DESC, responsesXml);

                }
                else if (sectionName.Equals(TIME_SHEET))
                {
                    XElement screensXml = sectionXml.Element(SCREENS);
                    XElement screenXml = screensXml.Element(SCREEN);
                    XElement responseGroupsXml = screenXml.Element(RESPONSE_GROUPS);
                    //retval.ServiceTimesheets = ServiceDay.createDays(responseGroupsXml);
                    dayVMs = createDays(responseGroupsXml);
                }
                else if (sectionName.Equals(JOB_SIGNOFF))
                {
                    XElement screensXml = sectionXml.Element(SCREENS);
                    XElement screenXml = screensXml.Element(SCREEN);
                    XElement responsesXml = screenXml.Element(RESPONSES);

                    jobTotalTimeOnsiteEntered = Convert.ToDouble(xmlResult(JOB_TOTAL_TIME_ONSITE, responsesXml));
                    jobTotalTravelTimeEntered = Convert.ToDouble(xmlResult(TOTAL_TRAVEL_TIME, responsesXml));

                    //RT 13/10/16 - Mileage, daily/overnight and BP are int, although canvas returns a string like a double.  There will never be a decimal point in them
                    double mileageDouble = Convert.ToDouble(xmlResult(TOTAL_MILEAGE, responsesXml));
                    mileageEntered = (int)mileageDouble;
                    double totalDaDouble = Convert.ToDouble(xmlResult(TOTAL_DAILY_ALLOWANCES, responsesXml));
                    totalDaEntered = (int)totalDaDouble;
                    double totalOaDouble = Convert.ToDouble(xmlResult(TOTAL_OVERNIGHT_ALLOWANCES, responsesXml));
                    totalOaEntered = (int)totalOaDouble;
                    double totalBpDouble = Convert.ToDouble(xmlResult(TOTAL_BARRIER_PAYMENTS, responsesXml));
                    totalBpEntered = (int)totalBpDouble;
                    jobStatusEntered = xmlResult(JOB_STATUS, responsesXml);
                    finalJobReportEntered = xmlResult(FINAL_JOB_REPORT, responsesXml);
                    additionalFaultsEntered = xmlResult(ADDITIONAL_FAULTS_FOUND, responsesXml);
                    quoteRequiredEntered = Convert.ToBoolean(xmlResult(QUOTE_REQUIRED, responsesXml));
                    followUpPartsRequiredEntered = xmlResult(FOLLOWUP_PARTS, responsesXml);
                    image1UrlEntered = xmlResult(IMAGE_1_URL, responsesXml);
                    image2UrlEntered = xmlResult(IMAGE_2_URL, responsesXml);
                    image3UrlEntered = xmlResult(IMAGE_3_URL, responsesXml);
                    image4UrlEntered = xmlResult(IMAGE_4_URL, responsesXml);
                    image5UrlEntered = xmlResult(IMAGE_5_URL, responsesXml);
                    customerSignatureUrlEntered = xmlResult(CUSTOMER_SIGNATURE, responsesXml);
                    customerNameEntered = xmlResult(CUSTOMER_NAME, responsesXml);
                    dtSignedEntered = Convert.ToDateTime(xmlResult(DATE_SIGNED, responsesXml));
                    mttEngSignatureUrlEntered = xmlResult(MTT_ENG_SIGNATURE, responsesXml);

                    //Now we create the Service Sheet VM
                    ServiceSheetViewModel retval = new ServiceSheetViewModel(submissionNumberEntered, "", userFirstNameEntered, userSurnameEntered, canvasResponseIdEntered, dtResponseEntered,
                        dtDeviceEntered, "", submissionFormVersionEntered, customerEntered, addressLine1Entered, addressLine2Entered, townCityEntered, postcodeEntered, customerContactEntered,
                        customerPhoneNoEntered, machineMakeModelEntered, machineSerialEntered, cncControlEntered, dtJobStartEntered, customerOrderNoEntered, mttJobNumberEntered, jobDescriptionEntered,
                        jobTotalTimeOnsiteEntered, jobTotalTravelTimeEntered, mileageEntered, totalDaEntered, totalOaEntered, totalBpEntered, jobStatusEntered, finalJobReportEntered, additionalFaultsEntered,
                        quoteRequiredEntered, followUpPartsRequiredEntered, image1UrlEntered, image2UrlEntered, image3UrlEntered, image4UrlEntered, image5UrlEntered, customerSignatureUrlEntered, customerNameEntered, dtSignedEntered,
                        mttEngSignatureUrlEntered, dayVMs, usernameEntered);
                    retval.Save();

                    return retval;
                }
                else
                {
                    new Exception("Unknown Canvas Data Section");
                }

            }

            //If we get to here, then an error has occurred.
            return null;
            //retval.ServiceSubmission = serviceSheetReturn;
            //return retval;
        }
        //private bool createJobCostingSheet(ServiceSubmissionModel submission, string filename)
        private int createJobCostingSheet(ServiceSheetViewModel submission, string filename, bool firstSubmission, int lineNumber)
        {
            Excel.Range range;
            //First Open excel

            if (firstSubmission)
            {
                excelApplication = new Excel.Application();
                excelApplication.Visible = true;
                excelWorkbook = excelApplication.Workbooks.Open(filename);

                excelWorksheet = excelWorkbook.ActiveSheet;

                //Add the job title
                string customer = submission.Customer;
                string machineMake = submission.MachineMakeModel;
                string serialNumber = submission.MachineSerial;
                string jobDescription = submission.JobDescription;

                range = excelWorksheet.Cells[13, 1];
                range.Value2 = string.Concat(customer, " - ", machineMake, " - S/N: ", serialNumber, " - ", jobDescription);

                range = excelWorksheet.Cells[11, 9];
                range.Value2 = submission.MttJobNumber;
            }
            //Load all the days and loop through them. Output to the sheet
            AllServiceDayViewModels serviceDays = submission.AllServiceDays;

            //Need the engineers initials for each row
            string engFirstName = submission.UserFirstName;
            string engSurname = submission.UserSurname;
            string initials = string.Concat(engFirstName[0], engSurname[0]);

            int sheetNo = submission.SubmissionNumber;

            int currentSpreadsheetRow;

            if (lineNumber == -1)
            {
                currentSpreadsheetRow = 17;
            }
            else
            {
                currentSpreadsheetRow = lineNumber++;
            }


            foreach (ServiceDayViewModel currentDay in serviceDays.AllServiceDayVMs)
            {
                range = excelWorksheet.Cells[currentSpreadsheetRow, 1];
                range.Value2 = currentDay.DtReport;

                string day = currentDay.DtReport.DayOfWeek.ToString();
                range = excelWorksheet.Cells[currentSpreadsheetRow, 2];
                range.Value2 = day;

                double standardHours = calculateStandardHours(currentDay);
                range = excelWorksheet.Cells[currentSpreadsheetRow, 3];
                range.Value2 = standardHours;

                double overtimeHours = calculateOvertimeHours(currentDay);
                range = excelWorksheet.Cells[currentSpreadsheetRow, 4];
                range.Value2 = overtimeHours;

                range = excelWorksheet.Cells[currentSpreadsheetRow, 5];
                range.Value2 = currentDay.TotalTravelTime;

                bool dailyAllowance = currentDay.DailyAllowance;
                int dailyAllowanceValue = convertBoolToIntForAllowances(dailyAllowance);
                range = excelWorksheet.Cells[currentSpreadsheetRow, 6];
                range.Value2 = dailyAllowanceValue;

                bool overNight = currentDay.OvernightAllowance;
                int overnightAllowanceValue = convertBoolToIntForAllowances(overNight);
                range = excelWorksheet.Cells[currentSpreadsheetRow, 7];
                range.Value2 = overnightAllowanceValue;

                range = excelWorksheet.Cells[currentSpreadsheetRow, 8];
                range.Value2 = currentDay.Mileage;

                range = excelWorksheet.Cells[currentSpreadsheetRow, 9];
                range.Value2 = initials;

                range = excelWorksheet.Cells[currentSpreadsheetRow, 10];
                range.Value2 = sheetNo;

                currentSpreadsheetRow++;
            }

            MessageBox.Show("Need to handle bank holidays");

            return currentSpreadsheetRow;
        }