Ejemplo n.º 1
0
        public List <HistoricView> GetHistoricPrices(int priceBaseId)
        {
            PriceBase pb = ControllerManager.PriceBase.GetById(priceBaseId);

            if (pb == null)
            {
                return(null);
            }

            ICriteria crit = GetCriteria();

            crit.Add(Expression.Eq("Product", pb.Product));
            crit.Add(Expression.Eq("Provider", pb.Provider));
            ProjectionList pl = Projections.ProjectionList();

            pl.Add(Projections.Distinct(Projections.Property("PriceList")));
            pl.Add(Projections.Property("TimeStamp.ModifiedOn"));
            crit.SetProjection(pl);

            crit.AddOrder(new Order("TimeStamp.ModifiedOn", true));

            IList lst = crit.List();

            List <HistoricView> hv = new List <HistoricView>();

            foreach (object[] arr in lst)
            {
                hv.Add(new HistoricView(StringFormat.MilliTimeStamp((DateTime)arr[1]), Convert.ToDecimal(arr[0])));
            }

            return(hv);
        }
Ejemplo n.º 2
0
        private bool AddItem(Quote q, PriceBase priceBase, string observation, int order)
        {
            bool added = true;

            List <QuoteItem> tmplst = new List <QuoteItem>(q.QuoteItems);

            decimal  pL         = 0;
            Currency plCurrency = null;

            QuoteItem qi = tmplst.Find(delegate(QuoteItem record)
            {
                if (record.PriceBase.ID == priceBase.ID)
                {
                    return(true);
                }
                return(false);
            });

            if (qi == null)
            {
                qi       = new QuoteItem();
                qi.Quote = q;
            }
            qi.Observation = observation;
            qi.Order       = order;
            qi.Quantity    = 1;

            if (qi.SaleCondition == null)
            {
                if (qi.PriceBase != null && qi.PriceBase.Provider != null && qi.PriceBase.Provider.SaleConditions != null)
                {
                    qi.SaleCondition = qi.PriceBase.Provider.SaleConditions;
                }
                else
                {
                    qi.SaleCondition = ControllerManager.Lookup.List(LookupType.Incoterm, true)[0];
                }
            }
            if (string.IsNullOrEmpty(qi.DeliveryTime))
            {
                qi.DeliveryTime = ControllerManager.Lookup.List(LookupType.DeliveryTime, true)[0].Description;
            }

            if (qi.DeliveryTerm == null)
            {
                qi.DeliveryTerm = ControllerManager.Lookup.List(LookupType.DeliveryTerm, true)[0];
            }

            ValidateQuoteItem(q, priceBase, qi, out pL, out plCurrency);
            qi.LastPrice = qi.Price;
            q.QuoteItems.Add(qi);

            if (pL == 0)
            {
                added = false;
            }

            return(added);
        }
Ejemplo n.º 3
0
        public PriceAttribute GetPriceAttribute(PriceGroup priceGroup, PriceBase priceBase)
        {
            ICriteria crit = GetCriteria();

            crit.Add(Expression.Eq("PriceBase", priceBase));
            crit.Add(Expression.Eq("PriceGroup", priceGroup));

            return(crit.UniqueResult <PriceAttribute>());
        }
