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); }
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); }
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); }