Skip to content

Instantly share code, notes, and snippets.

@AlbertoMonteiro
Last active October 16, 2015 03:24
Show Gist options
  • Select an option

  • Save AlbertoMonteiro/f941fa76744994d1a8db to your computer and use it in GitHub Desktop.

Select an option

Save AlbertoMonteiro/f941fa76744994d1a8db to your computer and use it in GitHub Desktop.
Vai que é tua
using System;
using System.Collections.Generic;
using System.Linq;
namespace MegaLinqTeste
{
class Program
{
static void Main(string[] args)
{
var aPatirDe = new DateTime(2015, 6, 1);
var list = Query().ToList();
var contratos = (from contrato in list
from car in contrato.ContasAReceber
from vencimento in car.Vencimentos
let maxData = contrato.ContasAReceber.SelectMany(c => c.Vencimentos).Max(v => v.Data)
where vencimento.Data == maxData && vencimento.Valor == vencimento.Baixas.Sum(b => b.ValorNominal)
select contrato)
.Distinct()
.ToList();
foreach (var contrato in contratos)
{
Console.WriteLine(contrato.Descricao);
}
}
private static IEnumerable<Contrato> Query()
{
yield return GeraContrato("Contrato a ser cobrado 1", 6, true, aPartirDoMes: 3);
yield return GeraContrato("Contrato sem cobrança 1");
yield return GeraContrato("Contrato a ser cobrado 2", 3, true, aPartirDoMes: 5);
yield return GeraContrato("Contrato sem cobrança 2", aPartirDoMes: 5);
yield return GeraContrato("Contrato sem cobrança 3", aPartirDoMes: 5);
}
private static Contrato GeraContrato(string descricao, int contasPagas = 1, bool contaEmAberto = true, int aPartirDoMes = 1)
{
var contrato = new Contrato(descricao);
for (var i = 0; i < contasPagas; i++)
contrato.ContasAReceber.Add(GeraContaAReceber(new DateTime(2015, aPartirDoMes + i, 1)));
if (contaEmAberto)
contrato.ContasAReceber.Add(GeraContaAReceber(new DateTime(2015, aPartirDoMes + contasPagas + 1, 1), false));
return contrato;
}
private static ContaAReceber GeraContaAReceber(DateTime data, bool pago = true)
{
var contaAReceber = new ContaAReceber();
contaAReceber.Vencimentos.Add(GeraVencimento(data, pago));
return contaAReceber;
}
private static Vencimento GeraVencimento(DateTime data, bool pago = true)
{
var vencimento = new Vencimento { Data = data };
if (pago) vencimento.Baixas.Add(new Baixa());
return vencimento;
}
}
public class Contrato
{
public string Descricao { get; set; }
public Contrato(string descricao)
{
Descricao = descricao;
}
public override string ToString()
{
return Descricao;
}
public IList<ContaAReceber> ContasAReceber { get; set; } = new List<ContaAReceber>();
}
public class ContaAReceber
{
public IList<Vencimento> Vencimentos { get; set; } = new List<Vencimento>();
}
public class Vencimento
{
public decimal Valor { get; set; } = 100;
public IList<Baixa> Baixas { get; set; } = new List<Baixa>();
public DateTime Data { get; set; }
}
public class Baixa
{
public decimal ValorNominal { get; set; } = 100;
}
}
@JoelRamosM

Copy link
Copy Markdown

Boa , esta era a abordagem que ia sugerir 😃 pegar direto do conta a receber do contrato

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment