public void crudCarrello() { Guid guid = Guid.NewGuid(); using (LumenEntities context = new LumenEntities()) { // Prima scrivo un carrello da solo. Carrello c = new Carrello(); c.id = guid; c.giornata = DateTime.Today; c.intestazione = "test1"; c.prezzoDischetto = 123; c.tempo = DateTime.Now; c.venduto = false; c.totaleAPagare = 234; // Creo anche una riga RigaCarrello r = new RigaCarrello(); r.id = Guid.NewGuid(); r.prezzoLordoUnitario = 12.34m; r.quantita = 1; r.descrizione = "test case"; r.prezzoNettoTotale = r.prezzoLordoUnitario; r.fotografia = context.Fotografie.FirstOrDefault(); r.fotografo = r.fotografia.fotografo; r.discriminator = RigaCarrello.TIPORIGA_MASTERIZZATA; c.righeCarrello = new List <RigaCarrello>(); c.righeCarrello.Add(r); // Creo anche un incasso fotografo IncassoFotografo i = new IncassoFotografo(); i.id = Guid.NewGuid(); i.fotografo = r.fotografo; i.incasso = r.prezzoNettoTotale; i.incassoMasterizzate = i.incasso; i.contaMasterizzate = 1; c.incassiFotografi = new List <IncassoFotografo>(); c.incassiFotografi.Add(i); context.Carrelli.Add(c); try { context.SaveChanges(); } catch (DbEntityValidationException qq) { foreach (var item in qq.EntityValidationErrors) { foreach (var item2 in item.ValidationErrors) { String errore = item2.ErrorMessage; Console.WriteLine(errore); } } throw; } catch (Exception) { throw; } } using (LumenEntities context = new LumenEntities()) { Carrello ct = context.Carrelli.Single(c => c.id == guid); Assert.IsTrue(ct.intestazione == "test1"); Assert.IsTrue(ct.righeCarrello.Count == 1); ct.intestazione = "test2"; context.SaveChanges(); } using (LumenEntities context = new LumenEntities()) { Carrello ct = context.Carrelli.Single(c => c.id == guid); Assert.IsTrue(ct.intestazione == "test2"); context.Carrelli.Remove(ct); // Se tutto va bene, mi deve buttare via con il trigger di cascade, anche le RigheCarrello e gli IncassiFotografi context.SaveChanges(); } using (LumenEntities context = new LumenEntities()) { Carrello ct = context.Carrelli.SingleOrDefault(c => c.id == guid); Assert.IsNull(ct); } }
private void completaAttributiMancanti(bool ancheProvvigioni) { // Tempo di creazione o ultima modifica: lo aggiorno sempre. // In questo modo, nella gestione del selfservice, il carrello passerà in cima alla lista. carrello.tempo = DateTime.Now; // La giornata contabile la impongo sempre // anche perché se sto vendendo un carrello vecchio, deve andare a finire nella cassa di oggi. carrello.giornata = LumenApplication.Instance.stato.giornataLavorativa; if (ancheProvvigioni) { // Gestico lo spaccato degli incassi per singolo fotografo if (carrello.incassiFotografi == null) { carrello.incassiFotografi = new EntityCollection <IncassoFotografo>(); } else { // Svuoto per il ricalcolo foreach (IncassoFotografo inf in carrello.incassiFotografi) { inf.incasso = 0; inf.incassoStampe = 0; inf.incassoMasterizzate = 0; inf.contaStampe = 0; inf.contaMasterizzate = 0; inf.provvigioni = null; } } } carrello.totMasterizzate = 0; carrello.prezzoDischetto = 0; // :: loop su tutte le righe foreach (RigaCarrello r in carrello.righeCarrello) { // ricalcolo il valore della riga r.prezzoNettoTotale = calcValoreRiga(r); // Calcolo il totale del prezzo del dischetto, che prima veniva inserito manualmente if (r.discriminator == RigaCarrello.TIPORIGA_MASTERIZZATA) { carrello.prezzoDischetto += r.prezzoNettoTotale; } // Se ho venduto il carrello, valorizzo i fogli stampati con la quantità if (carrello.venduto) { if (r.discriminator == RigaCarrello.TIPORIGA_STAMPA) { r.totFogliStampati = r.quantita; } if (r.discriminator == RigaCarrello.TIPORIGA_MASTERIZZATA) { carrello.totMasterizzate += r.quantita; // Sarà sempre = 1 per forza; } } if (ancheProvvigioni) { // Ora valorizzo lo spaccato provvigioni IncassoFotografo inca = carrello.incassiFotografi.SingleOrDefault(ii => ii.fotografo.id.Equals(r.fotografo.id)); if (inca == null) { inca = new IncassoFotografo(); inca.id = Guid.Empty; // lo lascio volutamente vuoto. Lo valorizzero soltanto un attimo prima di persisterlo. inca.carrello = carrello; inca.fotografo = r.fotografo; carrello.incassiFotografi.Add(inca); } // Incasso totale inca.incasso += r.prezzoNettoTotale; // Incasso diviso per prodotto if (r.discriminator == RigaCarrello.TIPORIGA_STAMPA) { inca.incassoStampe += r.prezzoNettoTotale; inca.contaStampe += r.quantita; } else if (r.discriminator == RigaCarrello.TIPORIGA_MASTERIZZATA) { inca.incassoMasterizzate += r.prezzoNettoTotale; inca.contaMasterizzate += r.quantita; // fisso = 1 } } } if (ancheProvvigioni) { // Elimino le provvigioni di eventuali fotografi che prima erano nel carrello ed ora non ci sono più. // Occhio questa espressione seguente, funziona solo grazie ad una estensione di Linq che è in questa classe: MyIEnumerableExtensions // Di natura, il compilatore mi darebbe errore (senza l'estensione) IEnumerable <Fotografo> fotografiBuoni = carrello.righeCarrello.Select(r => r.fotografo).Distinct(f => f.id); // bool riprova; do { riprova = false; foreach (IncassoFotografo ii in carrello.incassiFotografi) { if (!fotografiBuoni.Contains(ii.fotografo)) { carrello.incassiFotografi.Remove(ii); riprova = true; break; } } } while(riprova); // Devo sistemare l'incasso del dischetto diviso per quante foto sono state masterizzate per ogni fotografo if (carrello.prezzoDischetto != null && carrello.totMasterizzate > 0) { foreach (IncassoFotografo ii in carrello.incassiFotografi) { decimal mioIncasso = ii.contaMasterizzate * (decimal)carrello.prezzoDischetto / carrello.totMasterizzate; ii.incasso += mioIncasso; ii.incassoMasterizzate = Math.Round(mioIncasso, 2); } } } // Se ho soltanto stampe nel carrello, questo non può essere visibile sul SelfService if (carrello.venduto && !carrello.righeCarrello.Any(r => r.isTipoMasterizzata)) { carrello.visibileSelfService = false; } // Se gestisco il self-service, e se il carrello è venduto, attribuisco l'ID corto per il web if (carrello.venduto && carrello.visibileSelfService) { if (carrello.idCortoSelfService == null) { carrello.idCortoSelfService = generaUnIdCorto(); } } carrello.totaleAPagare = prezzoNettoTotale; }