public void DoPromoPolimorfTest() { using (LumenEntities dbContext = new LumenEntities()) { PromoStessaFotoSuFile p1 = (PromoStessaFotoSuFile)dbContext.Promozioni.SingleOrDefault(p => p.id == 1); bool nuovo1 = (p1 == null); if (nuovo1) { p1 = new PromoStessaFotoSuFile(); } p1.id = 1; p1.descrizione = "prova1"; p1.prezzoFile = 1; if (nuovo1) { dbContext.Promozioni.Add(p1); } // PromoPrendiNPaghiM p2 = (PromoPrendiNPaghiM)dbContext.Promozioni.SingleOrDefault(p => p.id == 2); bool nuovo2 = (p2 == null); if (nuovo2) { p2 = new PromoPrendiNPaghiM(); } p2.id = 2; p2.descrizione = "prova2"; p2.qtaDaPrendere = 6; p2.qtaDaPagare = 5; if (nuovo2) { dbContext.Promozioni.Add(p2); } dbContext.SaveChanges(); } }
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); }