Esempio n. 1
0
 protected void GVNoCumplimentadas_RowDataBound(object sender, GridViewRowEventArgs e)
 {
     if (e.Row.RowType == DataControlRowType.DataRow && e.Row.DataItem != null)
     {
         AlertSaleOrder ar = (e.Row.DataItem as AlertSaleOrder);
         if (ar != null)
         {
             if (ar.Type == AlertSaleOrderType.Cumplimentada)
                 e.Row.Cells[8].Text = "Disponible";
             else e.Row.Cells[8].Text = "No Disponible";
         }
     }
 }
Esempio n. 2
0
        public bool Execute(out string errors)
        {
            errors = "";

            try
            {
                #region Check if needs to be executed

                if (DateTime.Now.Hour >= Convert.ToInt32(ConfigurationManager.AppSettings["ExecuteHourAlerts"]))
                {
                    // Review if the forecast is executing in the log
                    // If not start the process, otherwise returns true with no errors.
                    if (ControllerManager.Log.IsExecuting(Name, ExecutionStatus.Start))
                    {
                        return(true);
                    }
                    else
                    {
                        ControllerManager.Log.Add(Name, ExecutionStatus.Start, string.Empty);
                    }
                }
                else
                {
                    return(true);
                }

                #endregion

                //------------------------------------------------------------------------------------------------------------------

                List <PurchaseOrderItem> POList = Grundfos.ScalaConnector.ControllerManager.PurchaseOrderItem.GetAlerts();
                List <SaleOrderItem>     saleorderitemsgrouped = Grundfos.ScalaConnector.ControllerManager.SaleOrderItem.PendingSaleOrderQuantity(Config.CurrentDate.AddDays(-70));

                # region Alerta de Ordenes de Compras Confirmadas y no Despachadas
                try
                {
                    List <PurchaseOrderItem> POListAlert1 = POList.FindAll(delegate(PurchaseOrderItem record)
                    {
                        double daysOfWOF = 0;
                        switch (record.PurchaseOrder.WayOfDelivery)
                        {
                        case 1:
                            daysOfWOF = 44;
                            break;

                        case 2:
                            daysOfWOF = 12;
                            break;

                        case 3:
                            daysOfWOF = 4;
                            break;
                        }
                        if ((record.Confirmed == "1") && (record.QuantityOrdered > record.Quantity) &&
                            (record.PurchaseOrder.Location == "01") && (record.PurchaseOrder.Id.StartsWith("00000")))
                        {
                            if (record.PurchaseOrder.PurchaseOrderDelivery.Count > 0)
                            {
                                if ((record.PurchaseOrder.PurchaseOrderDelivery[0].Provider.Id == "900900" ||
                                     record.PurchaseOrder.PurchaseOrderDelivery[0].Provider.Id == "900928"))
                                {
                                    if (!record.PurchaseOrder.PurchaseOrderDelivery[0].ProviderStatus.EndsWith("#") &&
                                        record.PurchaseOrder.PurchaseOrderDelivery[0].DeliveryDate.AddDays(-daysOfWOF) > Config.CurrentDate)
                                    {
                                        return(true);
                                    }
                                }
                                else
                                {
                                    return(true);
                                }
                            }
                            else
                            {
                                return(true);
                            }
                        }
                        return(false);
                    });

                    ControllerManager.AlertPurchaseOrder.CleanAlertPurchaseOrder();

                    foreach (PurchaseOrderItem item in POListAlert1)
                    {
                        AlertPurchaseOrder alert = new AlertPurchaseOrder();

                        alert.Destination = SearchSaleOrderDestination(saleorderitemsgrouped, item);

                        alert.PurchaseOrderCode     = item.PurchaseOrder.Id;
                        alert.PurchaseOrderItemCode = item.Product.Id;
                        alert.Quantity      = item.QuantityOrdered - item.Quantity;
                        alert.Type          = AlertPurchaseOrderType.Alert1;
                        alert.GAP           = 0;
                        alert.WayOfDelivery = (WayOfDelivery)item.PurchaseOrder.WayOfDelivery;
                        alert.ArrivalDate   = item.ArrivalDate;
                        if (item.Product.Provider == null)
                        {
                            alert.PurchaseOrderProviderCode =
                                ControllerManager.Provider.GetProvider("999999").ProviderCode;
                            alert.PurchaseOrderProviderName = ControllerManager.Provider.GetProvider("999999").Name;
                        }
                        else if (!string.IsNullOrEmpty(item.Product.Provider.Id.Trim()))
                        {
                            alert.PurchaseOrderProviderCode = item.Product.Provider.Id;
                            alert.PurchaseOrderProviderName = item.Product.Provider.Name;
                        }
                        else
                        {
                            alert.PurchaseOrderProviderCode = string.Empty;
                            alert.PurchaseOrderProviderName = string.Empty;
                        }

                        double days = 0;
                        switch (item.PurchaseOrder.WayOfDelivery)
                        {
                        case 1:
                            days = 44;
                            break;

                        case 2:
                            days = 12;
                            break;

                        case 3:
                            days = 4;
                            break;
                        }

                        if (item.PurchaseOrder.PurchaseOrderDelivery.Count > 0)
                        {
                            alert.CalculatedArrivalDate = item.PurchaseOrder.PurchaseOrderDelivery[0].DeliveryDate.AddDays(-days);
                        }
                        else
                        {
                            alert.CalculatedArrivalDate = DateTime.MaxValue;
                        }

                        ControllerManager.AlertPurchaseOrder.Save(alert);
                    }
                    ControllerManager.Log.Add(Name, ExecutionStatus.Running, "Alerta de Ordenes de Compras Confirmadas y no Despachadas: Completadas");
                }
                catch (Exception ex)
                {
                    errors = ex.ToString();

                    try
                    {
                        string process = "Alerta de Ordenes de Compras Confirmadas y no Despachadas";
                        ControllerManager.Log.Add(Name, ExecutionStatus.Running, process + ": " + errors);
                        SendErrorEmail(process, errors);
                    }
                    catch
                    {
                    }

                    return(false);
                }

                #endregion

                #region Alerta de Ordenes de Compras No Confirmadas
                try
                {
                    List <PurchaseOrderItem> POListAlert2 = POList.FindAll(delegate(PurchaseOrderItem record)
                    {
                        if ((record.Confirmed != "1") &&
                            (record.PurchaseOrder.Date <
                             Config.CurrentDate.AddDays(-4)) &&
                            (record.PurchaseOrder.Location ==
                             "01") &&
                            (record.QuantityOrdered >
                             record.Quantity) &&
                            (record.PurchaseOrder.Id.
                             StartsWith("00000")))
                        {
                            return(true);
                        }
                        return(false);
                    });

                    foreach (PurchaseOrderItem item in POListAlert2)
                    {
                        AlertPurchaseOrder alert = new AlertPurchaseOrder();

                        alert.Destination = SearchSaleOrderDestination(saleorderitemsgrouped, item);

                        alert.PurchaseOrderCode     = item.PurchaseOrder.Id;
                        alert.PurchaseOrderItemCode = item.Product.Id;
                        alert.Quantity      = item.QuantityOrdered - item.Quantity;
                        alert.Type          = AlertPurchaseOrderType.Alert2;
                        alert.GAP           = Convert.ToInt32((Config.CurrentDate - item.PurchaseOrder.Date).TotalDays);
                        alert.WayOfDelivery = (WayOfDelivery)item.PurchaseOrder.WayOfDelivery;
                        alert.ArrivalDate   = item.ArrivalDate;
                        if ((item.Product.Provider == null) || (item.Product.Provider.Id == " "))
                        {
                            alert.PurchaseOrderProviderCode =
                                ControllerManager.Provider.GetProvider("999999").ProviderCode;
                            alert.PurchaseOrderProviderName = ControllerManager.Provider.GetProvider("999999").Name;
                        }
                        else if (!string.IsNullOrEmpty(item.Product.Provider.Id.Trim()))
                        {
                            alert.PurchaseOrderProviderCode = item.Product.Provider.Id;
                            alert.PurchaseOrderProviderName = item.Product.Provider.Name;
                        }
                        else
                        {
                            alert.PurchaseOrderProviderCode = string.Empty;
                            alert.PurchaseOrderProviderName = string.Empty;
                        }

                        double days = 0;
                        switch (item.PurchaseOrder.WayOfDelivery)
                        {
                        case 1:
                            days = 44;
                            break;

                        case 2:
                            days = 12;
                            break;

                        case 3:
                            days = 4;
                            break;
                        }
                        if (item.PurchaseOrder.PurchaseOrderDelivery.Count > 0)
                        {
                            alert.CalculatedArrivalDate = item.PurchaseOrder.PurchaseOrderDelivery[0].DeliveryDate.AddDays(-days);
                        }
                        else
                        {
                            alert.CalculatedArrivalDate = DateTime.MaxValue;
                        }

                        ControllerManager.AlertPurchaseOrder.Save(alert);
                    }
                    ControllerManager.Log.Add(Name, ExecutionStatus.Running, "Alerta de Ordenes de Compras No Confirmadas: Completadas");
                }
                catch (Exception ex)
                {
                    errors = ex.ToString();

                    try
                    {
                        string process = "Alerta de Ordenes de Compras No Confirmadas";
                        ControllerManager.Log.Add(Name, ExecutionStatus.Running, process + ": " + errors);
                        SendErrorEmail(process, errors);
                    }
                    catch
                    {
                    }

                    return(false);
                }

                #endregion

                #region Alerta de Stock Negativos
                try
                {
                    List <Product> ProdList = Grundfos.ScalaConnector.ControllerManager.Product.GetAlert3();

                    ControllerManager.AlertProduct.CleanAlertProduct();

                    foreach (Product product in ProdList)
                    {
                        AlertProduct alert = new AlertProduct();
                        alert.ProductCode  = product.Id;
                        alert.StandardCost = product.StandardCost;
                        alert.SubTotal     = product.StandardCost * Convert.ToDouble(product.StockQ);
                        alert.Quantity     = product.StockQ;
                        alert.Type         = 1;
                        alert.NegativeDate = DateTime.Today;

                        ControllerManager.AlertProduct.Save(alert);
                    }
                    ControllerManager.Log.Add(Name, ExecutionStatus.Running, "Alertas de Stock Negativo: Completadas");
                }
                catch (Exception ex)
                {
                    errors = ex.ToString();

                    try
                    {
                        string process = "Alertas de Stock Negativo";
                        ControllerManager.Log.Add(Name, ExecutionStatus.Running, process + ": " + errors);
                        SendErrorEmail(process, errors);
                    }
                    catch
                    {
                    }

                    return(false);
                }

                #endregion

                #region Alerta de Ventas no Cumplimentadas
                try
                {
                    List <SaleOrderItem> saleorderitems =
                        Grundfos.ScalaConnector.ControllerManager.SaleOrderItem.PendingSaleOrder(
                            Config.CurrentDate.AddDays(-44));

                    List <PurchaseOrderItem> POListAlert3 = POList.FindAll(delegate(PurchaseOrderItem record)
                    {
                        if ((record.Confirmed == "1") &&
                            (record.PurchaseOrder.Location ==
                             "01") &&
                            (record.PurchaseOrder.Id.
                             StartsWith("00000")))
                        {
                            return(true);
                        }
                        return(false);
                    });

                    ControllerManager.AlertSaleOrder.CleanAlertSaleOrder();

                    foreach (PurchaseOrderItem item in POListAlert3)
                    {
                        AlertSaleOrder alert = new AlertSaleOrder();

                        AlertPurchaseOrderDestination destination =
                            SearchSaleOrderDestination(saleorderitemsgrouped, item);

                        if (destination == AlertPurchaseOrderDestination.Venta)
                        {
                            List <SaleOrderItem> saleorderitem = SearchSaleOrder(saleorderitems, item);

                            foreach (SaleOrderItem orderItem in saleorderitem)
                            {
                                if (item.ArrivalDate > orderItem.DeliveryDate)
                                {
                                    alert.PurchaseOrderCode     = item.PurchaseOrder.Id;
                                    alert.PurchaseOrderItemCode = item.Product.Id;
                                    alert.SaleOrderCode         = orderItem.SaleOrder.Id;
                                    alert.CustomerCode          = orderItem.SaleOrder.CustomerCode;
                                    alert.Quantity                 = (int)orderItem.Quantity;
                                    alert.GAP                      = (item.ArrivalDate - orderItem.DeliveryDate).Days;
                                    alert.WayOfDelivery            = (WayOfDelivery)item.PurchaseOrder.WayOfDelivery;
                                    alert.PurchaseOrderArrivalDate = item.ArrivalDate;
                                    alert.SaleOrderDeliveryDate    = orderItem.DeliveryDate;
                                    alert.OrderDate                = orderItem.SaleOrder.Date;
                                    ControllerManager.AlertSaleOrder.Save(alert);
                                }
                            }
                        }
                    }
                    ControllerManager.Log.Add(Name, ExecutionStatus.Running, "Alertas de Ventas no Cumplimentadas: Completadas");
                }
                catch (Exception ex)
                {
                    errors = ex.ToString();

                    try
                    {
                        string process = "Alertas de Ventas no Cumplimentadas";
                        ControllerManager.Log.Add(Name, ExecutionStatus.Running, process + ": " + errors);
                        SendErrorEmail(process, errors);
                    }
                    catch
                    {
                    }

                    return(false);
                }

                #endregion

                #region Alerta de Stock Futuro Menor al Safety
                //PENDIENTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                try
                {
                    List <PartnerNet.Domain.Product> ProdList = ControllerManager.Product.GetAlertNegativeFutureStock();
                    PartnerNet.Domain.Product        prodtemp = null;

                    foreach (PartnerNet.Domain.Product product in ProdList)
                    {
                        if (prodtemp != product)
                        {
                            AlertProduct alert = new AlertProduct();
                            alert.ProductCode  = product.ProductCode;
                            alert.StandardCost = 0;
                            alert.SubTotal     = 0;
                            alert.Quantity     = product.Forecasts[0].FinalStock;
                            DateTime fechatemp = Convert.ToDateTime("01/01/" + Config.CurrentDate.Year.ToString());
                            fechatemp          = Thread.CurrentThread.CurrentCulture.Calendar.AddWeeks(fechatemp, product.Forecasts[0].Week);
                            alert.NegativeDate = fechatemp.AddDays(-7 + (int)fechatemp.DayOfWeek);
                            alert.Type         = 2;

                            ControllerManager.AlertProduct.Save(alert);

                            prodtemp = product;
                        }
                    }
                    ControllerManager.Log.Add(Name, ExecutionStatus.Running, "Stock Futuro Menor al Safety: Completadas");
                }
                catch (Exception ex)
                {
                    errors = ex.ToString();

                    try
                    {
                        string process = "Stock Futuro Menor al Safety";
                        ControllerManager.Log.Add(Name, ExecutionStatus.Running, process + ": " + errors);
                        SendErrorEmail(process, errors);
                    }
                    catch
                    {
                    }

                    return(false);
                }

                //PENDIENTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                #endregion

                #region Alerta de Nivel de Reposición
                try
                {
                    List <AlertReposition> lstrepotmp = ControllerManager.TransactionHistoryWeekly.GetAlert6(Config.CurrentWeek, Config.CurrentDate.Year) as List <AlertReposition>;
                    ControllerManager.AlertReposition.CleanAlertReposition();

                    List <AlertReposition> aRLst = lstrepotmp.FindAll(delegate(AlertReposition record)
                    {
                        if (record.Product.AlternativeProduct == " " &&
                            record.Product.AlternativeDate == new DateTime(9999, 12, 31)

                            )
                        {
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    });

                    List <AlertReposition> aRLst2 = lstrepotmp.FindAll(delegate(AlertReposition record)
                    {
                        if (record.Product.AlternativeProduct != " " &&
                            record.Product.AlternativeDate != new DateTime(9999, 12, 31)
                            )
                        {
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    });

                    List <string> alternativeProducts = new List <string>();
                    foreach (AlertReposition alertReposition in aRLst2)
                    {
                        alternativeProducts.Add(alertReposition.Product.AlternativeProduct);
                    }

                    List <AlertReposition> lstprodalt = ControllerManager.TransactionHistoryWeekly.GetAlert6(Config.CurrentWeek, Config.CurrentDate.Year, alternativeProducts) as List <AlertReposition>;

                    List <AlertReposition> aRLst3 = lstprodalt.FindAll(delegate(AlertReposition record)
                    {
                        if (record.Product.AlternativeProduct == " " &&
                            record.Product.AlternativeDate == new DateTime(9999, 12, 31)

                            )
                        {
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    });

                    List <SaleOrderItem> soFullLst = Grundfos.ScalaConnector.ControllerManager.SaleOrderItem.SaleOrdersByProduct();
                    foreach (AlertReposition ar in aRLst)
                    {
                        List <SaleOrderItem> soLst = soFullLst.FindAll(delegate(SaleOrderItem record)
                        {
                            if (record.Product.Id == ar.Product.ProductCode)
                            {
                                return(true);
                            }
                            else
                            {
                                return(false);
                            }
                        });

                        double maximumQuantity  = 0;
                        double total            = 0;
                        bool   haveParts        = false;
                        string maximumOrderCode = "Sin Orden";
                        foreach (SaleOrderItem sOI in soLst)
                        {
                            if (sOI.Quantity > maximumQuantity)
                            {
                                maximumQuantity  = sOI.Quantity;
                                maximumOrderCode = sOI.SaleOrderId;
                            }
                            total = total + sOI.Quantity;

                            if (sOI.Product.Parts.Count > 0 && sOI.Product.Parts[0].Type == "B")
                            {
                                haveParts = true;
                                break;
                            }
                        }
                        if (!haveParts)
                        {
                            if (((maximumQuantity * total) / 100) > 40)
                            {
                                ar.IsConflicted = true;
                            }
                            else
                            {
                                ar.IsConflicted = false;
                            }

                            ar.OrderInfo = soLst.Count + "/" + ((maximumQuantity * total) / 100) + "/" + maximumOrderCode;

                            if (!aRLst3.Exists(delegate(AlertReposition record)
                            {
                                if (record.ProductCode == ar.ProductCode)
                                {
                                    return(true);
                                }
                                else
                                {
                                    return(false);
                                }
                            }))
                            {
                                ControllerManager.AlertReposition.Save(ar);
                            }
                        }
                    }

                    foreach (AlertReposition ar in aRLst3)
                    {
                        AlertReposition pastproduct = aRLst2.Find(delegate(AlertReposition record)
                        {
                            if (record.Product.AlternativeProduct == ar.Product.ProductCode)
                            {
                                return(true);
                            }
                            else
                            {
                                return(false);
                            }
                        });

                        List <SaleOrderItem> soLst = soFullLst.FindAll(delegate(SaleOrderItem record)
                        {
                            if (record.Product.Id == ar.Product.ProductCode)
                            {
                                return(true);
                            }
                            else
                            {
                                return(false);
                            }
                        });


                        List <SaleOrderItem> soLstAlt = soFullLst.FindAll(delegate(SaleOrderItem record)
                        {
                            if (record.Product.Id == pastproduct.Product.ProductCode)
                            {
                                return(true);
                            }
                            else
                            {
                                return(false);
                            }
                        });

                        ar.Sales += pastproduct.Sales;

                        int saleMonts = Convert.ToInt32(Math.Round(Convert.ToDecimal(ar.ProductSaleLife + pastproduct.ProductSaleLife) / 4, MidpointRounding.AwayFromZero));
                        if (saleMonts > 12)
                        {
                            saleMonts = 12;
                        }
                        if (saleMonts == 0)
                        {
                            saleMonts = 1;
                        }


                        decimal cuatrimestralSales;
                        decimal divider = Convert.ToDecimal((saleMonts * 3)) / 12;
                        if (divider > 1)
                        {
                            cuatrimestralSales = Math.Round(ar.Sales / divider);
                        }
                        else
                        {
                            cuatrimestralSales = ar.Sales;
                        }

                        if (cuatrimestralSales > 0)
                        {
                            ar.Result = (ar.Product.RepositionLevel * 100 / cuatrimestralSales) - 100;
                        }

                        double maximumQuantity  = 0;
                        double total            = 0;
                        bool   haveParts        = false;
                        string maximumOrderCode = "Sin Orden";
                        foreach (SaleOrderItem sOI in soLst)
                        {
                            if (sOI.Quantity > maximumQuantity)
                            {
                                maximumQuantity  = sOI.Quantity;
                                maximumOrderCode = sOI.SaleOrderId;
                            }
                            total = total + sOI.Quantity;

                            if (sOI.Product.Parts.Count > 0 && sOI.Product.Parts[0].Type == "B")
                            {
                                haveParts = true;
                                break;
                            }
                        }
                        foreach (SaleOrderItem sOI in soLstAlt)
                        {
                            if (sOI.Quantity > maximumQuantity)
                            {
                                maximumQuantity  = sOI.Quantity;
                                maximumOrderCode = sOI.SaleOrderId;
                            }
                            total = total + sOI.Quantity;

                            if (sOI.Product.Parts.Count > 0 && sOI.Product.Parts[0].Type == "B")
                            {
                                haveParts = true;
                                break;
                            }
                        }
                        if (!haveParts)
                        {
                            if (((maximumQuantity * total) / 100) > 40)
                            {
                                ar.IsConflicted = true;
                            }
                            else
                            {
                                ar.IsConflicted = false;
                            }

                            ar.OrderInfo = soLst.Count + "/" + ((maximumQuantity * total) / 100) + "/" + maximumOrderCode;

                            ControllerManager.AlertReposition.Save(ar);
                        }
                    }
                    ControllerManager.Log.Add(Name, ExecutionStatus.Running, "Alertas de Nivel de Reposición: Completadas");
                }
                catch (Exception ex)
                {
                    errors = ex.ToString();

                    try
                    {
                        string process = "Alertas de Nivel de Reposición";
                        ControllerManager.Log.Add(Name, ExecutionStatus.Running, process + ": " + errors);
                        SendErrorEmail(process, errors);
                    }
                    catch
                    {
                    }

                    return(false);
                }

                #endregion

                #region Obtener Totales

                AlertTotal alerttotal;

                for (int i = 1; i <= 6; i++)
                {
                    alerttotal = ControllerManager.AlertTotal.GetAlertTotal(i);

                    switch (i)
                    {
                    case 1:
                        List <PurchaseOrderItem> POListAlertTotal1 = POList.FindAll(delegate(PurchaseOrderItem record)
                        {
                            if ((record.QuantityOrdered >
                                 record.Quantity) &&
                                (record.PurchaseOrder.Location ==
                                 "01") &&
                                (record.PurchaseOrder.Id.
                                 StartsWith("00000")))
                            {
                                return(true);
                            }
                            return(false);
                        });
                        alerttotal.Total = POListAlertTotal1.Count;
                        break;

                    case 2:
                        List <PurchaseOrderItem> POListAlertTotal2 = POList.FindAll(delegate(PurchaseOrderItem record)
                        {
                            if ((record.QuantityOrdered >
                                 record.Quantity) &&
                                (record.PurchaseOrder.Location ==
                                 "01") &&
                                (record.PurchaseOrder.Id.
                                 StartsWith("00000")))
                            {
                                return(true);
                            }
                            return(false);
                        });
                        alerttotal.Total = POListAlertTotal2.Count;
                        break;

                    case 3:
                        alerttotal.Total = ControllerManager.TransactionHistoryWeekly.GetActiveProducts(Config.CurrentWeek, Config.CurrentDate.Year);
                        break;

                    case 4:
                        List <PurchaseOrderItem> POListAlertTotal3 = POList.FindAll(delegate(PurchaseOrderItem record)
                        {
                            if ((record.Confirmed == "1") &&
                                (record.PurchaseOrder.Location ==
                                 "01"))
                            {
                                return(true);
                            }
                            return(false);
                        });
                        alerttotal.Total = POListAlertTotal3.Count;
                        break;

                    case 5:
                        alerttotal.Total = ControllerManager.TransactionHistoryWeekly.GetActiveProducts(Config.CurrentWeek, Config.CurrentDate.Year);
                        break;

                    case 6:
                        alerttotal.Total = ControllerManager.TransactionHistoryWeekly.GetActiveProducts(Config.CurrentWeek, Config.CurrentDate.Year);
                        break;
                    }
                }
                ControllerManager.Log.Add(Name, ExecutionStatus.Running, "Totales obtenidos para las alertas.");
                #endregion

                ControllerManager.Log.Add(Name, ExecutionStatus.Finished, "Alert process finished successfully");
            }