Ejemplo n.º 4
0
        public WorkListItem Get(PriceBase pb, PriceList pl)
        {
            ICriteria crit = GetCriteria();

            ICriteria pa = crit.CreateCriteria("PriceAttribute");

            pa.Add(Expression.Eq("PriceBase", pb));
            crit.Add(Expression.Eq("PriceList", pl));

            return(crit.UniqueResult <WorkListItem>());
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Execute the calculation for the PriceBase record
        /// </summary>
        /// <param name="priceBase">Record to update</param>
        public void Run(int priceBaseId)
        {
            PriceBase priceBase = ControllerManager.PriceBase.GetById(priceBaseId);

            if (priceBase == null)
            {
                return;
            }

            priceBases.Add(priceBase);
            Execute();
        }
Ejemplo n.º 6
0
        public decimal FindMaxDiscountPerPriceBase(PriceBase priceBase)
        {
            ICriteria crit = GetCriteria();
            ICriteria pricelist = crit.CreateCriteria("PriceList");
            ICriteria worklistitems = pricelist.CreateCriteria("Items");
            ICriteria priceattribute = worklistitems.CreateCriteria("PriceAttribute");

            priceattribute.Add(Expression.Eq("PriceBase", priceBase));
            crit.Add(Expression.Not(Expression.Eq("DistributorStatus", DistributorStatus.Disable)));
            crit.SetProjection(Projections.ProjectionList().Add(Projections.Max("Discount")));
            object val = crit.UniqueResult();
            return val != null ? Convert.ToDecimal(val) : 0;
        }
Ejemplo n.º 7
0
        public PublishItem GetPublishItem(Distributor distributor, PriceBase priceBase, int publishListId)
        {
            ICriteria crit        = GetCriteria();
            ICriteria publishlist = crit.CreateCriteria("PublishList");
            ICriteria pricelist   = publishlist.CreateCriteria("PriceList");
            ICriteria dist        = pricelist.CreateCriteria("Distributors");

            crit.Add(Expression.Eq("PriceBase", priceBase));
            dist.Add(Expression.Eq("ID", distributor.ID));
            publishlist.Add(Expression.Eq("ID", publishListId));

            crit.SetMaxResults(1);

            return(crit.UniqueResult <PublishItem>());
        }
Ejemplo n.º 8
0
        public void RollBack(PriceBaseHistory pbh)
        {
            pbh = GetById(pbh.ID);

            PriceBase pb = ControllerManager.PriceBase.GetPriceBase(pbh.Product, pbh.Provider);

            //SaveAudit(pb, HistoryStatus.RollBack);

            pb.PriceList             = pbh.PriceList;
            pb.PriceListCurrency     = pbh.PriceListCurrency;
            pb.PricePurchase         = pbh.PricePurchase;
            pb.PricePurchaseCurrency = pbh.PricePurchaseCurrency;
            pb.PriceSuggest          = pbh.PriceSuggest;
            pb.PriceSuggestCurrency  = pbh.PriceSuggestCurrency;
            pb.ProviderCode          = pbh.ProviderCode;

            ControllerManager.PriceBase.Save(pb);
            CommitChanges();
        }
Ejemplo n.º 9
0
 protected void Page_Load(object sender, EventArgs e)
 {
     if (IsPostBack)
     {
         PriceMasterList1.RecreateFromJavascript();
         foreach (int item in PriceMasterList1.GridState.Items)
         {
             PriceBase  pb = ControllerManager.PriceBase.GetById(item);
             HtmlAnchor a  = new HtmlAnchor();
             a.InnerText             = "[x]";
             a.Attributes["class"]   = "removeItem";
             a.Attributes["onclick"] = "removeItem()";
             HtmlGenericControl h3 = new HtmlGenericControl("h3");
             if (string.IsNullOrEmpty(pb.Product.Code))
             {
                 h3.InnerText = pb.ProviderCode;
             }
             else
             {
                 h3.InnerText = pb.Product.Code;
             }
             HtmlGenericControl p = new HtmlGenericControl("p");
             p.InnerText = pb.Product.Model;
             HtmlGenericControl li = new HtmlGenericControl("li");
             li.Attributes["id"] = pb.ID.ToString();
             li.Controls.Add(a);
             li.Controls.Add(h3);
             li.Controls.Add(p);
             productlist.Controls.Add(li);
         }
     }
     else
     {
         //[BUG]: Se debe setear el foco primero en otro control, para que funcione de primera el
         //buscador de Ajax
         AjaxControlToolkit.Utility.SetFocusOnLoad(txtObservations);
         AjaxControlToolkit.Utility.SetFocusOnLoad(txtDistributor);
     }
 }
Ejemplo n.º 10
0
        public PublishItem GetPublishItem(Distributor distributor, PriceBase priceBase)
        {
            ICriteria crit      = GetCriteria();
            ICriteria pricelist = crit.CreateCriteria("PriceList");
            ICriteria dist      = pricelist.CreateCriteria("Distributors");

            dist.Add(Expression.Eq("ID", distributor.ID));
            crit.Add(Expression.Le("ValidFrom", DateTime.Today));
            pricelist.Add(Expression.Eq("PriceListStatus", PriceListStatus.Active));
            crit.AddOrder(new Order("ValidFrom", false));
            crit.AddOrder(new Order("TimeStamp.CreatedOn", false));

            crit.SetMaxResults(1);

            PublishList publishList = crit.UniqueResult <PublishList>();

            if (publishList != null)
            {
                return(ControllerManager.PublishItem.GetPublishItem(distributor, priceBase, publishList.ID));
            }
            return(null);
        }
Ejemplo n.º 11
0
 public decimal FindMaxDiscountPerPriceBase(PriceBase priceBase)
 {
     return(repository.FindMaxDiscountPerPriceBase(priceBase));
 }
Ejemplo n.º 12
0
        /// <summary>
        /// Imports an existing PriceImport into the final tables.
        /// </summary>
        /// <param name="id">Id of the PriceImport to process</param>
        /// <returns>True if import was successfully, otherwise false.</returns>
        ///

        public bool Import(Guid id, Guid userId)
        {
            List <CategoryBase> lstcat = new List <CategoryBase>();
            PriceImport         pi     = GetById(id);

            if (pi == null)
            {
                return(false);
            }
#if !DEBUG
            if (pi.ImportStatus != ImportStatus.SendToExecute)
            {
                Utils.GetLogger().Info(string.Format("[[PRODUCT IMPORT PROCESS]] Invalid Status: {0}", pi.ImportStatus));
                return(false);
            }

            pi.ImportStatus = ImportStatus.Executing;
            Save(pi);

            NHibernateSession.Flush();
#endif
            Utils.GetLogger().Info(string.Format("[[PRODUCT IMPORT PROCESS]] Starting ID: {0}", id));

            List <Currency>     currlist      = ControllerManager.Currency.GetAll() as List <Currency>;
            Currency            baseCurrency  = ControllerManager.Currency.GetByDescription("€");
            List <CurrencyRate> currencyRates = ControllerManager.CurrencyRate.GetLastList();

            // Todo make sure to free memory
            NHibernateSession.Flush();
            NHibernateSession.Clear();

            DetachedCriteria groupPermissionCriteria = DetachedCriteria.For <CategoryBase>()
                                                       .SetProjection(Projections.Property("ID"))
                                                       .CreateCriteria("PriceImportLogs").Add(Expression.Eq("PriceImport", pi));

            ICriterion groupSubquery = Subqueries.PropertyIn("ID", groupPermissionCriteria);

            ICriteria critCategories = NHibernateSession.CreateCriteria(typeof(CategoryBase));
            critCategories.SetFetchMode("Products", FetchMode.Join);
            critCategories.Add(groupSubquery);
            critCategories.SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer());
            List <CategoryBase> catlist = critCategories.List <CategoryBase>() as List <CategoryBase>;

            pi = this.GetById(id);

            // Save temporal priceBases changes
            IList <PriceBase> priceBasesAdd    = new List <PriceBase>();
            IList <PriceBase> priceBasesModify = new List <PriceBase>();

            ICriteria critLogResults = NHibernateSession.CreateCriteria(typeof(PriceImportLog)).
                                       SetFetchMode("ParsedCategories", FetchMode.Join).
                                       SetFetchMode("ParsedPriceBase", FetchMode.Join).
                                       SetFetchMode("ParsedPriceBase.PriceImports", FetchMode.Join).
                                       SetFetchMode("ParsedProvider", FetchMode.Join).
                                       Add(Expression.Eq("PriceImport", pi)).
                                       Add(Expression.Not(Expression.Eq("Status", PriceImportLogStatus.Error)));


            IList <PriceImportLog> pilList = critLogResults.List <PriceImportLog>();

            this.BeginTransaction();

            Utils.GetLogger().Info("[[PRODUCT IMPORT PROCESS]] Starting.");

            try
            {
                foreach (PriceImportLog logResult in pilList)
                {
                    PriceBase currentPriceBase = null;

                    switch (logResult.Status)
                    {
                    case PriceImportLogStatus.Add:

                        Product p = new Product();
                        p.Status         = ProductStatus.Active;
                        currentPriceBase = ControllerManager.PriceBase.Create(pi, logResult.CodGrundfos, logResult.CodProvider,
                                                                              logResult.Model, logResult.Description, logResult.ParsedProvider, logResult.ParsedFrequency,
                                                                              logResult.TP, FindInMemory(currlist, logResult.TPCurrency),
                                                                              logResult.GRP, FindInMemory(currlist, logResult.GRPCurrency),
                                                                              logResult.PL, FindInMemory(currlist, logResult.PLCurrency),
                                                                              logResult.ParsedCategories,
                                                                              p,
                                                                              baseCurrency,
                                                                              currencyRates);

                        priceBasesAdd.Add(currentPriceBase);
                        break;

                    case PriceImportLogStatus.Modify:
                        currentPriceBase = logResult.ParsedPriceBase;
                        //ControllerManager.PriceBaseHistory.SaveAudit(currentPriceBase, HistoryStatus.ModificationImport, userId);

                        currentPriceBase = ControllerManager.PriceBase.Modify(pi, logResult.CodGrundfos, logResult.CodProvider,
                                                                              logResult.Model, logResult.Description, logResult.ParsedProvider, logResult.ParsedFrequency,
                                                                              logResult.TP, FindInMemory(currlist, logResult.TPCurrency),
                                                                              logResult.GRP, FindInMemory(currlist, logResult.GRPCurrency),
                                                                              logResult.PL, FindInMemory(currlist, logResult.PLCurrency),
                                                                              logResult.ParsedCategories, currentPriceBase, baseCurrency, HistoryStatus.PriceChange, currencyRates);

                        priceBasesModify.Add(currentPriceBase);
                        break;
                    }

                    if (currentPriceBase != null)
                    {
                        foreach (CategoryBase cb in logResult.ParsedCategories)
                        {
                            catlist[catlist.IndexOf(cb)].Products.Add(currentPriceBase.Product);
                            if (!lstcat.Exists(delegate(CategoryBase record){ if ((record.ID == cb.ID))
                                                                              {
                                                                                  return(true);
                                                                              }
                                                                              return(false); }))
                            {
                                lstcat.Add(cb);
                            }
                        }
                    }

                    if (logResult.FileIndex % 500 == 0)
                    {
                        Utils.GetLogger().Debug(string.Format("[[PRODUCT IMPORT PROCESS]] Processing line: {0}", logResult.FileIndex));
                    }
                }
#if !DEBUG
                pi.ImportStatus         = ImportStatus.Processed;
                pi.TimeStamp.ModifiedBy = userId;
                pi.TimeStamp.ModifiedOn = DateTime.Now;
                Save(pi);
#endif
                // Make sure to process insert & updates in order.
                foreach (PriceBase pb in priceBasesAdd)
                {
                    pb.Product.TimeStamp.CreatedBy = userId;
                    pb.Product.TimeStamp.CreatedOn = DateTime.Now;
                    NHibernateSession.Save(pb.Product);
                }

                foreach (PriceBase pb in priceBasesAdd)
                {
                    pb.TimeStamp.CreatedBy = userId;
                    pb.TimeStamp.CreatedOn = DateTime.Now;
                    NHibernateSession.Save(pb);
                }

                foreach (PriceBase pb in priceBasesModify)
                {
                    pb.TimeStamp.ModifiedBy = userId;
                    pb.TimeStamp.ModifiedOn = DateTime.Now;
                    NHibernateSession.Save(pb);
                }

                foreach (PriceBase pb in priceBasesModify)
                {
                    pb.Product.TimeStamp.ModifiedBy = userId;
                    pb.Product.TimeStamp.ModifiedOn = DateTime.Now;
                    NHibernateSession.Save(pb.Product);
                }

                // Commit changes to DB
                CommitChanges();

                IQuery q = NHibernateSession.GetNamedQuery("CategoryCountUpdate");
                foreach (CategoryBase categoryBase in lstcat)
                {
                    q.SetInt32("CategoryId", categoryBase.ID);
                    q.UniqueResult();
                }

                IList <PriceBase> pbList = ControllerManager.PriceBase.Get(pi, PriceBaseStatus.NotVerified);
                PriceCalculator   pc     = new PriceCalculator(false, userId);
                pc.Run(pbList);

                // TODO: Send email to creator looking for the userId.
                // TODO: This process is run out of the web server, so it should look for it.

                Utils.GetLogger().Info("[[PRODUCT IMPORT PROCESS]] Finished Processing");
            }
            catch (Exception ex)
            {
                Utils.GetLogger().Error(ex);

                this.RollbackChanges();

                pi = GetById(id);
                pi.ImportStatus = ImportStatus.Failed;
                Save(pi);
                CommitChanges();

                throw ex;
            }

            return(true);
        }
