public bool AplicarAditivo([FromBody] InputAplicarAditivo inputAplicarAditivo)
        {
            bool operacaoBemSucedida = true;

            using (var db = new FIPEContratosContext())
            {
                try
                {
                    new bAditivo(db).AplicarAditivo(inputAplicarAditivo);
                }
                catch (Exception ex)
                {
                    new bEmail(db).EnviarEmailTratamentoErro(ex, "AplicarAditivo");

                    operacaoBemSucedida = false;
                }

                return(operacaoBemSucedida);
            }
        }
        public void AplicarAditivo(InputAplicarAditivo inputAplicarAditivo)
        {
            var aditivo  = db.ContratoAditivo.FirstOrDefault(_ => _.IdContratoAditivo == inputAplicarAditivo.IdAditivo);
            var contrato = db.Contrato.FirstOrDefault(_ => _.IdContrato == aditivo.IdContrato);

            if (aditivo.IcAditivoData != null)
            {
                contrato.DtFim = aditivo.DtFimAditivada;
            }
            if (aditivo.IcAditivoValor != null)
            {
                contrato.VlContrato = aditivo.VlContratoAditivado.GetValueOrDefault();
            }

            aditivo.DtAplicacao          = DateTime.Now;
            aditivo.IdUsuarioAplicacao   = AppSettings.constGlobalUserID;
            aditivo.DtIniExecucaoAditivo = DateTime.Now;
            aditivo.IdSituacao           = 101;

            var lstContratoCronogramaFinanceiroAntigos = db.ContratoCronogramaFinanceiro.Where(w => w.IdContrato == contrato.IdContrato).ToList();
            var lstContratoEntregaveisAntigos          = db.ContratoEntregavel.Where(w => w.IdContrato == contrato.IdContrato).ToList();

            var lstContratoCronogramaFinanceiroTemporaria = db.ContratoCronogramaFinanceiroTemporaria.Where(w => w.IdContrato == contrato.IdContrato).ToList();
            var lstEntregaveisTemporaria = db.ContratoEntregavelTemporaria.Where(w => w.IdContrato == contrato.IdContrato).ToList();

            foreach (var entregavelTemp in lstEntregaveisTemporaria)
            {
                var contratoEntregavel = new ContratoEntregavel();
                contratoEntregavel.IdContrato        = entregavelTemp.IdContrato;
                contratoEntregavel.DsProduto         = entregavelTemp.DsProduto;
                contratoEntregavel.DtProduto         = entregavelTemp.DtProduto;
                contratoEntregavel.IdContratoCliente = entregavelTemp.IdContratoCliente.Value;
                contratoEntregavel.IdFrente          = entregavelTemp.IdFrente;
                contratoEntregavel.IdSituacao        = entregavelTemp.IdSituacao;
                contratoEntregavel.VlOrdem           = entregavelTemp.VlOrdem;

                db.ContratoEntregavel.Add(contratoEntregavel);
                db.SaveChanges();

                entregavelTemp.IdEntregavel = contratoEntregavel.IdContratoEntregavel;
            }

            foreach (var parcelaTemp in lstContratoCronogramaFinanceiroTemporaria)
            {
                var contratoCronogramaFinanceiro = new ContratoCronogramaFinanceiro();
                contratoCronogramaFinanceiro.CdIss = parcelaTemp.CdIss;
                // Retorna somente os dois ultimos caracteres do Código da Parcela
                string codigoReajusteParcela = parcelaTemp.CdParcela.Substring(parcelaTemp.CdParcela.Length - 2, 2);
                // Remove os dois ultimos caracteres do Código da Parcela
                parcelaTemp.CdParcela = parcelaTemp.CdParcela.Remove(parcelaTemp.CdParcela.Length - 2, 2);
                // Soma 1 nos dois ultimos caracteres do Código da Parcela
                int novoCdReajusteParcela = Convert.ToInt32(codigoReajusteParcela) + 1;
                codigoReajusteParcela  = novoCdReajusteParcela.ToString().Length > 1 ? novoCdReajusteParcela.ToString() : "0" + novoCdReajusteParcela.ToString();
                parcelaTemp.CdParcela += codigoReajusteParcela;
                contratoCronogramaFinanceiro.CdParcela         = parcelaTemp.CdParcela;
                contratoCronogramaFinanceiro.DsTextoCorpoNf    = parcelaTemp.DsTextoCorpoNf;
                contratoCronogramaFinanceiro.DtFaturamento     = parcelaTemp.DtFaturamento;
                contratoCronogramaFinanceiro.DtNotaFiscal      = parcelaTemp.DtNotaFiscal;
                contratoCronogramaFinanceiro.IdContratoCliente = parcelaTemp.IdContratoCliente;
                contratoCronogramaFinanceiro.IdSituacao        = parcelaTemp.IdSituacao;
                contratoCronogramaFinanceiro.NuNotaFiscal      = parcelaTemp.NuNotaFiscal;
                contratoCronogramaFinanceiro.NuParcela         = parcelaTemp.NuParcela;
                contratoCronogramaFinanceiro.VlParcela         = parcelaTemp.VlParcela;
                contratoCronogramaFinanceiro.IcAtraso          = parcelaTemp.IcAtraso;
                contratoCronogramaFinanceiro.IdContrato        = parcelaTemp.IdContrato;
                contratoCronogramaFinanceiro.IdFrente          = parcelaTemp.IdFrente;

                db.ContratoCronogramaFinanceiro.Add(contratoCronogramaFinanceiro);
                db.SaveChanges();

                // Busca os Registros na Tabela ContratoParcelaEntregavelTemporaria para verificar se a Parcela estava ligada com Entregaveis
                var lstContratoParcelaEntregavelTemp = db.ContratoParcelaEntregavelTemporaria.Where(w => w.IdParcela == parcelaTemp.IdContratoCronFinanceiro).ToList();
                if (lstContratoParcelaEntregavelTemp.Count > 0)
                {
                    foreach (var contratoParcEntreTemp in lstContratoParcelaEntregavelTemp)
                    {
                        // Busca o registro na tabela ContratoEntregavelTemporaria
                        var contratoEntregavelTemp = lstEntregaveisTemporaria.Where(w => w.IdContratoEntregavel == contratoParcEntreTemp.IdEntregavel).FirstOrDefault();
                        if (contratoEntregavelTemp != null)
                        {
                            // Com o ContratoEntregavel e a Parcela , cria um novo registro na tabela ContratoEntregavelParcela
                            var contratoParcelaEntregavel = new ContratoParcelaEntregavel();
                            contratoParcelaEntregavel.IdEntregavel = contratoEntregavelTemp.IdEntregavel.Value;
                            contratoParcelaEntregavel.IdParcela    = contratoCronogramaFinanceiro.IdContratoCronFinanceiro;

                            db.ContratoParcelaEntregavel.Add(contratoParcelaEntregavel);
                            db.SaveChanges();
                        }

                        // Após copiar o relacionamento entre Parcela e Entregavel remove o registro
                        db.ContratoParcelaEntregavelTemporaria.Remove(contratoParcEntreTemp);
                        db.SaveChanges();
                    }
                }

                // Após copiar a Parcela , exclui da tabela Temporaria
                db.ContratoCronogramaFinanceiroTemporaria.Remove(parcelaTemp);
                db.SaveChanges();
            }

            // Remove todos os registros de EntregaveisTemporaria do devido Contrato
            db.ContratoEntregavelTemporaria.RemoveRange(lstEntregaveisTemporaria);
            db.SaveChanges();

            // Busca todas as relações antigas entre Parcela e Entregavel e exclui
            foreach (var entregavelAntigo in lstContratoEntregaveisAntigos)
            {
                var lstParcelaEntregavelAntigo = db.ContratoParcelaEntregavel.Where(w => w.IdEntregavel == entregavelAntigo.IdContratoEntregavel).ToList();
                if (lstParcelaEntregavelAntigo.Count > 0)
                {
                    db.ContratoParcelaEntregavel.RemoveRange(lstParcelaEntregavelAntigo);
                    db.SaveChanges();
                }
            }

            // Remove todos Registros de Entregaveis e Parcelas antigos (salvos no histórico)
            db.ContratoEntregavel.RemoveRange(lstContratoEntregaveisAntigos);
            db.ContratoCronogramaFinanceiro.RemoveRange(lstContratoCronogramaFinanceiroAntigos);

            db.SaveChanges();
        }