public ContractViewModel ArchiveContract(ContractViewModel data)
        {
            if (data != null)
            {
                if (data.ContractType == (int)ContractType.Proposal)
                {
                    Contratos contract = DBContracts.GetByIdAndVersion(data.ContractNo, data.VersionNo);

                    if (contract != null)
                    {
                        try
                        {
                            //Create new contract and update old
                            contract.UtilizadorModificação = changedByUserName;
                            contract.Arquivado             = true;
                            DBContracts.Update(contract);

                            contract = DBContracts.ParseToDB(data);

                            contract.NºVersão              = contract.NºVersão + 1;
                            contract.UtilizadorCriação     = changedByUserName;
                            contract.UtilizadorModificação = "";
                            if (contract.TipoContrato == 1)
                            {
                                contract.NºProposta = "";
                            }

                            contract.DataHoraModificação = null;
                            List <int> finishingStates = new List <int>()
                            {
                                4, 5, 10
                            };
                            if (contract.Estado.HasValue)
                            {
                                if (finishingStates.Contains(contract.Estado.Value))
                                {
                                    contract.Arquivado = true;
                                }
                                else
                                {
                                    contract.Arquivado = false;
                                }
                            }
                            else
                            {
                                contract.Arquivado = false;
                            }

                            //if (data.ActionCode.HasValue && data.ActionCode.Value == 2)
                            //{
                            //    contract.Estado = 1;
                            //    contract.DataHoraModificação = DateTime.Now;
                            //    contract.UtilizadorModificação = changedByUserName;
                            //}

                            DBContracts.Create(contract);

                            //Duplicate Contract Lines
                            List <LinhasContratos> contractLines = DBContractLines.GetAllByActiveContract(data.ContractNo, data.VersionNo);

                            contractLines.ForEach(x =>
                            {
                                x.NºLinha  = 0;
                                x.NºVersão = contract.NºVersão;
                                DBContractLines.Create(x);
                            });

                            //data.VersionNo = contract.NºVersão;
                            data             = DBContracts.ParseToViewModel(contract, string.Empty, string.Empty);
                            data.eReasonCode = 1;
                            data.eMessage    = "Arquivado com sucesso.";
                        }
                        catch (Exception)
                        {
                            data.eReasonCode = 2;
                            data.eMessage    = "Ocorreu um erro ao arquivar.";
                        }
                    }
                }
                else
                {
                    data.eReasonCode = 2;
                    data.eMessage    = "O tipo de contrato é inválido.";
                }
            }
            else
            {
                data.eReasonCode = 2;
                data.eMessage    = "Ocorreu um erro ao arquivar.";
            }
            return(data);
        }
        public ContractViewModel SetStatus(ContractViewModel contractToUpdate)
        {
            if (contractToUpdate != null)
            {
                if (contractToUpdate.ContractType == (int)ContractType.Proposal)
                {
                    Contratos updatedContract        = new Contratos();
                    Contratos contractWithoutChanges = DBContracts.GetByIdAndVersion(contractToUpdate.ContractNo, contractToUpdate.VersionNo);

                    if (contractWithoutChanges != null)
                    {
                        if (contractWithoutChanges.Estado != contractToUpdate.Status)
                        {
                            //handle status change
                            switch (contractToUpdate.Status)
                            {
                            case 1:     //Alterar para Aberta
                                        /*
                                         * Fazer arquivo
                                         * Preencher estado com ‘Aberta’
                                         */
                                contractToUpdate = ArchiveContract(contractToUpdate);
                                break;

                            //case 2: //Alterada para enviada
                            //        /*
                            //         * Fazer arquivo
                            //         * Preencher estado com ‘Enviada’
                            //         * Preencher ‘Data Envio’ com data indicada pelo utilizador.Deve ser criado um mecanismo tipo ‘PopUp’ para indicação dessa data.
                            //         */
                            case 3:     //Alterada para Revista
                                        /*
                                         * Preencher estado com ‘Revista’
                                         * Fazer arquivo
                                         * Preencher estado com ‘Aberta’
                                         * Incrementar 1 na versão da Proposta
                                         * Limpar Data de Estado
                                         * Preencher Data alteração com data do sistema
                                         * Alterar versão nas Linhas da Proposta para versão colocada em cabeçalho
                                         */
                                updatedContract                    = DBContracts.Update(DBContracts.ParseToDB(contractToUpdate));
                                updatedContract.Estado             = 3;
                                updatedContract.DataEstadoProposta = null;
                                contractToUpdate                   = ArchiveContract(DBContracts.ParseToViewModel(updatedContract, string.Empty, string.Empty));
                                break;

                            case 4:     //Alterada para Perdida
                                        /*
                                         * A pedido do António José quando se muda o Estado para Perdida
                                         * Só se atualiza-se o estado da proposta e não se cria uma nova versão de Histórico
                                         * Pedido feito em 21-01-2019
                                         */
                                contractToUpdate.Status  = 4;
                                contractToUpdate.History = true;
                                contractToUpdate.Filed   = true;
                                updatedContract          = DBContracts.Update(DBContracts.ParseToDB(contractToUpdate));
                                break;

                            case 5:     //Alterar para Cancelada
                                        /*
                                         * A pedido do António José quando se muda o Estado para Cancelada
                                         * Só se atualiza-se o estado da proposta e não se cria uma nova versão de Histórico
                                         * Pedido feito em 21-01-2019
                                         */
                                contractToUpdate.Status  = 5;
                                contractToUpdate.History = true;
                                contractToUpdate.Filed   = true;
                                updatedContract          = DBContracts.Update(DBContracts.ParseToDB(contractToUpdate));
                                break;

                            case 10:     //Alterar para Não Respondida
                                         /*
                                          * Fazer arquivo
                                          * Preencher a razão do Arquivo.Deve ser criado um mecanismo tipo ‘PopUp’ para indicação desta informação.
                                          * Preencher estado com ‘Oportunidade Não Respondida’
                                          * Preencher Data Estado com data do sistema
                                          * Passar p/ Histórico
                                          */
                                contractToUpdate.DateProposedState = DateTime.Now.ToString();
                                contractToUpdate = ArchiveContract(contractToUpdate);
                                break;

                            default:
                                updatedContract  = DBContracts.Update(DBContracts.ParseToDB(contractToUpdate));
                                contractToUpdate = DBContracts.ParseToViewModel(updatedContract, string.Empty, string.Empty);
                                break;
                            }
                        }
                        //else
                        //{
                        //    updatedContract = DBContracts.Update(DBContracts.ParseToDB(contractToUpdate));
                        //    contractToUpdate = DBContracts.ParseToViewModel(updatedContract, string.Empty, string.Empty);
                        //}
                        contractToUpdate.eReasonCode = 1;
                    }
                    else
                    {
                        contractToUpdate.eReasonCode = 2;
                        contractToUpdate.eMessage    = "Ocorreu um erro ao atualizar o contrato.";
                    }
                }
                else
                {
                    contractToUpdate.eReasonCode = 2;
                    contractToUpdate.eMessage    = "O tipo de contrato é inválido.";
                }
            }
            return(contractToUpdate);
        }
        public ContractViewModel ArchiveContract(ContractViewModel contractToArchive)
        {
            if (contractToArchive != null)
            {
                Contratos cContract           = DBContracts.GetByIdAndVersion(contractToArchive.ContractNo, contractToArchive.VersionNo);
                var       lastVersionContract = DBContracts.GetByIdLastVersion(contractToArchive.ContractNo);
                int       lastVersionNumber   = 0;

                if (lastVersionContract != null)
                {
                    lastVersionNumber = lastVersionContract.NºVersão + 1;
                }
                else
                {
                    lastVersionNumber = contractToArchive.VersionNo + 1;
                }

                if (cContract != null)
                {
                    try
                    {
                        //Create new contract and update old
                        cContract.Notas                 = cContract.Notas;
                        cContract.RazãoArquivo          = contractToArchive.ArchiveReason;
                        cContract.UtilizadorModificação = changedByUserName;
                        cContract.Arquivado             = true;
                        DBContracts.Update(cContract);

                        //NR20181116 - Só faz se não for Oportunidade
                        if (cContract.TipoContrato == (int)ContractType.Oportunity)
                        {
                            contractToArchive.eReasonCode = 1;
                            contractToArchive.eMessage    = "Arquivado com sucesso.";
                            return(contractToArchive);
                        }

                        cContract.NºVersão              = lastVersionNumber;// cContract.NºVersão + 1;
                        cContract.UtilizadorCriação     = changedByUserName;
                        cContract.UtilizadorModificação = "";
                        if (cContract.TipoContrato == (int)ContractType.Oportunity)
                        {
                            cContract.NºProposta = "";
                        }
                        else if (cContract.TipoContrato == (int)ContractType.Proposal)
                        {
                            cContract.NºContrato = "";
                        }

                        cContract.DataHoraModificação = null;
                        cContract.Arquivado           = false;

                        if (contractToArchive.ActionCode.HasValue && contractToArchive.ActionCode.Value == 2)
                        {
                            cContract.Estado = 1;
                            cContract.DataHoraModificação   = DateTime.Now;
                            cContract.UtilizadorModificação = changedByUserName;
                        }

                        DBContracts.Create(cContract);

                        //Duplicate Contract Lines
                        List <LinhasContratos> ContractLines = DBContractLines.GetAllByActiveContract(contractToArchive.ContractNo, contractToArchive.VersionNo);

                        ContractLines.ForEach(x =>
                        {
                            x.NºVersão = lastVersionNumber;// cContract.NºVersão;
                            DBContractLines.Create(x);
                        });

                        contractToArchive.VersionNo   = lastVersionNumber;// cContract.NºVersão;
                        contractToArchive.eReasonCode = 1;
                        contractToArchive.eMessage    = "Arquivado com sucesso.";
                        return(contractToArchive);
                    }
                    catch (Exception)
                    {
                        contractToArchive.eReasonCode = 2;
                        contractToArchive.eMessage    = "Ocorreu um erro ao arquivar.";
                    }
                }
            }
            else
            {
                contractToArchive.eReasonCode = 2;
                contractToArchive.eMessage    = "Ocorreu um erro ao arquivar.";
            }
            return(contractToArchive);
        }