Ejemplo n.º 13
0
        /// <summary>Constructor helper</summary>
        /// <param name="baseVal">Value exclusive or inclusive VAT</param>
        /// <param name="vatRate">VAT rate (in %)</param>
        /// <param name="currencyUnit">Price currency</param>
        /// <param name="base">Specification of 1st parameter: exclusive/inclusive VAT</param>
        /// <exception cref = "PriceException">Thrown when VAT rate is negative</exception>
        private void Create(decimal baseVal, decimal vatRate, CurrencyUnit currencyUnit, PriceBase @base = PriceBase.Excl)
        {
            if (vatRate < 0)
            {
                throw new PriceException(PriceException.VAT_RATE_NEGATIVE);
            }

            VATrate = vatRate;

            exclVAT = @base == PriceBase.Excl ? baseVal : baseVal / VATfactor;

            if (!IsZero)
            {
                CurrencyUnit = currencyUnit.ThrowIfNull(nameof(currencyUnit));
            }
        }
Ejemplo n.º 14
0
 /// <summary>Constructor</summary>
 /// <param name="baseVal">Value exclusive or inclusive VAT</param>
 /// <param name="vatRate">VAT rate (in %)</param>
 /// <param name="currencyUnit">Price currency</param>
 /// <param name="base">Specification of 1st parameter: exclusive/inclusive VAT</param>
 /// <exception cref = "PriceException">Thrown when VAT rate is negative</exception>
 public Price(decimal baseVal, decimal vatRate, CurrencyUnit currencyUnit, PriceBase @base = PriceBase.Excl) =>
