//static UpsilabEntities context = new UpsilabEntities();

        public static void InsertSignatureTransaction(SignatureTransaction signatureTransaction)
        {
            using (UpsilabEntities context = new UpsilabEntities())
            {
                context.SignatureTransaction.AddObject(signatureTransaction);
                context.SaveChanges();
            }
        }
 public static void UpdateSignatureTransaction(SignatureTransaction signatureTransaction)
 {
     using (UpsilabEntities context = new UpsilabEntities())
     {
         context.SignatureTransaction.Attach(signatureTransaction);
         context.ObjectStateManager.ChangeObjectState(signatureTransaction, System.Data.EntityState.Modified);
         context.SaveChanges();
     }
 }
        public ActionResult InsertSignatureTransaction(SignatureTransaction _SignatureTransaction)
        {
            try
            {
                _SignatureTransaction.idSignatureTransaction = GuidHelper.GenerateGuid();
                _SignatureTransaction.DateCreated = DateTime.Now;
                _SignatureTransaction.idUserCreated = SessionManager.GetUserSession().idUser;
                _SignatureTransaction.Status = SignatureTransactionBL.Status.Created.ToString();
                SignatureTransactionBL.InsertSignatureTransaction(_SignatureTransaction);


                //Créer signataire par défaut

                var currentUSer = SessionManager.GetUserSession();
                Signatory _defaultsSignatory = new Signatory()
                {
                    idSignatory = GuidHelper.GenerateGuid(),
                    DateCreated = DateTime.Now,
                    Email = currentUSer.UserEmail,
                    idUser = currentUSer.idUser,
                    Mobile = currentUSer.UserMobilePhone,
                    Name = currentUSer.UserName,
                    Firstname = currentUSer.UserFirstName,
                    idSignatureTransaction = _SignatureTransaction.idSignatureTransaction
                };
                SignatureTransactionBL.InsertSignatory(_defaultsSignatory);


                return Content("Ok");
            }
            catch (Exception ex)
            {
                Business.Log.Log.AppendException(ex);
                return Content(ex.Message);
            }
        }
        public static string GetTransactionLog(SignatureTransaction signatureTransaction, bool isConvention, out string transactionStepTitle)
        {
            var languageContent = PageLanguageHelper.GetLanguageContent("User", "Convention");
            var lstStatusLogs = signatureTransaction.SignatureTransactionStatusLog.OrderBy(s => s.DateCreated).ToList();
            var statusLog = string.Empty;
            transactionStepTitle = string.Empty; //or "Approbation" or "Signature"

            //1- Signé par les 2
            if (signatureTransaction.Status == DocumentBL.Status.Completed.ToString())
            {
                var sdgSignatory = signatureTransaction.Signatory.FirstOrDefault(x => x.Role == SignatoryBL.Roles.SDG.ToString());
                var sdgSignatoryUser = (sdgSignatory == null) ? new Data.Model.User() : sdgSignatory.User;
                
                var cgpSignatory = signatureTransaction.Signatory.FirstOrDefault(x => x.Role == SignatoryBL.Roles.CGP.ToString());
                var cgpSignatoryUser = (cgpSignatory == null) ? new Data.Model.User() : cgpSignatory.User;

                //Signature manuelle
                if (sdgSignatory.DateSignature == null)
                {
                    //Get date signature from FirmInstitutionCalculatedData
                    var latestTransactionInfos = GetLatestInfos(signatureTransaction.idFirmInstitution.Value);
                    var signatureDate = (isConvention) ? latestTransactionInfos.ConventionDateUpdated : latestTransactionInfos.AvenantDateUpdated;
                    
                    statusLog += string.Format("<li>{0} {1}</li>", languageContent.GetContent("signed_on"), signatureDate.Value.ToString("dd/MM/yyyy"));
                }
                else
                {
                    var sdgSignature = lstStatusLogs.Where(l => l.idDocumentStatus == 5).FirstOrDefault();
                    if (sdgSignature != null)
                    {
                        statusLog += string.Format("<li>{0}<br />{1} {2}</li>", string.Format("{0} &laquo; {1} {2} &raquo;", languageContent.GetContent("signed_by"), sdgSignatoryUser.UserName, sdgSignatoryUser.UserFirstName), languageContent.GetContent("le"), sdgSignature.DateCreated.ToString("dd/MM/yyyy"));
                    }

                    var cgpSignature = lstStatusLogs.Where(l => l.idDocumentStatus == 6).FirstOrDefault();
                    if (cgpSignature != null)
                    {
                        statusLog += string.Format("<li>{0}<br />{1} {2}</li>", string.Format("{0} &laquo; {1} {2} &raquo;", languageContent.GetContent("signed_by"), cgpSignatoryUser.UserName, cgpSignatoryUser.UserFirstName), languageContent.GetContent("le"), cgpSignature.DateCreated.ToString("dd/MM/yyyy"));
                    }
                }

                transactionStepTitle = languageContent.GetContent("signatures");
            }

            //2- En attente signature SDG - ce cas n'existe plus puisque désormais la SDG signe en premier
            else if (signatureTransaction.Status == DocumentBL.Status.WaitingForUserSignature.ToString())
            {
                var cgpSignature = lstStatusLogs.Where(l => l.idDocumentStatus == 11).FirstOrDefault();
                if (cgpSignature != null)
                {
                    statusLog += string.Format("<li>{0}<br />{1} {2}</li>", languageContent.GetContent("signed_by_client"), languageContent.GetContent("le"), cgpSignature.DateCreated.ToString("dd/MM/yyyy"));
                }
                statusLog += string.Format("<li>{0}</li>", languageContent.GetContent("waiting_for_user_signature"));

                transactionStepTitle = languageContent.GetContent("signatures");
            }

            //3- En attente signature CGP
            else if (signatureTransaction.Status == DocumentBL.Status.WaitingForClientSignature.ToString())
            {
                var sdgSignature = lstStatusLogs.Where(l => l.idDocumentStatus == 9).FirstOrDefault();
                var sdgSignatoryUser = signatureTransaction.Signatory.FirstOrDefault(x => x.Role == SignatoryBL.Roles.SDG.ToString()).User;

                if (sdgSignature != null)
                {
                    statusLog += string.Format("<li>{0}<br />{1} {2}</li>", string.Format("{0} &laquo; {1} {2} &raquo;", languageContent.GetContent("signed_by"), sdgSignatoryUser.UserName, sdgSignatoryUser.UserFirstName), languageContent.GetContent("le"), sdgSignature.DateCreated.ToString("dd/MM/yyyy"));
                }

                statusLog += string.Format("<li>{0} <br />&laquo; {1} &raquo;</li>", languageContent.GetContent("waiting_for_client_signature"), signatureTransaction.FirmInstitution.FirmInstitutionName);

                transactionStepTitle = languageContent.GetContent("signatures");
            }

            //4- Approuvé par le CGP
            else if (signatureTransaction.Status == DocumentBL.Status.Approved.ToString())
            {
                var cgpApproval = lstStatusLogs.Where(l => l.idDocumentStatus == 10).FirstOrDefault();
                if (cgpApproval != null)
                {
                    statusLog += string.Format("<li>{0}<br />{1} {2}</li>", languageContent.GetContent("approved"), languageContent.GetContent("on"), cgpApproval.DateCreated.ToString("dd/MM/yyyy"));
                }

                transactionStepTitle = languageContent.GetContent("approval");
            }

            //5- En attente approbation CGP
            else if (signatureTransaction.Status == DocumentBL.Status.WaitingForClientApproval.ToString())
            {
                statusLog += string.Format("<li>{0} <br /> &laquo; {1} &raquo;</li>", languageContent.GetContent("waiting_for_client_approval"), signatureTransaction.FirmInstitution.FirmInstitutionName);

                transactionStepTitle = languageContent.GetContent("approval");
            }

            //6- Rejeté par le CGP
            else if (signatureTransaction.Status == DocumentBL.Status.Rejected.ToString())
            {
                var cgpApproval = lstStatusLogs.Where(l => l.idDocumentStatus == 12).FirstOrDefault();
                if (cgpApproval != null)
                {
                    statusLog += string.Format("<li>{0}<br />{1} {2}</li>", languageContent.GetContent("avenant_rejete"), languageContent.GetContent("on"), cgpApproval.DateCreated.ToString("dd/MM/yyyy"));
                }

                transactionStepTitle = languageContent.GetContent("approval");
            }



            //7- Emails de rappel (cas approbation et cas signature)
            List<string> lstDateReminderEmails = DocumentSignatureTransactionBL.GetDatesReminderEmail(signatureTransaction);
            if (lstDateReminderEmails.Count > 0)
            {
                statusLog += string.Format("<li>{0}</li>", languageContent.GetContent("reminder_emails"));

                lstDateReminderEmails.ForEach(strDate =>
                {
                    statusLog += string.Format("{0} <br />", strDate);
                });
            }

            return statusLog;
        }
        public static List<string> GetDatesReminderEmail(SignatureTransaction transaction)
        {
            using (var db = new UpsilabEntities())
            {
                var dates = new List<string>();

                if (transaction != null)
                {
                    //Approval or signature
                    bool isApproval = (transaction.Status == DocumentBL.Status.WaitingForClientApproval.ToString()) ? true : false;

                    //Champ DatesReminderEmail ?
                    var lstDatesReminderEmail = (transaction.DatesReminderEmail != null) ? transaction.DatesReminderEmail.JsonToDatesReminderEmail() : new List<DateReminderEmail>();
                    var step = (isApproval) ? SignatureTransactionStep.APPROVAL.ToString().ToLower() : SignatureTransactionStep.SIGNATURE.ToString().ToLower();
                    var dateReminderEmail = lstDatesReminderEmail.Where(d => d.Step.ToLower() == step).FirstOrDefault();

                    if (dateReminderEmail != null && dateReminderEmail.Dates != null)
                    {
                        dates = dateReminderEmail.Dates;
                    }
                }

                return dates;
            }
        }
        public static SignatureTransaction CreateTransaction(Guid idUserCreated, Guid idFirmInstitutionCGP,  SignatureTransactionType transactionType)
        {
            using (UpsilabEntities context = new UpsilabEntities())
            {
                context.Connection.Open();
                using (var dbContextTransaction = context.Connection.BeginTransaction())
                {
                    try
                    {
                        //1- Create transaction ---------------------------------------------------------
                        var transaction = new SignatureTransaction
                        {
                            idFirmInstitution = idFirmInstitutionCGP,
                            idSignatureTransaction = GuidHelper.GenerateGuid(),
                            idUserCreated = idUserCreated,
                            SignatureTransactionType = transactionType.ToString(),
                            DateCreated = DateTime.Now,
                            Status = DocumentBL.Status.InProgress.ToString(),
                            DocumentsInitialized = false,
                        };
                       
                        context.SignatureTransaction.AddObject(transaction);
                        context.SaveChanges();

                        //2- Signature Transaction Status ----------------------------------------------- 
                        var status = DocumentStatusBL.GetByCode(DocumentBL.Status.InProgress.ToString());
                        SignatureTransactionStatutBL.Add(transaction.idSignatureTransaction, status.idDocumentStatus, context);

                        //Update status in FirmInstitutionCalculatedData
                        var calculatedData = FirmInstitutionBL.GetCalculatedData(idFirmInstitutionCGP);
                        if (calculatedData == null)
                        {
                            calculatedData = new FirmInstitutionCalculatedData()
                            {
                                idFirmInstitution = idFirmInstitutionCGP
                            };
                        }

                        if (transactionType == SignatureTransactionType.CONVENTION)
                        {
                            calculatedData.ConventionLatestStatus = DocumentBL.Status.InProgress.ToString();
                        }
                        else if (transactionType == SignatureTransactionType.AVENANT)
                        {
                            calculatedData.AvenantLatestStatus = DocumentBL.Status.InProgress.ToString();
                        }

                        FirmInstitutionBL.SaveCalculatedData(calculatedData, context);

                        //3- Add the 4 documents automatically : CPART, CINT, CCOURT, CMD ---------------
                        if (transactionType == SignatureTransactionType.CONVENTION)
                        {
                            var listDocumentTypes = GetDocumentTypes(SignatureTransactionType.CONVENTION);
                            if (listDocumentTypes != null)
                                DocumentBL.AddDocuments(transaction.idSignatureTransaction, listDocumentTypes, context);
                        }

                        //4- Create signatory ------------------------------------------------------------
                        //CGP
                        var firmAdviser = FirmInstitutionAdviserBL.GetDefaultSignatory(idFirmInstitutionCGP);
                        if (firmAdviser != null)
                        {
                            SignatoryBL.CreateSignatory(transaction.idSignatureTransaction, firmAdviser.User.idUser, SignatoryBL.Roles.CGP.ToString(), context);
                        }

                        //SDG
                        SignatoryBL.CreateSignatory(transaction.idSignatureTransaction, idUserCreated, SignatoryBL.Roles.SDG.ToString(), context);
                      
                        //5- Commit transaction ----------------------------------------------------------
                        dbContextTransaction.Commit();

                        //6- Reload transaction ----------------------------------------------------------
                        transaction = DocumentSignatureTransactionBL.GetTransactionByCGP(idFirmInstitutionCGP, transactionType.ToString());

                        return transaction;
                    }
                    catch (Exception e)
                    {
                        dbContextTransaction.Rollback();
                        Log.Log.AppendException(e);
                        throw new Exception("SavingError");
                    }
                }
            }
        }
        public static SignatureTransaction UpdateTransactionStatus(Guid pTransactionId, DocumentBL.Status pStatus, DateTime? dateUpdated = null)
        {
            string status = pStatus.ToString();
            var transaction = new SignatureTransaction();

            using (UpsilabEntities context = new UpsilabEntities())
            {
                context.Connection.Open();
                using (var dbContextTransaction = context.Connection.BeginTransaction())
                {
                    try
                    {
                        //1- Update Transaction status
                        transaction = context.SignatureTransaction.FirstOrDefault(x => x.idSignatureTransaction == pTransactionId);
                        transaction.Status = status;

                        //2- Update latest transaction status
                        var calculatedData = FirmInstitutionBL.GetCalculatedData(transaction.idFirmInstitution.Value);
                        if (calculatedData != null)
                        {
                            if (transaction.SignatureTransactionType == SignatureTransactionType.CONVENTION.ToString())
                            {
                                calculatedData.ConventionLatestStatus = status;
                                if (pStatus == DocumentBL.Status.Completed)
                                {
                                    calculatedData.ConventionDateUpdated = (dateUpdated == null) ? DateTime.Now : dateUpdated;
                                    calculatedData.HasDataInCoffre = true;
                                    calculatedData.AvenantLatestStatus = DocumentBL.Status.Created.ToString(); //activer le bouton "Avenant"
                                }
                            }
                            else if (transaction.SignatureTransactionType == SignatureTransactionType.AVENANT.ToString())
                            {
                                calculatedData.AvenantLatestStatus = status;
                                if (pStatus == DocumentBL.Status.Completed)
                                {
                                    calculatedData.AvenantDateUpdated = (dateUpdated == null) ? DateTime.Now : dateUpdated;
                                    calculatedData.HasDataInCoffre = true;
                                }
                            }

                            FirmInstitutionBL.SaveCalculatedData(calculatedData, context);
                        }

                        //If "InProgress", clear email de rappel ?
                        if (pStatus == DocumentBL.Status.InProgress)
                        {
                            transaction.DateSignaturesObjet = null;
                            transaction.DatesReminderEmail = null;
                        }


                        //Log transaction status
                        var documentStatus = DocumentStatusBL.GetByCode(status);

                        var signatureTransactionStatusLog = new SignatureTransactionStatusLog
                        {
                            DateCreated = DateTime.Now,
                            idDocumentStatus = documentStatus.idDocumentStatus,
                            idSignatureTransaction = pTransactionId
                        };

                        context.SignatureTransactionStatusLog.AddObject(signatureTransactionStatusLog);
                        context.SaveChanges();
                        //
                        //
                        //
                        dbContextTransaction.Commit();
                    }
                    catch (Exception e)
                    {
                        dbContextTransaction.Rollback();
                        Log.Log.AppendException(e);
                        throw new Exception("SavingError");
                    }
                }
            }

            return transaction;
        }
        private void SaveSignedDocumentToServer(SignatureTransaction signatureTransaction, CoffreFortViewModel coffreViewModel, HttpPostedFileBase uploadedFile)
        {
            var lstDateSignatureObjects = new List<DateSignatureObjet>();

            //CGP
            if (!string.IsNullOrEmpty(coffreViewModel.DateSignatureCGP))
            {
                var dateSignature = new DateSignatureObjet()
                {
                    Role = SignatoryBL.Roles.CGP.ToString(),
                    DateSignature = Convert.ToDateTime(coffreViewModel.DateSignatureCGP)
                };

                lstDateSignatureObjects.Add(dateSignature);
            }

            //Titulaire 1
            if (!string.IsNullOrEmpty(coffreViewModel.DateSignatureTitulaire1))
            {
                var dateSignature = new DateSignatureObjet()
                {
                    Role = SignatoryBL.Roles.TITULAIRE1.ToString(),
                    DateSignature = Convert.ToDateTime(coffreViewModel.DateSignatureTitulaire1)
                };

                lstDateSignatureObjects.Add(dateSignature);
            }

            //Titulaire 2
            if (!string.IsNullOrEmpty(coffreViewModel.DateSignatureTitulaire2))
            {
                var dateSignature = new DateSignatureObjet()
                {
                    Role = SignatoryBL.Roles.TITULAIRE2.ToString(),
                    DateSignature = Convert.ToDateTime(coffreViewModel.DateSignatureTitulaire2)
                };

                lstDateSignatureObjects.Add(dateSignature);
            }

            if (uploadedFile != null && uploadedFile.ContentLength > 0)
            {
                var fileName = System.IO.Path.GetFileName(uploadedFile.FileName);
                var documentRelativePath = string.Empty;
                var ext = Path.GetExtension(uploadedFile.FileName);
                var documentFullPath = ElectronicSafeDocumentBL.BuildSubscriptionFileDocumentsPath(coffreViewModel.IdSubscriptionFile, true, out documentRelativePath);
                var filename = ElectronicSafeDocumentBL.BuildDocumentNameWithExtension(ElectronicSafeDocumentBL.DocumentType.SF.ToString(), coffreViewModel.IdSubscriptionFile.ToString("D8"), ext);


                // 1- Sauvegarde dans le repertoire
              //  documentFullPath = documentFullPath.Replace(@"fournisseur\uploads", @"user\uploads");
                string filePath = System.IO.Path.Combine(documentFullPath, filename);
                uploadedFile.SaveAs(filePath);

                // 2- Sauvegarde dans la base données de données
                // 2-a- table "Document"
                var document = DocumentBL.GetDocumentByIdSignatureTransaction(signatureTransaction.idSignatureTransaction, ElectronicSafeDocumentBL.DocumentType.SF.ToString());
                document.Location = documentRelativePath;
                document.Name = filename;
                DocumentBL.UpdateDocument(document);

                // 2-b- table "SignatureTransaction"
                signatureTransaction.Status = DocumentBL.Status.Saved.ToString();
                signatureTransaction.DateSignaturesObjet = lstDateSignatureObjects.DateSignatureObjectToJson();

                SignatureTransactionBL.UpdateSignatureTransaction(signatureTransaction);
            }
        }
        public ActionResult UploadDocumentFile(SignatureTransaction _signatureTrans, HttpPostedFileBase uploadFile)
        {
            var LanguageData = PageLanguageHelper.GetLanguageContent("User", "PDFSignature");
            DocumentType docType = DocumentTypeBL.GetDocumentTypeByCode(ElectronicSafeDocumentBL.DocumentType.SIGN.ToString());
            string error = string.Empty;
            Upsilab.Data.Model.User currentUser = SessionManager.GetUserSession();

            try
            {
                if (uploadFile != null)
                {
                    if (uploadFile.ContentLength > 0 && FileManager.IsPDF(uploadFile.ContentType))
                    {
                        string documentPath = string.Empty;
                        documentPath = ElectronicSafeDocumentBL.BuildUserDocumentPath(docType.DocumentNamePrefix, currentUser);

                        if (!Directory.Exists(Server.MapPath("~/uploads")))
                            Directory.CreateDirectory(Server.MapPath("~/uploads"));

                        string documentFullPath = Path.Combine(Server.MapPath("~/uploads"), documentPath);
                        if (!Directory.Exists(documentFullPath))
                            Directory.CreateDirectory(documentFullPath);
                        string filename = ElectronicSafeDocumentBL.BuildDocumentName(docType.DocumentNamePrefix, currentUser.idUser, uploadFile.FileName);

                        // 1- Sauvegarde dans le repertoire
                        string filePath = System.IO.Path.Combine(documentFullPath, filename);
                        uploadFile.SaveAs(filePath);

                        // 2 - Sauvegarde dans la table Document
                        PdfReader pdfReader = new PdfReader(filePath);
                        int numberOfPages = pdfReader.NumberOfPages;

                        Document newDoc = new Document();
                        newDoc.idDocument = GuidHelper.GenerateGuid();
                        newDoc.DocumentType = docType.ToString().ToUpper();
                        newDoc.idSignatureTransaction = _signatureTrans.idSignatureTransaction;
                        newDoc.Name = filename;
                        newDoc.Location = documentPath;
                        newDoc.PageCount = numberOfPages;
                        newDoc.DateCreated = DateTime.Now;

                        SignatureTransactionBL.InsertDocument(newDoc);
                    }
                    else
                    {
                        ViewBag.DocumentError = ViewBag.DocumentError + LanguageData.GetContent("fichier_pdf_requis");
                    }
                }
                else
                {
                    ViewBag.DocumentError = ViewBag.DocumentError + LanguageData.GetContent("please_add_file");
                }
            }
            catch (Exception ex)
            {
                Business.Log.Log.AppendException(ex);
                ViewBag.DocumentError = ViewBag.DocumentError + ex.Message;
            }

            return RedirectToAction("Transaction");
        }