예제 #1
0
        public void addSpesa(DataRow r, decimal importo)
        {
            var quotaSpesa = new quotaMovimento(r, importo);

            movimenti.Add(new MovimentoRaggruppato(quotaSpesa));
            totaleNetto += importo;
        }
예제 #2
0
        public quotaMovimento splittaQuota(decimal splitAmount)
        {
            var newQuota = new quotaMovimento(mov, splitAmount);

            quota -= splitAmount;
            return(newQuota);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        //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);
        }
예제 #5
0
 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);
 }
예제 #6
0
        /// <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);
        }
예제 #7
0
 public bool collegamentoPossibileSenzaSplit(quotaMovimento entrata)
 {
     return(quotaSpesaResiduaPerReversali() >= entrata.quota);
 }
예제 #8
0
 /// <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;
 }
예제 #9
0
 public MovimentoRaggruppato(quotaMovimento spesa)
 {
     quotaSpesa = spesa;
     netto      = spesa.quota;
 }
예제 #10
0
 public void collegaEntrataAGruppo(quotaMovimento entrata, MovimentoRaggruppato mov)
 {
     mov.addEntrata(entrata);
     splittaNettoSeSaturoReversali(mov);
 }