Ejemplo n.º 15
0
 /// <summary>Constructor</summary>
 /// <param name="baseVal">Amount exclusive or inclusive VAT</param>
 /// <param name="vatRate">VAT rate (in %)</param>
 /// <param name="currencyUnit">Currency Unit used</param>
 /// <param name="measureUnit">Measure Unit used (default: QuantityUnit.Item)</param>
 /// <param name="base">Specification of 1st parameter: exclusive/inclusive VAT</param>
 /// <exception cref = "PriceException">Thrown when VAT rate is negative</exception>
 public UnitPrice(decimal baseAmount, decimal vatRate, CurrencyUnit currencyUnit, MeasureUnit measureUnit, PriceBase @base = PriceBase.Excl) :
     base(baseAmount, vatRate, currencyUnit, @base) =>
Ejemplo n.º 16
0
        private bool ValidateQuoteItem(Quote q, PriceBase priceBase, QuoteItem qi, out decimal pL, out Currency plCurrency)
        {
            plCurrency = null;
            pL         = 0;

            PublishItem    pi = ControllerManager.PublishList.GetPublishItem(q.Distributor, priceBase);
            PriceAttribute pa = null;

            if (pi != null)
            {
                // Lista de Precio (Publicada)
                qi.PriceBase = priceBase;
                pL           = pi.Price;
                plCurrency   = pi.PriceCurrency;
                qi.Source    = pi.PublishList.PriceList.Name;
            }
            else
            {
                if (q.Distributor.PriceList != null)
                {
                    pa = ControllerManager.PriceAttribute.GetPriceAttribute(q.Distributor.PriceList.PriceGroup,
                                                                            priceBase);
                    if (pa != null)
                    {
                        // Pais
                        qi.PriceBase = priceBase;
                        pL           = pa.Price;
                        plCurrency   = pa.PriceCurrency;
                        qi.Source    = Resource.Business.GetString("Country");
                    }
                }

                if (pa == null)
                {
                    // Base o Fuera de Lista
                    decimal?factor = null;
                    if (q.Distributor.PriceList != null)
                    {
                        if (q.Distributor.PriceList.PriceGroup.Adjust != null)
                        {
                            factor = q.Distributor.PriceList.PriceGroup.Adjust;
                        }
                    }
                    if (factor == null || factor == 0)
                    {
                        factor = 1;
                    }
                    qi.PriceBase = priceBase;
                    pL           = priceBase.PriceList / Convert.ToDecimal(factor);
                    plCurrency   = priceBase.PriceListCurrency;

                    if (priceBase.Status == PriceBaseStatus.Verified)
                    {
                        qi.Source = Resource.Business.GetString("Base");
                    }
                    else if (priceBase.Status == PriceBaseStatus.NotVerified)
                    {
                        qi.Source = Resource.Business.GetString("OutOfList");
                    }
                }
            }

            decimal lastPrice = qi.Price;

            if (plCurrency != null)
            {
                qi.Price         = Math.Round(pL * lstRates[plCurrency.ID - 1, q.Currency.ID - 1].Rate, 3);
                qi.PriceCurrency = q.Currency;
                qi.CurrencyRate  = ControllerManager.CurrencyRate.GetLast(q.Currency);
            }

            return(lastPrice == qi.Price);
        }
