public ActionResult EnvoyerDocumentMissionAuClient(string id)
        {
            string error = string.Empty;
            MissionDocument missionDoc = null;
            string missionDocLabel = "Document";

            try
            {
                missionDoc = MissionDocumentBL.GetMissionDocumentById(new Guid(id));

                if (missionDoc == null)
                {
                    error = _languageData.GetContent("merci_de_selectionner_le_doc_a_envoyer");
                }
                else if (missionDoc.SignedByCustomer)
                {
                    error = string.Format(_languageData.GetContent("client_a_deja_signe_le_doc"), missionDoc.DateCustomerSignature.Value.ToShortDateString());
                }
                else
                {
                    SignatureDocumentBL.SendMissionDocumentMailToClient(missionDoc, true);
                }                
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                error = ex.Message;
            }


            if (missionDoc != null)
            {
                missionDocLabel = (missionDoc.IsLetter) ? _languageData.GetContent("lettre_de_mission") : _languageData.GetContent("rapport_de_mission");
            }

            SignatureModel signatureModel = new SignatureModel()
            {
                H1Title = missionDocLabel,
                HeadTitle = string.Format("Signature {0}", missionDocLabel),
                ErrorMessage = error,
                ContentMessage =  _languageData.GetContent("email_invitation_à_signer_envoyé")
            };

            return View("AllerSignature", signatureModel);
        }
        public ActionResult SignerDocumentMissionParClient(string id)
        {
            string error = string.Empty;
            string urlIHM_Dictao = string.Empty;
            int pageCount = 0;
            MissionDocument missionDoc = new MissionDocument();

            try
            {
                // Id latest mission document = id in parameter                
                if (string.IsNullOrEmpty(id))
                {
                    error = _languageData.GetContent("selectionner_un_doc_a_signer");
                }
                else
                {
                    missionDoc = MissionDocumentBL.GetMissionDocumentById(new Guid(id));

                    if (missionDoc == null)
                    {
                        error = _languageData.GetContent("selectionner_un_doc_a_signer");
                    }
                    else
                    {
                        List<DocumentToSign> documentsToSign = this.GetDocumentsToSign(missionDoc); //TODO generate pdf ?
                        
                        // Sign the mission document (Customer signs secondly)
                        urlIHM_Dictao = SignatureDocumentBL.SignMissionDocumentByCustomer(missionDoc.idMissionDocument, documentsToSign, pageCount);
                    }
                }
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                error = ex.Message;
            }

            if (!string.IsNullOrEmpty(error))
            {
                string missionDocLabel = (missionDoc.IsLetter) ? _languageData.GetContent("lettre_de_mission") : _languageData.GetContent("rapport_de_mission");

                SignatureModel signatureModel = new SignatureModel()
                {
                    H1Title = (missionDoc.IsLetter) ? _languageData.GetContent("lettre_de_mission") : _languageData.GetContent("rapport_de_mission"),
                    HeadTitle = string.Format(_languageData.GetContent("signature_"), missionDocLabel),
                    ErrorMessage = error 
                };

                return View("AllerSignature", signatureModel);
            }
            else
            {
                return Redirect(urlIHM_Dictao);
            }
        }
        public ActionResult SignerDocumentMissionParConseiller(string id)
        {
            string error = string.Empty;
            string urlIHM_Dictao = string.Empty;
            MissionDocument missionDoc = new MissionDocument();
            List<DocumentToSign> documentsToSign = new List<DocumentToSign>();

            try
            {
                // Id mission doc = id in parameter                
                missionDoc = MissionDocumentBL.GetMissionDocumentById(new Guid(id));

                if (missionDoc == null)
                {
                    error = _languageData.GetContent("selectionner_un_doc_a_signer");
                }
                else
                {
                    documentsToSign = this.GetDocumentsToSign(missionDoc); //TODO generate pdf ?

                    //Signature
                    if (documentsToSign.Count == 0)
                    {
                        error = _languageData.GetContent("aucun_doc_a_signer_veuillez");
                    }

                    if (string.IsNullOrEmpty(error))
                    {
                        // Sign the document mission
                        Upsilab.Data.Model.User userAdviser = (missionDoc.User != null) ? missionDoc.User : Upsilab.Business.Utility.SessionManager.GetUserSession();
                        urlIHM_Dictao = SignatureDocumentBL.SignMissionDocumentByAdviser(missionDoc.idMissionDocument, documentsToSign, userAdviser);
                    }
                }
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                error = ex.Message;
            }

            if (!string.IsNullOrEmpty(error))
            {
                string missionDocLabel = (missionDoc.IsLetter) ? _languageData.GetContent("lettre_de_mission") : _languageData.GetContent("rapport_de_mission");

                SignatureModel signatureModel = new SignatureModel()
                {
                    H1Title = (missionDoc.IsLetter) ? _languageData.GetContent("lettre_de_mission") : _languageData.GetContent("rapport_de_mission"),
                    HeadTitle = string.Format("Signature {0}", missionDocLabel),
                    ErrorMessage = error
                };

                return View("AllerSignature", signatureModel);
            }
            else
            {
                return Redirect(urlIHM_Dictao);
            }

        }
        public ActionResult SignerCRTOParConseiller(string id)
        {
            string error = string.Empty;
            string urlIHM_Dictao = string.Empty;

            try
            {
                // Id Customer = id in parameter                
                if (string.IsNullOrEmpty(id))
                {
                    error = _languageData.GetContent("client_identité_non_reconnue");
                }
                else
                {
                    //Adviser always signs the EC secondly
                    CustomerProspect customer =Business.CustomerProspect.CustomerProspectBL.GetCustomerProspectById(Guid.Parse(id));

                    string pdfPath = string.Empty;
                    // TODO ==> génération du pdf
                    if (customer != null)
                    {
                        pdfPath = GenerateRTODocument(customer);

                        var cust = Business.CustomerProspect.CustomerProspectBL.GetCustomerProspectById(customer.idCustomer);
                        if (cust != null) customer = cust;

                        // Sign the confidentiality agreement
                        User userAdviser = (customer.ConventionRTO != null && customer.ConventionRTO.User != null) ? customer.ConventionRTO.User : SessionManager.GetUserSession();
                        urlIHM_Dictao = SignatureDocumentBL.SignCRTOByAdviser(customer.idCustomer, pdfPath, userAdviser);
                    }
                    
                }
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                error = ex.Message;
            }

            if (!string.IsNullOrEmpty(error))
            {
                SignatureModel signatureModel = new SignatureModel()
                {
                    H1Title = Business.Language.LanguageContentBL.Translate("crto_title"),
                    HeadTitle = string.Format(_languageData.GetContent("signature_"), Business.Language.LanguageContentBL.Translate("crto_title")),
                    ErrorMessage = error
                };

                return View("AllerSignature", signatureModel);
            }
            else
            {
                return Redirect(urlIHM_Dictao);
            }

        }
        public ActionResult SignerDocument(string id)
        {
            string error = string.Empty;
            string urlIHM_Dictao = string.Empty;        

            try
            {
                // Id Signatory = id in parameter                
                urlIHM_Dictao = SignatureDocumentBL.SignDocument(new Guid(id));
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                error = ex.Message;
            }

            if (!string.IsNullOrEmpty(error))
            {
                SignatureModel signatureModel = new SignatureModel()
                {
                    H1Title = "Signature",
                    HeadTitle = "Signature",
                    ErrorMessage = error
                };

                return View("AllerSignature", signatureModel);
            }
            else
            {
                return Redirect(urlIHM_Dictao);
            }

        }
        public ActionResult SignerDERParConseiller(string id)
        {
            string error = string.Empty;
            string urlIHM_Dictao = string.Empty;
            DER der = new DER();
            List<DocumentToSign> documentsToSign = new List<DocumentToSign>();

            try
            {
                // Id DER doc = id in parameter                
                der = DerBL.GetDERById(new Guid(id));

                if (der == null)
                {
                    error = _languageData.GetContent("selectionner_un_doc_a_signer");
                }
                else
                {
                    documentsToSign = this.GetDocumentsToSign(der); //TODO generate pdf ?

                    //Signature
                    if (documentsToSign.Count == 0)
                    {
                        error = _languageData.GetContent("aucun_doc_a_signer_veuillez");
                    }

                    if (string.IsNullOrEmpty(error))
                    {
                        // Sign the document mission
                        Upsilab.Data.Model.User userAdviser = (der.User != null) ? der.User : Upsilab.Business.Utility.SessionManager.GetUserSession();
                        urlIHM_Dictao = SignatureDocumentBL.SignDERByAdviser(der.idDer, documentsToSign, userAdviser);
                    }
                }
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                error = ex.Message;
            }

            if (!string.IsNullOrEmpty(error))
            {
                SignatureModel signatureModel = new SignatureModel()
                {
                    H1Title = Business.Language.LanguageContentBL.Translate("der_title"),
                    HeadTitle = string.Format("Signature {0}", Business.Language.LanguageContentBL.Translate("der_title")),
                    ErrorMessage = error
                };

                return View("AllerSignature", signatureModel);
            }
            else
            {
                return Redirect(urlIHM_Dictao);
            }

        }
        public ActionResult SignerCRTOParClient(string id)
        {
            string error = string.Empty;
            string urlIHM_Dictao = string.Empty;

            try
            {
                // Id Customer = id in parameter                
                if (string.IsNullOrEmpty(id))
                {
                    error = _languageData.GetContent("client_identité_non_reconnue");
                }
                else
                {
                    Upsilab.Data.Model.CustomerProspect customer = Upsilab.Business.CustomerProspect.CustomerProspectBL.GetCustomerProspectById(Guid.Parse(id));

                    // Sign the confidentiality agreement                        
                    urlIHM_Dictao = SignatureDocumentBL.SignCRTOByCustomer(customer.idCustomer);
                }
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                error = ex.Message;
            }

            if (!string.IsNullOrEmpty(error))
            {
                SignatureModel signatureModel = new SignatureModel()
                {
                    H1Title = Business.Language.LanguageContentBL.Translate("crto_title"),
                    HeadTitle = string.Format(_languageData.GetContent("signature_"), Business.Language.LanguageContentBL.Translate("crto_title")),
                    ErrorMessage = error
                };

                return View("AllerSignature", signatureModel);
            }
            else
            {
                return Redirect(urlIHM_Dictao);
            }
        }
        public ActionResult GeneratePdf(string id)
        {
            MissionDocument missionDoc = null;
            string error = string.Empty;
            string missionDocLabel = "Document";

            try
            {
                //Get mission document
                missionDoc = MissionDocumentBL.GetMissionDocumentById(new Guid(id));
                if (missionDoc == null)
                {
                    error = LanguageData.GetContent("selectionnez_doc_a_generer");
                }
                else
                {
                    this.GenerateMissionDocument(missionDoc, true);
                }
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }

            SignatureModel signatureModel = new SignatureModel()
            {
                HeadTitle = LanguageData.GetContent("generation_doc_mission"),
                H1Subtitle = LanguageData.GetContent("generation_pdf"),
                H1Title = (missionDoc != null) ? ((missionDoc.IsLetter) ? "Lettre de mission" : "Rapport de mission") : missionDocLabel
            };

            if (!string.IsNullOrEmpty(error))
            {
                signatureModel.ContentTitle = LanguageData.GetContent("erreur_generation_pdf");
                signatureModel.ContentMessage = error;
            }
            else
            {
                signatureModel.ContentTitle = LanguageData.GetContent("succes_generation");
                signatureModel.ContentMessage = LanguageData.GetContent("doc_generé_avec_succes");
            }

            return View("Message", signatureModel);
        }
        public ActionResult SignerDERParClient(string id)
        {
            string error = string.Empty;
            string urlIHM_Dictao = string.Empty;
            int pageCount = 0;
            DER der = new DER();

            try
            {
                // Id latest mission document = id in parameter                
                if (string.IsNullOrEmpty(id))
                {
                    error = _languageData.GetContent("selectionner_un_doc_a_signer");
                }
                else
                {
                    der = DerBL.GetDERById(new Guid(id));

                    if (der == null)
                    {
                        error = _languageData.GetContent("selectionner_un_doc_a_signer");
                    }
                    else
                    {
                        List<DocumentToSign> documentsToSign = this.GetDocumentsToSign(der); //TODO generate pdf ?

                        // Sign the mission document (Customer signs secondly)
                        urlIHM_Dictao = SignatureDocumentBL.SignDERByCustomer(der.idDer, documentsToSign, pageCount);
                    }
                }
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                error = ex.Message;
            }

            if (!string.IsNullOrEmpty(error))
            {
                SignatureModel signatureModel = new SignatureModel()
                {
                    H1Title = Business.Language.LanguageContentBL.Translate("der_title"),
                    HeadTitle = string.Format(_languageData.GetContent("signature_"), Business.Language.LanguageContentBL.Translate("der_title")),
                    ErrorMessage = error
                };

                return View("AllerSignature", signatureModel);
            }
            else
            {
                return Redirect(urlIHM_Dictao);
            }
        }
        public ActionResult Cancel(string id)
        {
            MissionDocument missionDoc = null;
            string error = string.Empty;
            string missionDocLabel = "Document";

            try
            {
                //Get mission document
                missionDoc = MissionDocumentBL.GetMissionDocumentById(new Guid(id));
                if (missionDoc == null)
                {
                    error = LanguageData.GetContent("selectionnez_doc_a_annuler");
                }
                else if (missionDoc.Status == RegulatoryDocumentModel.Status.Canceled.ToString()) // check if already canceled
                {
                    error = string.Format(LanguageData.GetContent("doc_dejà_annule"), missionDocLabel);
                }
                else
                {
                    missionDoc.Status = RegulatoryDocumentModel.Status.Canceled.ToString();
                    MissionDocumentBL.UpdateMissionDocument(missionDoc);

                    //update du customer status
                    CustomerProspect cust = CustomerProspectBL.GetCustomerProspectById(missionDoc.idCustomerProspect);
                    MissionDocument doc = MissionDocumentBL.GetLatestMissionDocumentByIdCustomer(cust.idCustomer, missionDoc.IsLetter);
                    if (missionDoc.IsLetter)
                    {
                        cust.LetterStatus = doc != null ? doc.Status : string.Empty;

                    }
                    else
                    {
                        cust.MissionStatus = doc != null ? doc.Status : string.Empty;
                    }
                    CustomerProspectBL.Update(cust);
                }
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }

            SignatureModel signatureModel = new SignatureModel()
            {
                HeadTitle = LanguageData.GetContent("annulation_doc_mission"),
                H1Subtitle = LanguageData.GetContent("annulation"),
                H1Title = (missionDoc != null) ? ((missionDoc.IsLetter) ? LanguageData.GetContent("lettre_de_mission") : LanguageData.GetContent("rapport_de_mission")) : missionDocLabel
            };

            if (!string.IsNullOrEmpty(error))
            {
                signatureModel.ContentTitle = LanguageData.GetContent("erreur_annulation");
                signatureModel.ContentMessage = error;
            }
            else
            {
                signatureModel.ContentTitle = LanguageData.GetContent("annulation_ok");
                signatureModel.ContentMessage = LanguageData.GetContent("doc_bien_annulé");
            }

            return View("Message", signatureModel);
        }
        public ActionResult SignerDocumentMissionParConseiller(string id)
        {
            string error = string.Empty;
            string urlIHM_Dictao = string.Empty;
            int pageCount = 0;
            MissionDocument missionDoc = new MissionDocument();
            List<DocumentToSign> documentsToSign = new List<DocumentToSign>();

            try
            {
                // Id mission doc = id in parameter                
                missionDoc = MissionDocumentBL.GetMissionDocumentById(new Guid(id));

                if (missionDoc == null)
                {
                    error = LanguageData.GetContent("selectionner_un_doc_a_signer");
                }
                else
                {
                    CustomerProspect customer = missionDoc.CustomerProspect;
                    SignatureParameters signatureParameters = null;

                    #region 1- Mission document
                    //A- Build pdf mission document to sign
                    string docType = (missionDoc.IsLetter) ? ElectronicSafeDocumentBL.DocumentType.LM.ToString() : ElectronicSafeDocumentBL.DocumentType.RM.ToString();

                    string destFullPath = ElectronicSafeDocumentBL.BuildClientUploadDocumentPath(docType, customer);
                    string filename = ElectronicSafeDocumentBL.BuildDocumentName(docType, missionDoc.idMissionDocument, false);

                    string destMissionDocFilePath = System.IO.Path.Combine(destFullPath, filename);

                    //If Upsideo model, generate pdf
                    //If Firm model, merge uploaded file with the first and last page
                    if (missionDoc.IsUpsideoModel)
                    {
                        //1 : Génération du PDF
                        if (missionDoc.IsLetter) //Lettre de Mission
                        {
                            bool isPP = (missionDoc.CustomerProspect.IsCorporation.HasValue) ? ((missionDoc.CustomerProspect.IsCorporation.Value) ? false : true) : false;
                            if (isPP)
                            {
                                MissionDocumentPdfGenerationBL.GeneratePP_EngagementLetter(missionDoc, destMissionDocFilePath, false);
                            }
                            else
                            {
                                MissionDocumentPdfGenerationBL.GeneratePM_EngagementLetter(missionDoc, destMissionDocFilePath, false);
                            }
                        }
                        else // Rapport de mission
                        {
                            MissionDocumentPdfGenerationBL.Generate_MissionReport(missionDoc, destMissionDocFilePath, false);
                        }

                    }
                    else
                    {
                        //Merge pdf
                        filename = missionDoc.FileName;
                        string uploadedDoc = System.IO.Path.Combine(destFullPath, filename);
                        if (missionDoc.IsLetter)
                        {
                            MissionDocumentPdfGenerationBL.GenerateEngagementLetterByMerge(missionDoc, uploadedDoc, destMissionDocFilePath, false, out pageCount);
                        }
                        else
                        {
                            MissionDocumentPdfGenerationBL.GenerateReportLetterByMerge(missionDoc, uploadedDoc, destMissionDocFilePath, false, out pageCount);
                        }
                    }

                    if (!System.IO.File.Exists(destMissionDocFilePath))
                    {
                        error = LanguageData.GetContent("doc_n_a_pas_ete_genere_correctement");
                    }
                    else
                    {
                        //B- Prepare object to sign
                        signatureParameters = new SignatureParameters()
                        {
                            page = (pageCount > 0) ? pageCount : (missionDoc.IsLetter) ? 13 : 9, //LM : 10pages; RM : 8pages
                            x_adviser = 33,
                            x_customer = 120,
                            y = 177
                        };

                        string typeDocLabel = (missionDoc.IsLetter) ? LanguageData.GetContent("lettre_de_mission") : LanguageData.GetContent("rapport_de_mission");

                        DocumentToSign docMD = new DocumentToSign()
                        {
                            Label = typeDocLabel,
                            Description = typeDocLabel,
                            PathFilename = destMissionDocFilePath,
                            Type = DTPClient.DocumentTypes.CONTRACT.ToString(),
                            SignatureParameters = signatureParameters
                        };

                        documentsToSign.Add(docMD);
                    }
                    #endregion

                    #region 2- Convention RTO Document
                    if (missionDoc.AttachConventionRTO.HasValue && missionDoc.AttachConventionRTO.Value)
                    {
                        //A- Generate CRTO pdf
                        pageCount = 0;
                        docType = (missionDoc.IsLetter) ? ElectronicSafeDocumentBL.DocumentType.LM.ToString() : ElectronicSafeDocumentBL.DocumentType.RM.ToString();
                        docType = docType + "_" + ElectronicSafeDocumentBL.DocumentType.CRTO.ToString();

                        destFullPath = ElectronicSafeDocumentBL.BuildClientUploadDocumentPath(docType, customer);
                        filename = ElectronicSafeDocumentBL.BuildDocumentName(docType, missionDoc.idMissionDocument, false);

                        string destCRTOFilePath = System.IO.Path.Combine(destFullPath, filename);

                        //If Upsideo model, generate pdf
                        //If Firm model, merge uploaded file with the first and last page
                        if (missionDoc.IsConventionRTOFromYourModel.HasValue && !missionDoc.IsConventionRTOFromYourModel.Value)
                        {
                            // MissionDocumentPdfGenerationBL.GenerateRTO(missionDoc, destCRTOFilePath, false);
                            pageCount = MissionDocumentPdfGenerationBL.GenerateRTO(missionDoc.idMissionDocument, missionDoc.User,
                                                                         missionDoc.CustomerProspect, destCRTOFilePath,
                                                                         false);
                        }
                        else if (!string.IsNullOrEmpty(missionDoc.ConventionRTOFirmModelFileName))
                        {
                            //Merge pdf
                            filename = missionDoc.ConventionRTOFirmModelFileName;
                            string uploadedDoc = System.IO.Path.Combine(destFullPath, filename);

                            MissionDocumentPdfGenerationBL.GenerateRTOByMerge(missionDoc, uploadedDoc, destCRTOFilePath, false, out pageCount);
                        }

                        if (!System.IO.File.Exists(destCRTOFilePath))
                        {
                            error = LanguageData.GetContent("pdf_rto_n_a_pas_ete_genere_correctement");
                        }
                        else
                        {
                            //B- Prepare object to send to signature
                            signatureParameters = new SignatureParameters()
                            {
                                page = (pageCount > 0) ? pageCount : 4, //CRTO : 4pages
                                x_adviser = 33,
                                x_customer = 120,
                                y = 177
                            };

                            DocumentToSign docRTO = new DocumentToSign()
                            {
                                Label = LanguageData.GetContent("convention_de_rto"),
                                Description = LanguageData.GetContent("convention_de_rto"),
                                PathFilename = destCRTOFilePath,
                                Type = DTPClient.DocumentTypes.APPENDIX3.ToString(),
                                SignatureParameters = signatureParameters
                            };

                            documentsToSign.Add(docRTO);
                        }
                    }
                    #endregion

                    #region 3- Presentation etablissement
                    if (missionDoc.AttachPresentation)
                    {
                        //A- PDF ?
                        pageCount = 0;
                        docType = ElectronicSafeDocumentBL.DocumentType.BS.ToString();
                        string firmDocumentPath = string.Format(@"{0}\FirmInstitution\FI_{1}", Server.MapPath("~/uploads"), missionDoc.CustomerProspect.FirmInstitution.idFirmInstitution);
                        destFullPath = ElectronicSafeDocumentBL.BuildClientUploadDocumentPath(docType, customer);
                        filename = ElectronicSafeDocumentBL.BuildDocumentName(docType, missionDoc.idMissionDocument, false);

                        string destBSFilePath = System.IO.Path.Combine(destFullPath, filename);

                        //From firmModel or from upsideomodel
                        if (missionDoc.IsPresentationFromModel)
                        {
                            //Merge pdf
                            filename = missionDoc.CustomerProspect.FirmInstitution.PresentationFile;
                            string uploadedDoc = System.IO.Path.Combine(firmDocumentPath, filename);

                            if (System.IO.File.Exists(uploadedDoc))
                            {
                                Upsilab.Business.Configuration.FirmInstitutionPdfGeneration.GeneratePresentationByMerge(missionDoc.CustomerProspect.FirmInstitution, uploadedDoc, destBSFilePath, false, out pageCount);
                            }
                            else
                            {
                                error = LanguageData.GetContent("pdf_presentation_etab_n_existe_pas_ou");
                            }

                        }
                        else
                        {
                            //From upsideo model => generate it
                            pageCount = Upsilab.Business.Configuration.FirmInstitutionPdfGeneration.GeneratePresentation(missionDoc.CustomerProspect.FirmInstitution, destBSFilePath, false);
                        }

                        if (!System.IO.File.Exists(destBSFilePath))
                        {
                            error = LanguageData.GetContent("pdf_presentation_etab_n_existe_pas_ou");
                        }
                        else
                        {
                            //B- Prepare object to send to signature
                            signatureParameters = new SignatureParameters()
                            {
                                //page = (pageCount > 0) ? pageCount : 6, //BS : 6pages
                                page = pageCount,
                                x_adviser = 33,
                                x_customer = 120,
                                y = 177
                            };

                            DocumentToSign docPE = new DocumentToSign()
                            {
                                Label = LanguageData.GetContent("presentation_de_l_etab"),
                                Description = LanguageData.GetContent("presentation_de_l_etab"),
                                PathFilename = destBSFilePath,
                                Type = DTPClient.DocumentTypes.APPENDIX1.ToString(),
                                SignatureParameters = signatureParameters
                            };

                            documentsToSign.Add(docPE);
                        }
                    }
                    #endregion

                    #region 4- Fiche d'information legale FIL => DER
                    if (string.IsNullOrEmpty(customer.DerStatus)
                        || (!string.IsNullOrEmpty(customer.DerStatus) && customer.DerStatus != DerModel.Status.Completed.ToString()))
                    {

                        if (missionDoc.AttachInformationCard)
                        {
                            //A- PDF ?
                            pageCount = 0;
                            docType = ElectronicSafeDocumentBL.DocumentType.FIL.ToString();
                            string firmDocumentPath = string.Format(@"{0}\FirmInstitution\FI_{1}", Server.MapPath("~/uploads"), missionDoc.CustomerProspect.FirmInstitution.idFirmInstitution);
                            destFullPath = ElectronicSafeDocumentBL.BuildClientUploadDocumentPath(docType, customer);
                            filename = ElectronicSafeDocumentBL.BuildDocumentName(docType, missionDoc.idMissionDocument, false);

                            string destFILFilePath = System.IO.Path.Combine(destFullPath, filename);

                            //From firmModel or from upsideomodel
                            if (missionDoc.IsInformationCardFromModel)
                            {
                                //Merge pdf
                                filename = missionDoc.CustomerProspect.FirmInstitution.LegalInformationFile;
                                string uploadedDoc = System.IO.Path.Combine(firmDocumentPath, filename);

                                if (System.IO.File.Exists(uploadedDoc))
                                {
                                    Upsilab.Business.Configuration.FirmInstitutionPdfGeneration.GenerateDERByMerge(missionDoc.CustomerProspect.FirmInstitution, uploadedDoc, destFILFilePath, false, out pageCount);
                                }
                                else
                                {
                                    error = LanguageData.GetContent("le_pdf_doc_entree_en_relation_n_existe_pas");
                                }

                            }
                            else
                            {
                                //From upsideo model => generate it
                                pageCount = Upsilab.Business.Configuration.FirmInstitutionPdfGeneration.GenerateDER(missionDoc.CustomerProspect.FirmInstitution, missionDoc.CustomerProspect.idCustomer, destFILFilePath, false);
                            }

                            if (!System.IO.File.Exists(destFILFilePath))
                            {
                                error = LanguageData.GetContent("le_pdf_doc_entree_en_relation_n_existe_pas");
                            }
                            else
                            {
                                //B- Prepare object to send to signature
                                signatureParameters = new SignatureParameters()
                                {
                                    page = (pageCount > 0) ? pageCount : 16, //DER : 14pages
                                    x_adviser = 33,
                                    x_customer = 120,
                                    y = 177
                                };

                                DocumentToSign docDER = new DocumentToSign()
                                {
                                    Label = LanguageData.GetContent("doc_entree_en_relation"),
                                    Description = LanguageData.GetContent("doc_entree_en_relation"),
                                    PathFilename = destFILFilePath,
                                    Type = DTPClient.DocumentTypes.APPENDIX2.ToString(),
                                    SignatureParameters = signatureParameters
                                };

                                documentsToSign.Add(docDER);
                            }
                        }
                    }
                    #endregion

                    //Signature
                    if (documentsToSign.Count == 0)
                    {
                        error = LanguageData.GetContent("aucun_doc_a_signer_veuillez");
                    }

                    if (string.IsNullOrEmpty(error))
                    {
                        // Sign the document mission
                        Upsilab.Data.Model.User userAdviser = (missionDoc.User != null) ? missionDoc.User : Upsilab.Business.Utility.SessionManager.GetUserSession();
                        urlIHM_Dictao = SignatureDocumentBL_4_1.SignMissionDocumentByAdviser(missionDoc.idMissionDocument, documentsToSign, userAdviser);
                    }
                }
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                error = ex.Message;
            }

            if (!string.IsNullOrEmpty(error))
            {
                string missionDocLabel = (missionDoc.IsLetter) ? LanguageData.GetContent("lettre_de_mission") : LanguageData.GetContent("rapport_de_mission");

                SignatureModel signatureModel = new SignatureModel()
                {
                    H1Title = (missionDoc.IsLetter) ? LanguageData.GetContent("lettre_de_mission") : LanguageData.GetContent("rapport_de_mission"),
                    HeadTitle = string.Format("Signature {0}", missionDocLabel),
                    ErrorMessage = error
                };

                return View("AllerSignature", signatureModel);
            }
            else
            {
                return Redirect(urlIHM_Dictao);
            }

        }
        public ActionResult SignerDocumentMissionParClient(string id)
        {
            string error = string.Empty;
            string urlIHM_Dictao = string.Empty;
            int pageCount = 0;
            MissionDocument missionDoc = new MissionDocument();

            try
            {
                // Id latest mission document = id in parameter                
                if (string.IsNullOrEmpty(id))
                {
                    error = LanguageData.GetContent("selectionner_un_doc_a_signer");
                }
                else
                {
                    missionDoc = MissionDocumentBL.GetMissionDocumentById(new Guid(id));

                    if (missionDoc == null)
                    {
                        error = LanguageData.GetContent("selectionner_un_doc_a_signer");
                    }
                    else
                    {
                        // Sign the mission document (Customer signs secondly)
                        urlIHM_Dictao = SignatureDocumentBL_4_1.SignMissionDocumentByCustomer(missionDoc.idMissionDocument, string.Empty, pageCount);
                    }
                }
            }
            catch (Exception ex)
            {
                //Log
                error = ex.Message;
            }

            if (!string.IsNullOrEmpty(error))
            {
                string missionDocLabel = (missionDoc.IsLetter) ? LanguageData.GetContent("lettre_de_mission") : LanguageData.GetContent("rapport_de_mission");

                SignatureModel signatureModel = new SignatureModel()
                {
                    H1Title = (missionDoc.IsLetter) ? LanguageData.GetContent("lettre_de_mission") : LanguageData.GetContent("rapport_de_mission"),
                    HeadTitle = string.Format(LanguageData.GetContent("signature_"), missionDocLabel),
                    ErrorMessage = error
                };

                return View("AllerSignature", signatureModel);
            }
            else
            {
                return Redirect(urlIHM_Dictao);
            }
        }
        public ActionResult SignerDERParConseiller(string id)
        {
            string error = string.Empty;
            string urlIHM_Dictao = string.Empty;
            int pageCount = 0;
            DER der = new DER();
            List<DocumentToSign> documentsToSign = new List<DocumentToSign>();

            try
            {
                // Id mission doc = id in parameter                
                der = DerBL.GetDERById(new Guid(id));

                if (der == null)
                {
                    error = LanguageData.GetContent("selectionner_un_doc_a_signer");
                }
                else
                {
                    CustomerProspect customer = der.CustomerProspect;
                    SignatureParameters signatureParameters = null;

                    #region 1- Fiche d'information legale FIL => DER
                    //A- PDF ?
                    pageCount = 0;
                    string docType = ElectronicSafeDocumentBL.DocumentType.FIL.ToString();
                    string firmDocumentPath = string.Format(@"{0}\FirmInstitution\FI_{1}", Server.MapPath("~/uploads"), der.CustomerProspect.FirmInstitution.idFirmInstitution);
                    string destFullPath = ElectronicSafeDocumentBL.BuildClientUploadDocumentPath(docType, customer);
                    string filename = ElectronicSafeDocumentBL.BuildDocumentName(docType, der.idDer, false);

                    string destFILFilePath = System.IO.Path.Combine(destFullPath, filename);

                    //From firmModel or from upsideomodel
                    if (der.IsDerFromModel)
                    {
                        //Merge pdf
                        filename = der.CustomerProspect.FirmInstitution.LegalInformationFile;
                        string uploadedDoc = System.IO.Path.Combine(firmDocumentPath, filename);

                        if (System.IO.File.Exists(uploadedDoc))
                        {
                            Upsilab.Business.Configuration.FirmInstitutionPdfGeneration.GenerateDERByMerge(der.CustomerProspect.FirmInstitution, uploadedDoc, destFILFilePath, false, out pageCount);
                        }
                        else
                        {
                            error = LanguageData.GetContent("le_pdf_doc_entree_en_relation_n_existe_pas");
                        }

                    }
                    else
                    {
                        //From upsideo model => generate it
                        pageCount = Upsilab.Business.Configuration.FirmInstitutionPdfGeneration.GenerateDER(der.CustomerProspect.FirmInstitution, der.CustomerProspect.idCustomer, destFILFilePath, false);
                    }

                    if (!System.IO.File.Exists(destFILFilePath))
                    {
                        error = LanguageData.GetContent("le_pdf_doc_entree_en_relation_n_existe_pas");
                    }
                    else
                    {
                        //B- Prepare object to send to signature
                        signatureParameters = new SignatureParameters()
                        {
                            page = (pageCount > 0) ? pageCount : 16, //DER : 14pages
                            x_adviser = 33,
                            x_customer = 120,
                            y = 177
                        };

                        DocumentToSign docDER = new DocumentToSign()
                        {
                            Label = LanguageData.GetContent("doc_entree_en_relation"),
                            Description = LanguageData.GetContent("doc_entree_en_relation"),
                            PathFilename = destFILFilePath,
                            Type = DTPClient.DocumentTypes.CONTRACT.ToString(),
                            SignatureParameters = signatureParameters
                        };

                        documentsToSign.Add(docDER);
                    }

                    #endregion

                    #region 2- Presentation etablissement
                    if (der.AttachPresentation)
                    {
                        //A- PDF ?
                        pageCount = 0;
                        docType = ElectronicSafeDocumentBL.DocumentType.BS.ToString();
                        firmDocumentPath = string.Format(@"{0}\FirmInstitution\FI_{1}", Server.MapPath("~/uploads"), der.CustomerProspect.FirmInstitution.idFirmInstitution);
                        destFullPath = ElectronicSafeDocumentBL.BuildClientUploadDocumentPath(docType, customer);
                        filename = ElectronicSafeDocumentBL.BuildDocumentName(docType, der.idDer, false);

                        string destBSFilePath = System.IO.Path.Combine(destFullPath, filename);

                        //From firmModel or from upsideomodel
                        if (der.IsPresentationFromModel)
                        {
                            //Merge pdf
                            filename = der.CustomerProspect.FirmInstitution.PresentationFile;
                            string uploadedDoc = System.IO.Path.Combine(firmDocumentPath, filename);

                            if (System.IO.File.Exists(uploadedDoc))
                            {
                                Upsilab.Business.Configuration.FirmInstitutionPdfGeneration.GeneratePresentationByMerge(der.CustomerProspect.FirmInstitution, uploadedDoc, destBSFilePath, false, out pageCount);
                            }
                            else
                            {
                                error = LanguageData.GetContent("pdf_presentation_etab_n_existe_pas_ou");
                            }

                        }
                        else
                        {
                            //From upsideo model => generate it
                            pageCount = Upsilab.Business.Configuration.FirmInstitutionPdfGeneration.GeneratePresentation(der.CustomerProspect.FirmInstitution, destBSFilePath, false);
                        }

                        if (!System.IO.File.Exists(destBSFilePath))
                        {
                            error = LanguageData.GetContent("pdf_presentation_etab_n_existe_pas_ou");
                        }
                        else
                        {
                            //B- Prepare object to send to signature
                            signatureParameters = new SignatureParameters()
                            {
                                // page = (pageCount > 0) ? pageCount : 6, //BS : 6pages
                                page = pageCount,
                                x_adviser = 33,
                                x_customer = 120,
                                y = 177
                            };

                            DocumentToSign docPE = new DocumentToSign()
                            {
                                Label = LanguageData.GetContent("presentation_de_l_etab"),
                                Description = LanguageData.GetContent("presentation_de_l_etab"),
                                PathFilename = destBSFilePath,
                                Type = DTPClient.DocumentTypes.APPENDIX1.ToString(),
                                SignatureParameters = signatureParameters
                            };

                            documentsToSign.Add(docPE);
                        }
                    }
                    #endregion

                    //Signature
                    if (documentsToSign.Count == 0)
                    {
                        error = LanguageData.GetContent("aucun_doc_a_signer_veuillez");
                    }

                    if (string.IsNullOrEmpty(error))
                    {
                        // Sign the document mission
                        Upsilab.Data.Model.User userAdviser = (der.User != null) ? der.User : Upsilab.Business.Utility.SessionManager.GetUserSession();
                        urlIHM_Dictao = SignatureDocumentBL_4_1.SignDERByAdviser(der.idDer, documentsToSign, userAdviser);
                    }
                }
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                error = ex.Message;
            }

            if (!string.IsNullOrEmpty(error))
            {
                SignatureModel signatureModel = new SignatureModel()
                {
                    H1Title = Business.Language.LanguageContentBL.Translate("der_title"),
                    HeadTitle = string.Format("Signature {0}", Business.Language.LanguageContentBL.Translate("der_title")),
                    ErrorMessage = error
                };

                return View("AllerSignature", signatureModel);
            }
            else
            {
                return Redirect(urlIHM_Dictao);
            }

        }
        public ActionResult Cancel(string id)
        {
            DER der = null;
            string error = string.Empty;
            string derDocLabel = "Document";

            try
            {
                //Get mission document
                der = DerBL.GetDERById(new Guid(id));
                if (der == null)
                {
                    error = LanguageDataReg.GetContent("selectionnez_doc_a_annuler");
                }
                else if (der.Status == RegulatoryDocumentModel.Status.Canceled.ToString()) // check if already canceled
                {
                    error = string.Format(LanguageDataReg.GetContent("doc_dejà_annule"), derDocLabel);
                }
                else
                {
                    der.Status = RegulatoryDocumentModel.Status.Canceled.ToString();
                    DerBL.Update(der);

                    //update du customer status
                    CustomerProspect cust = CustomerProspectBL.GetCustomerProspectById(der.idCustomerProspect);
                    DER doc = DerBL.GetLatestDERByIdCustomer(cust.idCustomer);
                    cust.DerStatus = doc != null ? doc.Status : string.Empty;
                    CustomerProspectBL.Update(cust);
                }
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }

            SignatureModel signatureModel = new SignatureModel()
            {
                HeadTitle = LanguageDataReg.GetContent("annulation_doc_mission"),
                H1Subtitle = LanguageDataReg.GetContent("annulation"),
                H1Title = (der != null) ? (LanguageData.GetContent("der")) : derDocLabel
            };

            if (!string.IsNullOrEmpty(error))
            {
                signatureModel.ContentTitle = LanguageDataReg.GetContent("erreur_annulation");
                signatureModel.ContentMessage = error;
            }
            else
            {
                signatureModel.ContentTitle = LanguageDataReg.GetContent("annulation_ok");
                signatureModel.ContentMessage = LanguageDataReg.GetContent("doc_bien_annulé");
            }

            return View("Message", signatureModel);
        }