private bool ProdItemEvaluate(int row, string itemName)
        {
            ComplexRecipeDetail detail = recipe.DetailsProd [row];

            if (detail.ItemId >= 0 && detail.ItemName == itemName)
            {
                return(true);
            }

            double currentQuantity = detail.Quantity;

            string codeLot;
            long   lotId;
            Item   item = Item.GetByAny(itemName, out barcodeUsed, out codeQtty, out codeLot, out lotId);

            if (!ProdItemEvaluate(row, item, true))
            {
                return(false);
            }

            // no quantity from the barcode scanner
            if (codeQtty.IsZero())
            {
                codeQtty = currentQuantity;
            }

            return(true);
        }
        private bool OperationDetailsValidate()
        {
            #region Validate materials

            if (recipe.DetailsMat.Count == 0)
            {
                return(false);
            }

            MatCurrentColumnEvaluate();
            bool hasValidMaterialQuantities = false;

            for (int i = recipe.DetailsMat.Count - 1; i >= 0; i--)
            {
                try {
                    // Validate Item
                    string itemName = recipe.DetailsMat [i].ItemName.Trim();
                    // If the gooods field is empty then this line has to be skipped
                    if (itemName.Length == 0)
                    {
                        // If this is not the first line then delete it
                        if (i > 0)
                        {
                            recipe.DetailsMat.RemoveAt(i);
                            continue;
                        }

                        DetailsValidationWarning(Translator.GetString("There are no valid materials!"));
                        MatEditGridField(0, colItem.Index);
                        return(false);
                    }

                    Item item = Item.GetById(recipe.DetailsMat [i].ItemId);
                    if (item == null || item.Name != itemName)
                    {
                        DetailsValidationWarning(string.Format(Translator.GetString("Invalid item at row {0}!"), i + 1));
                        MatEditGridField(i, colItem.Index);
                        return(false);
                    }

                    // Validate quantity
                    double qty = recipe.DetailsMat [i].Quantity;
                    if ((!editMode && qty <= 0) || (editMode && qty < 0))
                    {
                        DetailsValidationWarning(string.Format(Translator.GetString("Invalid quantity of item \"{0}\"!"), item.Name));
                        MatEditGridField(i, colQuantity.Index);
                        return(false);
                    }

                    if (qty > 0)
                    {
                        hasValidMaterialQuantities = true;
                    }
                } catch {
                    DetailsValidationWarning(string.Format(Translator.GetString("Error at row {0}!"), i + 1));
                    MatEditGridField(i, colItem.Index);
                    return(false);
                }
            }

            if (!hasValidMaterialQuantities)
            {
                if (editMode)
                {
                    ResponseType ret = DetailsValidationQuestion(Translator.GetString("There are no materials with quantities greater than 0! The recipe will be deleted. Are you sure?"));
                    if (ret == ResponseType.No)
                    {
                        return(false);
                    }
                }
                else
                {
                    DetailsValidationWarning(Translator.GetString("The recipe must contain at least one material with quantity greater than 0."));
                    return(false);
                }
            }


            #endregion

            #region Validate products

            if (recipe.DetailsProd.Count == 0)
            {
                return(false);
            }

            ProdCurrentColumnEvaluate();
            bool hasValidProductQuantities = false;

            for (int i = recipe.DetailsProd.Count - 1; i >= 0; i--)
            {
                try {
                    // Validate Item
                    string itemName = recipe.DetailsProd [i].ItemName.Trim();
                    // If the gooods field is empty then this line has to be skipped
                    if (itemName.Length == 0)
                    {
                        // If this is not the first line then delete it
                        if (i > 0)
                        {
                            recipe.DetailsProd.RemoveAt(i);
                            continue;
                        }

                        DetailsValidationWarning(Translator.GetString("There are no valid products!"));
                        ProdEditGridField(0, colSecondItem.Index);
                        return(false);
                    }

                    Item item = Item.GetById(recipe.DetailsProd [i].ItemId);
                    if (item == null || item.Name != itemName)
                    {
                        DetailsValidationWarning(string.Format(Translator.GetString("Invalid item at row {0}!"), i + 1));
                        ProdEditGridField(i, colSecondItem.Index);
                        return(false);
                    }

                    // Validate quantity
                    double qty = recipe.DetailsProd [i].Quantity;
                    if ((!editMode && qty <= 0) || (editMode && qty < 0))
                    {
                        DetailsValidationWarning(string.Format(Translator.GetString("Invalid quantity of item \"{0}\"!"), item.Name));
                        ProdEditGridField(i, colSecondQuantity.Index);
                        return(false);
                    }

                    if (qty > 0)
                    {
                        hasValidProductQuantities = true;
                    }
                } catch {
                    DetailsValidationWarning(string.Format(Translator.GetString("Error at row {0}!"), i + 1));
                    ProdEditGridField(i, colSecondItem.Index);
                    return(false);
                }
            }

            if (hasValidMaterialQuantities && !hasValidProductQuantities)
            {
                if (editMode)
                {
                    ResponseType ret = DetailsValidationQuestion(Translator.GetString("There are no products with quantities greater than 0! The recipe will be deleted. Are you sure?"));
                    if (ret == ResponseType.No)
                    {
                        return(false);
                    }
                }
                else
                {
                    DetailsValidationWarning(Translator.GetString("The recipe must contain at least one product with quantity greater than 0."));
                    return(false);
                }
            }

            #endregion

            for (int i = 0; i < recipe.DetailsMat.Count; i++)
            {
                ComplexRecipeDetail detMat = recipe.DetailsMat [i];
                foreach (ComplexRecipeDetail detProd in recipe.DetailsProd)
                {
                    if (detMat.ItemId != detProd.ItemId)
                    {
                        continue;
                    }

                    DetailsValidationWarning(string.Format(Translator.GetString("The item \"{0}\" is used as a material and as a product!"), detMat.ItemName));
                    MatEditGridField(i, colItem.Index);
                    return(false);
                }
            }

            if (!hasValidMaterialQuantities || !hasValidProductQuantities)
            {
                recipe.ClearDetails();
            }

            return(true);
        }