Ejemplo n.º 17
0
        private bool AddItem(Quote q, PriceBase priceBase, string observation)
        {
            bool added = true;

            List <QuoteItem> tmplst = new List <QuoteItem>(q.QuoteItems);

            if (tmplst.Exists(delegate(QuoteItem record)
            {
                if (record.PriceBase.ID == priceBase.ID)
                {
                    return(true);
                }
                return(false);
            }))
            {
                return(true);
            }

            QuoteItem qi = new QuoteItem();

            qi.Observation = observation;
            qi.Quote       = q;

            PublishItem    pi = ControllerManager.PublishList.GetPublishItem(q.Distributor, priceBase);
            PriceAttribute pa = null;

            if (pi != null)
            {
                // Lista de Precio (Publicada)
                qi.PriceBase     = priceBase;
                qi.Price         = pi.Price;
                qi.PriceCurrency = pi.PriceCurrency;
                qi.CurrencyRate  = pi.CurrencyRate;
                qi.Source        = pi.PublishList.PriceList.Name;
            }
            else
            {
                if (q.Distributor.PriceList != null)
                {
                    pa = ControllerManager.PriceAttribute.GetPriceAttribute(q.Distributor.PriceList.PriceGroup,
                                                                            priceBase);
                    if (pa != null)
                    {
                        // Pais
                        qi.PriceBase     = priceBase;
                        qi.Price         = pa.Price;
                        qi.PriceCurrency = pa.PriceCurrency;
                        qi.CurrencyRate  = pa.CurrencyRate;
                        qi.Source        = Resource.Business.GetString("Country");
                    }
                }

                if (pa == null)
                {
                    // Base
                    decimal?factor = null;
                    if (q.Distributor.PriceList != null)
                    {
                        if (q.Distributor.PriceList.PriceGroup.Adjust != null)
                        {
                            factor = q.Distributor.PriceList.PriceGroup.Adjust;
                        }
                    }
                    if (factor == null || factor == 0)
                    {
                        factor = 1;
                    }
                    qi.PriceBase     = priceBase;
                    qi.Price         = priceBase.PriceList / Convert.ToDecimal(factor);
                    qi.PriceCurrency = priceBase.PriceListCurrency;
                    qi.CurrencyRate  = priceBase.CurrencyRate;

                    if (priceBase.Status == PriceBaseStatus.Verified)
                    {
                        qi.Source = Resource.Business.GetString("Base");
                    }
                    else if (priceBase.Status == PriceBaseStatus.NotVerified)
                    {
                        qi.Source = Resource.Business.GetString("OutOfList");
                    }
                }
            }

            if (qi.Price > 0)
            {
                q.QuoteItems.Add(qi);
            }
            else
            {
                added = false;
            }

            return(added);
        }
