void splittaNettoSeSaturoReversali(MovimentoRaggruppato mov) { if (mov.importoNetto() == 0) { return; } if (mov.saturoReversali()) { var nuovoMov = mov.splittaResiduo(); movimenti.Add(nuovoMov); } }
/// <summary> /// /// </summary> /// <returns></returns> public MovimentoRaggruppato splittaResiduo() { if (netto == 0) { return(null); } quotaMovimento spesaSplit = quotaSpesa.splittaQuota(netto); var nuovo = new MovimentoRaggruppato(spesaSplit); netto = 0; return(nuovo); }
//Collega l'entrata sul movimento con massima capienza ove ce ne sia uno capiente bool collegaEntrataMatchMassimaCapienza(quotaMovimento entrata) { MovimentoRaggruppato maxDisp = movConMassimoResiduo(); if (maxDisp == null) { return(false); } if (maxDisp.collegamentoPossibileSenzaSplit(entrata)) { collegaEntrataAGruppo(entrata, maxDisp); return(true); } return(false); }
/// <summary> /// Può variare la collezione dei movimenti raggruppati ma non varia quella delle entrate /// </summary> /// <param name="entrata"></param> /// <returns></returns> bool collegaEntrata(quotaMovimento entrata) { if (totaleNetto < entrata.quota) { return(false); } if (collegaEntrataMatchEsatto(entrata)) { return(true); } if (collegaEntrataMatchMassimaCapienza(entrata)) { return(true); } //Dato che ogni volta che colleghiamo un'entrata splittiamo il netto ove ci siano 30 reversali, // non è possibile che vi sia un movimento con disponibile sufficiente ma 30 reversali //Quindi vi devono essere movimenti di spesa con disponibilità insufficiente e meno di 30 reversali //A questo punto ad ognuno di loro associamo una quota dell'entrata data while (entrata.quota > 0) { MovimentoRaggruppato maxDisp = movConMassimoResiduo(); if (maxDisp == null) { return(false); //non dovrebbe accadere } decimal residuo = maxDisp.importoNetto(); if (residuo >= entrata.quota) { //il movimento considerato è capiente per quel che rimane dell'entrata collegaEntrataAGruppo(entrata, maxDisp); return(true); } var quotaEntrata = entrata.splittaQuota(residuo); maxDisp.addEntrata(quotaEntrata); } return(true); }
public void creaNetti() { List <MovimentoRaggruppato> toAdd = new List <MovimentoRaggruppato>(); foreach (MovimentoRaggruppato mov in movimenti) { decimal netto = mov.importoNetto(); if (netto == 0) { continue; } if (mov.nReversali() == 0) { continue; //è già Netto } MovimentoRaggruppato nuovo = mov.splittaResiduo(); toAdd.Add(nuovo); } foreach (var r in toAdd) { movimenti.Add(r); } }
/// <summary> /// Cerca il raggruppamento di spesa con massimo residuo collegabile /// </summary> /// <returns></returns> MovimentoRaggruppato movConMassimoResiduo() { MovimentoRaggruppato movConMassimoDisponibile = null; foreach (var mov in movimenti) { decimal residuoCorrente = mov.quotaSpesaResiduaPerReversali(); if (residuoCorrente == 0) { continue; } if (movConMassimoDisponibile == null) { movConMassimoDisponibile = mov; continue; } if (movConMassimoDisponibile.quotaSpesaResiduaPerReversali() < residuoCorrente) { movConMassimoDisponibile = mov; } } return(movConMassimoDisponibile); }
public void collegaEntrataAGruppo(quotaMovimento entrata, MovimentoRaggruppato mov) { mov.addEntrata(entrata); splittaNettoSeSaturoReversali(mov); }