コード例 #1
0
        public Carrello Applica(Carrello cin, Promozione _promo, PromoContext contestoDiVendita)
        {
            PromoStessaFotoSuFile promo = (PromoStessaFotoSuFile)_promo;

            bool elargito = false;

            // Vediamo se esiste una foto con il rispettivo file.
            foreach (RigaCarrello r in cin.righeCarrello)
            {
                if (r.prezzoNettoTotale > 0 && r.discriminator == RigaCarrello.TIPORIGA_STAMPA)
                {
                    RigaCarrello rigaFile = cin.righeCarrello.SingleOrDefault(r2 => r2.isTipoMasterizzata && r2.fotografia == r.fotografia);
                    if (rigaFile != null)
                    {
                        // trovato il file che corrisponde a questa foto.
                        rigaFile.sconto = rigaFile.prezzoLordoUnitario - promo.prezzoFile;

                        rigaFile.prezzoNettoTotale = GestoreCarrello.calcValoreRiga(rigaFile);
                        elargito = true;

                        _giornale.Debug("Elargita per foto num. " + rigaFile.fotografia.numero);
                    }
                }
            }

            // Aggiungo la promo alla lista di quelle elargite
            if (elargito && contestoDiVendita.promoApplicate.Contains(promo) == false)
            {
                contestoDiVendita.promoApplicate.Add(promo);
            }

            return(cin);
        }
コード例 #2
0
        public Carrello Applica(Carrello cin, Promozione promo, PromoContext contestoDiVendita)
        {
            PromoProdXProd _promoProdXProd = (PromoProdXProd)promo;

            try {
                OrmUtil.forseAttacca <PromoProdXProd>(ref _promoProdXProd);
            } catch (Exception) {
            }

            // NOTA: non controllo più il flag di applicazione stampe/file che c'è sul database.
            //       tanto è il prodotto di innesco che mi guida.

            var qta = cin.righeCarrello
                      .Where(r => r.prezzoLordoUnitario > 0 && r.prodotto.Equals(_promoProdXProd.prodottoInnesco))
                      .Sum(r2 => r2.quantita);

            // Non entro in promozione: esco subito
            if (qta < _promoProdXProd.qtaInnesco)
            {
                return(cin);
            }

            // Ok la quantità è sufficiente per cascare nella promo.
            // Ora agisco sul carrello

            // Ora determino quante foto di quella misura posso elargire.
            var multiploRegali = ((int)(qta / _promoProdXProd.qtaInnesco));
            var qtaElarg       = multiploRegali * (_promoProdXProd.qtaElargito);

            _giornale.Debug("devo elargire " + qtaElarg + " omaggio");

            bool elargito = false;

            // -- Ora itero le righe del carrello con quel tipo e prendo per prima le righe a prezzo pieno.

            var righeOma1 = cin.righeCarrello
                            .Where(r => r.prodotto.Equals(_promoProdXProd.prodottoElargito) && r.sconto == null);
            var righeOma2 = cin.righeCarrello
                            .Where(r => r.prodotto.Equals(_promoProdXProd.prodottoElargito) && r.sconto != null).OrderByDescending(r => r.sconto);

            // Faccio due giri : 1) righe non ancora scontate. 2) righe scontate
            for (int ii = 1; ii < 2; ii++)
            {
                var righeOma = (ii == 1 ? righeOma1 : righeOma2);
                foreach (RigaCarrello riga in righeOma)
                {
                    if (qtaElarg >= riga.quantita)
                    {
                        riga.sconto = riga.prezzoLordoUnitario;
                        qtaElarg   -= riga.quantita;
                        elargito    = true;
                    }
                }
            }

            // Aggiungo la promo alla lista di quelle elargite
            if (elargito && contestoDiVendita.promoApplicate.Contains(promo) == false)
            {
                contestoDiVendita.promoApplicate.Add(promo);
            }

            return(cin);
        }
