Exemple #1
0
 void splittaNettoSeSaturoReversali(MovimentoRaggruppato mov)
 {
     if (mov.importoNetto() == 0)
     {
         return;
     }
     if (mov.saturoReversali())
     {
         var nuovoMov = mov.splittaResiduo();
         movimenti.Add(nuovoMov);
     }
 }
Exemple #2
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);
        }
Exemple #3
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);
        }
Exemple #4
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);
        }
Exemple #5
0
        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);
            }
        }
Exemple #6
0
        /// <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);
        }
Exemple #7
0
 public void collegaEntrataAGruppo(quotaMovimento entrata, MovimentoRaggruppato mov)
 {
     mov.addEntrata(entrata);
     splittaNettoSeSaturoReversali(mov);
 }