Last active
October 16, 2015 03:24
-
-
Save AlbertoMonteiro/f941fa76744994d1a8db to your computer and use it in GitHub Desktop.
Vai que é tua
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Boa , esta era a abordagem que ia sugerir 😃 pegar direto do conta a receber do contrato