public void addSpesa(DataRow r, decimal importo) { var quotaSpesa = new quotaMovimento(r, importo); movimenti.Add(new MovimentoRaggruppato(quotaSpesa)); totaleNetto += importo; }
public quotaMovimento splittaQuota(decimal splitAmount) { var newQuota = new quotaMovimento(mov, splitAmount); quota -= splitAmount; return(newQuota); }
/// <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); }
bool collegaEntrataMatchEsatto(quotaMovimento entrata) { //Cerca prima un match "pulito" e nel mentre cerca il movimento con massimo disponibile foreach (var mov in movimenti) { decimal residuoCorrente = mov.quotaSpesaResiduaPerReversali(); if (residuoCorrente == 0) { continue; } if (residuoCorrente == entrata.quota) { collegaEntrataAGruppo(entrata, mov); 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 bool collegamentoPossibileSenzaSplit(quotaMovimento entrata) { return(quotaSpesaResiduaPerReversali() >= entrata.quota); }
/// <summary> /// Aggiunge una entrata collegata e aggiorna il netto /// </summary> /// <param name="entrata"></param> /// <param name="quota"></param> public void addEntrata(quotaMovimento entrata) { quoteEntrata.Add(entrata); netto -= entrata.quota; }
public MovimentoRaggruppato(quotaMovimento spesa) { quotaSpesa = spesa; netto = spesa.quota; }
public void collegaEntrataAGruppo(quotaMovimento entrata, MovimentoRaggruppato mov) { mov.addEntrata(entrata); splittaNettoSeSaturoReversali(mov); }