コード例 #3
0
        public Carrello Applica(Carrello cin, Promozione promo, PromoContext contestoDiVendita)
        {
            // Se ho già applicato la promo 3 (ingrandimento) allora questa non deve funzionare
            if (contestoDiVendita.promoApplicate.Any(p => p.id == 3))
            {
                _giornale.Debug("Non applico la " + promo.GetType().Name + " perché è già stata applicata la promo 3");
                return(cin);
            }

            this._promoPrendiNPaghiM = (PromoPrendiNPaghiM)promo;
            bool elargito = false;

            #region Elaboro Stampe

            if (promo.attivaSuStampe)
            {
                _mappaDaElargireStampe = new Dictionary <string, int>();

                #region carico totali x grandezza

                // per prima cosa, carico la mappa con i totali delle stampe
                // raggruppate per grandezza p,m,g
                // e che siano a prezzo pieno (cioè che non abbiano già uno sconto)

                var qq = cin.righeCarrello
                         .Where(r => r.isTipoStampa /* && r.sconto == null*/)
                         .GroupBy(r => ((FormatoCarta)r.prodotto).grandezza)
                         .Select(ff => new { grandez = ff.Key, conta = ff.Sum(r => r.quantita) });

                _mappaTotStampe = qq.ToDictionary(t => t.grandez, t => t.conta);

                #endregion carico totali x grandezza

                valorizzaMappeWork();

                foreach (var key in _mappaDaElargireStampe.Keys)
                {
                    // Questo è il numero di copie che devo scontare
                    int quante         = _mappaDaElargireStampe[key];
                    var prezzoUnitario = cin.righeCarrello.FirstOrDefault(r => r.isTipoStampa && ((FormatoCarta)r.prodotto).grandezza == key).prezzoLordoUnitario;
//						UnitOfWorkScope.currentDbContext.FormatiCarta.FirstOrDefault( fc => fc.grandezza == key && fc.attivo == true ).prezzo;
                    decimal totDaScontare = quante * prezzoUnitario;

                    // Ora itero le righe del carrellocon quel tipo su cui devo spalmare lo sconto
                    var righe = cin.righeCarrello
                                .Where(r => r.isTipoStampa && ((FormatoCarta)r.prodotto).grandezza == key);

                    foreach (RigaCarrello riga in righe)
                    {
                        var impRig = riga.quantita * riga.prezzoLordoUnitario;
                        if (totDaScontare <= impRig)
                        {
                            riga.sconto   = totDaScontare;
                            totDaScontare = 0;
                        }
                        else
                        {
                            riga.sconto    = impRig;
                            totDaScontare -= impRig;
                        }

                        riga.prezzoNettoTotale = GestoreCarrello.calcValoreRiga(riga);
                        elargito = true;
                        if (totDaScontare <= 0)
                        {
                            break;
                        }
                    }
                }
            }

            #endregion Elaboro Stampe


            #region Elaboro Masterizzate

            if (promo.attivaSuFile)
            {
                // Conto quante masterizzate sono a prezzo pieno
                var qta = cin.righeCarrello
                          .Where(r => r.isTipoMasterizzata /* && r.sconto == null */)
                          .Sum(r => r.quantita);

                var multiploRegali = ((int)(qta / _promoPrendiNPaghiM.qtaDaPrendere));
                var qtaElarg       = multiploRegali * (_promoPrendiNPaghiM.qtaDaPrendere - _promoPrendiNPaghiM.qtaDaPagare);

                _giornale.Debug("devo elargire " + qtaElarg + " file digitali");

                // Carico due liste: Prima quella dei file a prezzo pieno, poi quella dei file eventualmente già scontati
                var righeOmaPP = cin.righeCarrello.Where(r => r.isTipoMasterizzata && r.sconto == null);
                var righeOmaPS = cin.righeCarrello.Where(r => r.isTipoMasterizzata && r.sconto != null);

                // Faccio due giri di elargizione
                for (int ii = 1; ii <= 2; ii++)
                {
                    foreach (RigaCarrello riga in (ii == 1 ? righeOmaPP : righeOmaPS))
                    {
                        if (qtaElarg >= riga.quantita)
                        {
                            riga.sconto            = riga.prezzoLordoUnitario;
                            qtaElarg              -= riga.quantita;
                            riga.prezzoNettoTotale = GestoreCarrello.calcValoreRiga(riga);
                            elargito               = true;
                        }
                    }
                }
            }

            #endregion Elaboro Masterizzate

            // Aggiungo la promo alla lista di quelle elargite
            if (elargito && contestoDiVendita.promoApplicate.Contains(promo) == false)
            {
                contestoDiVendita.promoApplicate.Add(promo);
            }

            return(cin);
        }