Ejemplo n.º 18
0
        public Quote AddItems(GridState gridState, int quoteId, string distributorName, string description, string observations, int vigency, int quoteCondition, int quoteIntroText, string email, string contact, out bool canfinal, List <int> contactids, int currencyId)
        {
            lstRates = ControllerManager.CurrencyRate.GetArray();

            canfinal = true;
            Currency c = ControllerManager.Currency.GetById(currencyId);
            Quote    q = new Quote();

            if (quoteId > 0)
            {
                q = repository.GetById(quoteId);
            }

            Distributor d = ControllerManager.Distributor.GetByName(distributorName);

            q.Distributor  = d;
            q.Condition    = ControllerManager.Lookup.GetById(quoteCondition);
            q.Description  = description;
            q.IntroText    = ControllerManager.Lookup.GetById(quoteIntroText);
            q.Observations = observations;
            q.Status       = QuoteStatus.Draft;
            q.Vigency      = ControllerManager.Lookup.GetById(vigency);
            q.Currency     = c;
            q.CurrencyRate = ControllerManager.CurrencyRate.GetLast(q.Currency);

            List <Contact> temp = new List <Contact>(d.Contacts);

            AddContactNotifications(q, temp, contactids);
            if (!string.IsNullOrEmpty(email.Trim()))
            {
                AddNotifications(q, contact.Trim(), email.Trim());
            }

            if (q.QuoteNotifications.Count == 0 && !string.IsNullOrEmpty(q.Distributor.Email))
            {
                AddNotifications(q, q.Distributor.Contact, q.Distributor.Email);
            }
            else if (q.QuoteNotifications.Count == 0 && !string.IsNullOrEmpty(q.Distributor.AlternativeEmail))
            {
                AddNotifications(q, q.Distributor.Contact, q.Distributor.AlternativeEmail);
            }

            //Si no limpiamos los items antes de agregarlos, se ahorraria tiempo y se podria acomodar por fecha de creación.
            //¿Porque se sacan todos?
            //q.QuoteItems.Clear();

            List <PriceBase> temppblist = ControllerManager.PriceBase.GetPriceBases(string.Empty, null, null, null, null, null, null, false, gridState.Items, false, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);

            int i = 1;

            foreach (int item in gridState.Items)
            {
                PriceBase pb = temppblist.Find(delegate(PriceBase record)
                {
                    if (record.ID == item)
                    {
                        return(true);
                    }
                    return(false);
                });
                canfinal = canfinal && AddItem(q, pb, string.Empty, i);
                i++;
            }


            //foreach (PriceBase priceBase in temppblist)
            //    canfinal = canfinal && AddItem(q, priceBase, string.Empty);

            repository.Save(q);
            repository.CommitChange();
            q.Number = q.ID.ToString("000000");

            if (quoteId == 0)
            {
                PermissionManager.AddEntityPermision(q.GetType(), q.ID.ToString(), MembershipHelper.GetUser().UserName);
            }

            return(q);
        }