예제 #1
0
        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);
            }
        }
예제 #2
0
        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;
        }