Esempio n. 1
0
        public decimal TotaleImportoNoBigliettone()
        {
            decimal totale = 0;

            foreach (ProfiloCliente profiloCliente in ElencoProfili)
            {
                SoluzioneIngressi soluzione = profiloCliente.SoluzionePreferitaNoBigliettone;
                if (soluzione != null)
                {
                    totale += soluzione.ImportoTotale;
                }
            }
            return(totale);
        }
Esempio n. 2
0
        private void Tentativo(ProfiloCliente cliente, List <SoluzioneIngressiItem> elencoPercorso, decimal importoPercorso, int indice, List <Ingresso> dafare)
        {
            if (dafare.Count == 0)
            {
                // valida soluzione per bigliettone
                if (SoluzioneValidaPerBigliettone(elencoPercorso))
                {
                    decimal importoTotale   = 0;
                    decimal importoUnitario = 0;

                    // ho trovato una soluzione
                    foreach (SoluzioneIngressiItem item in elencoPercorso)
                    {
                        importoTotale   += item.PrezzoTotale;
                        importoUnitario += item.PrezzoUnitario;
                    }

                    List <Ingresso> visitati = new List <Ingresso>();
                    foreach (SoluzioneIngressiItem variante1 in elencoPercorso)
                    {
                        foreach (Ingresso item in variante1.Variante.Biglietto.Percorso.Ingressi)
                        {
                            if (!visitati.Contains(item))
                            {
                                visitati.Add(item);
                            }
                        }
                    }

                    SoluzioneIngressi sol = new SoluzioneIngressi();

                    sol.Elenco = new List <SoluzioneIngressiItem>();
                    sol.Elenco.AddRange(elencoPercorso);

                    sol.NumeroIngressi  = visitati.Count;
                    sol.NumeroPercorsi  = elencoPercorso.Count;
                    sol.ImportoTotale   = importoTotale;
                    sol.ImportoUnitario = importoUnitario;
                    sol.NumeroPersone   = cliente.NumeroPersone;

                    cliente.ElencoSoluzioni.AggiungiSoluzioneSeNonDuplicata(sol);
                }
            }
            else
            {
                if (cliente.OttimizzaCalcolo && cliente.ElencoSoluzioni.SogliaImporto >= 0)
                {
                    // inutile proseguire ulteriormente
                    if (importoPercorso > cliente.ElencoSoluzioni.SogliaImporto)
                    {
                        return;
                    }
                }

                for (int newIndice = indice + 1; newIndice < m_TutteLeVarianti.Count; newIndice++)
                {
                    Titolo   titolo   = null;
                    Variante variante = m_TutteLeVarianti[newIndice];

                    if (variante.TipologiaTre == EnumTipologiaTre.CardMyFE)
                    {
                        // CARD MY-FE con prezzo sdoppiato -C]
                        if (variante.ComprendeAlmenoUno(dafare) && variante.GiorniCardMyFe() == m_GestoreProfili.TipologiaMyFe && variante.Note.Contains("-C]"))
                        {
                            List <Ingresso> davisitare = new List <Ingresso>(dafare);
                            foreach (Ingresso ingresso in variante.Biglietto.Percorso.Ingressi)
                            {
                                davisitare.Remove(ingresso);
                            }

                            decimal prezzo = 0;
                            SoluzioneIngressiItem tentativo           = null;
                            SoluzioneIngressiItem tentativoSecondario = null;

                            tentativo = new SoluzioneIngressiItem(variante, null, cliente.NumeroPersone);
                            prezzo    = tentativo.PrezzoTotale;

                            tentativoSecondario = new SoluzioneIngressiItem(variante.PrezzoAttuale.PrezzoRidotto, null, cliente.NumeroPersone);
                            prezzo += tentativoSecondario.PrezzoTotale;

                            elencoPercorso.Add(tentativo);
                            elencoPercorso.Add(tentativoSecondario);

                            Tentativo(cliente, elencoPercorso, importoPercorso + prezzo, newIndice, davisitare);

                            elencoPercorso.Remove(tentativoSecondario);
                            elencoPercorso.Remove(tentativo);
                        }

                        // campo note che finisce con -B è solo COMUNE
                        if (variante.ComprendeAlmenoUno(dafare) && variante.GiorniCardMyFe() == m_GestoreProfili.TipologiaMyFe && variante.Note.Contains("-B]"))
                        {
                            List <Ingresso> davisitare = new List <Ingresso>(dafare);
                            foreach (Ingresso ingresso in variante.Biglietto.Percorso.Ingressi)
                            {
                                davisitare.Remove(ingresso);
                            }

                            decimal prezzo = 0;
                            SoluzioneIngressiItem tentativo = null;
                            //SoluzioneIngressiItem tentativoSecondario = null;

                            tentativo = new SoluzioneIngressiItem(variante, null, cliente.NumeroPersone);
                            prezzo    = tentativo.PrezzoTotale;

                            //tentativoSecondario = new SoluzioneIngressiItem(variante.PrezzoAttuale.PrezzoRidotto, null, cliente.NumeroPersone);
                            //prezzo += tentativoSecondario.PrezzoTotale;

                            elencoPercorso.Add(tentativo);
                            //elencoPercorso.Add(tentativoSecondario);

                            Tentativo(cliente, elencoPercorso, importoPercorso + prezzo, newIndice, davisitare);

                            //elencoPercorso.Remove(tentativoSecondario);
                            elencoPercorso.Remove(tentativo);
                        }
                    }
                    else
                    {
                        if (variante.HoTitoloPerComprarlo(cliente.ElencoTitoli, cliente.ElencoCodiciSconto, cliente.NumeroPersone, cliente.Scuola, out titolo))
                        {
                            if (variante.ComprendeAlmenoUno(dafare))
                            {
                                List <Ingresso> davisitare = new List <Ingresso>(dafare);
                                foreach (Ingresso ingresso in variante.Biglietto.Percorso.Ingressi)
                                {
                                    davisitare.Remove(ingresso);
                                }

                                decimal prezzo = 0;
                                SoluzioneIngressiItem tentativo           = null;
                                SoluzioneIngressiItem tentativoSecondario = null;
                                if (titolo != null && titolo.TitoloPrincipale != null && titolo.TitoloSecondario != null)
                                {
                                    // GESTIONE TITOLI SECONDARI (solo il primo e' titolare, gli altri accompagnatori)
                                    tentativo = new SoluzioneIngressiItem(variante, titolo.TitoloPrincipale, 1);
                                    prezzo    = tentativo.PrezzoTotale;

                                    if (cliente.NumeroPersone > 1)
                                    {
                                        tentativoSecondario = new SoluzioneIngressiItem(variante, titolo.TitoloSecondario, cliente.NumeroPersone - 1);
                                        prezzo += tentativoSecondario.PrezzoTotale;
                                    }
                                }
                                else
                                {
                                    if (variante.PrezzoAttuale.UnaRiduzioneOgni > 0 && variante.PrezzoAttuale.PrezzoRidotto != null)
                                    {
                                        int numRidotti = cliente.NumeroPersone / variante.PrezzoAttuale.UnaRiduzioneOgni;
                                        int numInteri  = cliente.NumeroPersone - numRidotti;

                                        tentativo = new SoluzioneIngressiItem(variante, titolo, numInteri);
                                        prezzo    = tentativo.PrezzoTotale;

                                        if (numRidotti > 0)
                                        {
                                            tentativoSecondario = new SoluzioneIngressiItem(variante.PrezzoAttuale.PrezzoRidotto, titolo, numRidotti);
                                            prezzo += tentativoSecondario.PrezzoTotale;
                                        }
                                    }
                                    else
                                    {
                                        tentativo = new SoluzioneIngressiItem(variante, titolo, cliente.NumeroPersone);
                                        prezzo    = tentativo.PrezzoTotale;
                                    }
                                }

                                elencoPercorso.Add(tentativo);
                                if (tentativoSecondario != null)
                                {
                                    elencoPercorso.Add(tentativoSecondario);
                                    foreach (Ingresso ingresso in tentativoSecondario.Variante.Biglietto.Percorso.Ingressi)
                                    {
                                        davisitare.Remove(ingresso);
                                    }
                                }

                                Tentativo(cliente, elencoPercorso, importoPercorso + prezzo, newIndice, davisitare);

                                if (tentativoSecondario != null)
                                {
                                    elencoPercorso.Remove(tentativoSecondario);
                                }
                                elencoPercorso.Remove(tentativo);
                            }
                        }
                    }
                }
            }
        }