public void PagarComissao(int idVendedor, List <int> contratos, int filtroPag, DateTime inicio, DateTime fim)
        {
            var vendedor = new VendedorRepositorio(this._context, this._transaction).Get(idVendedor);

            if (filtroPag == 1)
            {
                foreach (var cont in contratos)
                {
                    var parcelas = new ContratoParcelaRepositorio(this._context, this._transaction).GetByContrato(cont);
                    foreach (var parc in parcelas)
                    {
                        parc.comissao = parc.valorParcela * (vendedor.percComis / 100);
                        new ContratoParcelaRepositorio(this._context, this._transaction).Update(parc);
                    }
                }
            }
            else if (filtroPag == 2)
            {
                foreach (var cont in contratos)
                {
                    var parcelas = new ContratoParcelaRepositorio(this._context, this._transaction).GetByContrato(cont);
                    parcelas = parcelas.Where(p => p.situacao == 3);
                    foreach (var parc in parcelas)
                    {
                        var pagamentos = new ContratoParcelaPagamentoRepositorio(this._context, this._transaction).GetByContratoParcela(parc.Id);
                        pagamentos = pagamentos.Where(e => e.comissao == 0 && e.valorPagamento > 0 && e.dataPagamento >= inicio && e.dataPagamento <= fim).ToList();
                        foreach (var pgto in pagamentos)
                        {
                            pgto.comissao = pgto.valorPagamento * (vendedor.percComis / 100);
                            new ContratoParcelaPagamentoRepositorio(this._context, this._transaction).Update(pgto);
                        }
                    }
                }
            }
            else
            {
                throw new AppError("Filtro inválido");
            }
        }
        public void GerarParcelas(Contrato Contrato, int diaVencimentoDemais, bool isPrimeiraVigencia)
        {
            var parcelasContrato = new ContratoParcelaRepositorio(this._context, this._transaction).GetByContrato(Contrato.Id).ToList();

            if (parcelasContrato.Count > 0)
            {
                foreach (var parc in parcelasContrato)
                {
                    new ContratoParcelaRepositorio(this._context, this._transaction).Remove(parc.Id);
                }
            }

            var servicos = (List <ContratoServico>) new ContratoServicoRepositorio(this._context, this._transaction).GetByContrato(Contrato.Id);

            if (servicos == null || servicos.Count == 0)
            {
                return;
            }
            else if (Contrato.numParcelas == 0)
            {
                throw new AppError("É necessário informar o número de parcelas");
            }

            DateTime dataPrimeira = DateTime.Today;
            DateTime dataSegunda  = DateTime.Today;
            decimal  valorParc    = servicos.Sum(s => s.valorTotal) / Contrato.numParcelas;

            if (valorParc == 0)
            {
                throw new AppError("Os serviços prestados a esse contrato não possuem valor");
            }

            valorParc = Math.Round(valorParc, 2);

            if (diaVencimentoDemais == 0)
            {
                dataPrimeira = Contrato.dataInicio;
            }
            else
            {
                if (isPrimeiraVigencia)
                {
                    dataPrimeira = Contrato.dataInicio;
                    if (diaVencimentoDemais != 0)
                    {
                        if (diaVencimentoDemais < Contrato.dataInicio.Day)
                        {
                            //Mês seguinte
                            var dataFinal = Contrato.dataInicio.AddMonths(1);
                            dataSegunda = Convert.ToDateTime($"{diaVencimentoDemais}/{dataFinal.Month}/{dataFinal.Year}");
                        }
                        else
                        {
                            dataSegunda = Convert.ToDateTime($"{diaVencimentoDemais}/{Contrato.dataInicio.Month}/{Contrato.dataInicio.Year}");
                        }
                    }
                }
                else
                {
                    if (diaVencimentoDemais < Contrato.dataInicio.Day)
                    {
                        //Mês seguinte
                        var dataFinal = Contrato.dataInicio.AddMonths(1);
                        dataPrimeira = Convert.ToDateTime($"{diaVencimentoDemais}/{dataFinal.Month}/{dataFinal.Year}");
                        dataSegunda  = dataPrimeira;
                    }
                    else
                    {
                        dataPrimeira = Convert.ToDateTime($"{diaVencimentoDemais}/{Contrato.dataInicio.Month}/{Contrato.dataInicio.Year}");
                        dataSegunda  = dataPrimeira;
                    }
                }
            }

            List <ContratoParcela> parcelas = new List <ContratoParcela>();

            for (int i = 0; i < Contrato.numParcelas; i++)
            {
                ContratoParcela parc = new ContratoParcela();
                parc.idContrato     = Contrato.Id;
                parc.numParcela     = i + 1;
                parc.valorParcela   = valorParc;
                parc.dataVencimento = (i == 0) ? dataPrimeira : (diaVencimentoDemais == 0) ? dataPrimeira.AddMonths(i) : dataSegunda.AddMonths(i);
                parc.situacao       = 1;
                //parc.comissao = valorParc * (Contrato.vendedor.percComis / 100);
                parc.comissao = 0;

                parcelas.Add(parc);
            }

            var     soma = parcelas.Sum(p => p.valorParcela);
            decimal dif  = 0;

            dif = servicos.Sum(s => s.valorTotal) - soma;

            if (dif > 0)
            {
                parcelas.Last().valorParcela = parcelas.Last().valorParcela + dif;
            }

            foreach (var parc in parcelas)
            {
                new ContratoParcelaRepositorio(this._context, this._transaction).Create(parc);
            }
        }