/*Заносим обычное блюдо, если его нет или оно уже БылаПечать!="0"*/
 public bool AddToOrder(OrderItem item)
 {
     if (item.Modifiers.Any())
     {
         AddComponent(item);
         return true;
     }
     if (FindId(item.Id) == null)
     {
         AddComponent(item);
         return true;
     }
     var flag = true;
     foreach (var component in _components)
     {
         var d = (OrderItem)component;
         if (d.BilaPechat == "0" && d.Id == item.Id) flag = false;
     }
     if (flag)
     {
         AddComponent(item);
         return true;
     }
     return false;
 }
 //При нажатии в меню добавляем блюдо в чек
 private void AddLineToOrderScreen(OrderItem line, bool print, bool addDish, bool children)
 {
     ListItem pointer;
     var flag = false;
     var marker = GetMarker(print,children);
     //Выходим, если стол красный "CALCULATE"
     if (_dg.Calc && addDish)
     {
         MessageBox.Show(this.Device, "Этот стол рассчитан!", MessageBoxButtons.OKAY, null, null);
         return;
     }
     //Если Reload, то сюда не попадаем
     //OrderXmlParser занес ордер в CurrentOrder
     //TagGuid = Guid.NewGuid().ToString()
     if (addDish)
     {
         string idD;
         var currentOrder = (ORDERMAN_Lib.Models.Order)_dg.CurrentOrder.Children().ElementAt(0);
         try
         {
             //todo оставить два idD Если первый, то будем использовать родной Ид
             idD = currentOrder.FindIdTagGuid(marker + line.Id).Id;
             idD = line.TagGuid;
             flag = true;
         }
         catch (Exception)
         {
             idD = line.Id;//Попадаем если такого блюда еще нет, используем родной Id
         }
         _dg.TestidD = idD;
         var dictionary = BuilModifiers(line.Id);
         var order = new OrderItem
         {
             Kolichestvo = line.Kolichestvo,
             Name = line.Name,
             Id = line.Id,
             TagGuid = marker + idD,//line.TagGuid,
             BilaPechat = line.BilaPechat,
             Predchek = line.Predchek,
             Price = _dg.Menu.FindId(line.Id).Price,
             Modifiers = dictionary,
             PercentDiscaunt = line.PercentDiscaunt,
             SumDiscaunt = line.SumDiscaunt
         };
         //Дубль без модификаторов недобовляем
         if(!currentOrder.AddToOrder(order)) return; //false - не добавился
         //Через рекорд сэты, так-как добавляются по одному за одно нажатие
         _lstOrders.Group.Append(this.RecordSets[marker + order.Id]);
         pointer = _lstOrders.Group.Last();
         if(flag) pointer.Tag = order.TagGuid;
         //Смотрим обязательные модификаторы
         if (SeeRequiredModificators(GetModifikators(line.Id)))
         {
             PopUpChildren(pointer.Tag.ToString(), pointer);
         }
         return;
     }
     /*Вывод из счета
      проверим возможность из рекорд сета, лезит один раз*/
     //var ord = (IPublicComposite)_dg.CurrentOrder.Children().ElementAt(0);
     //var element = (OrderItem)ord.FindId(line.Id);
     //Если есть выделенные модификаторы, будем красить
     var modifiers = (IModifiers)_dg.CurrentOrder.FindModifiersTagGuid(line.TagGuid);
     var flagChecked = false;
     if (modifiers != null)
     {
         _modifiers = modifiers.GetModifiers();
         if(_modifiers != null) flagChecked = _modifiers.Any(q => q.Value.Select);
     }
     RecordSet record;
     if (flagChecked && marker != RecSets.MarkerOrder.PRINTOFF.ToString())
     {
         record = marker == RecSets.MarkerOrder.POPUPORDER.ToString()
             ? this.RecordSets[RecSets.MarkerOrder.POPUPORDERChecked.ToString() + line.Id]
             : this.RecordSets[RecSets.MarkerOrder.PRINTOFFPOPUPChecked.ToString() + line.Id];
     }
     else record = this.RecordSets[marker + line.Id];
     //todo Если без модификаторов черный/зеленый/красный
     //PRINTON - зеленый (счетчик черный?) без gesture
     //Default черный с gesture
     //PRINTOFF красный
     if (_modifiers == null)
     {
         record = this.RecordSets[RecSets.MarkerOrder.Default.ToString() + line.Id];
     }
     string name;
     if (!_recDictionary.TryGetValue(record.Name, out name) && line.Kolichestvo == "1")
     {
         _recDictionary.Add(record.Name, "so-so");
         _lstOrders.Group.Append(record);
         return;
     }
     //Динамически из счета
     var item = new ListItem(_lstOrders.Group.Definition);
     item.Cells[0].Value = line.Kolichestvo;
     //Получим номер для вывода через StringTables (в line.Name - текстовое имя, если отказаться от таблиц)
     item.Cells[1].Value = this.RecordSets[marker + line.Id].First().Cells[1].Value;//line.Name;
     item.Tag = Guid.NewGuid().ToString(); //line.TagGuid; //Засовываем в Tag старый Ид или новое значение
     line.TagGuid = item.Tag.ToString();
     if (flagChecked && marker != RecSets.MarkerOrder.PRINTOFF.ToString())
     {
         item.TemplateName = marker == RecSets.MarkerOrder.POPUPORDER.ToString() ?
             RecSets.MarkerOrder.POPUPORDERChecked.ToString() : RecSets.MarkerOrder.PRINTOFFPOPUPChecked.ToString();
     }
     else item.TemplateName = marker;
     //todo
     if (_modifiers == null) item.TemplateName = RecSets.MarkerOrder.Default.ToString();
     _lstOrders.Group.Add(item);
 }
 public Order ReadOrder(XElement xElement, FrmOrders frmOrders)
 {
     var element = xElement.Element("Заказ");
     if (element == null) return null;
     var orders = new Order
     {
         OrderNumber = element.Attribute("Номер").Value,
         OrderNumberId = element.Attribute("IdOrder").Value,
         NameGarcon = element.Attribute("Официант").Value,
         NameHall = element.Attribute("Зал").Value,
         NameTable = element.Attribute("Стол").Value,
         NamberOfQuests = element.Attribute("КоличествоГостей").Value,
         Name = element.Attribute("Номер").Value,
     };
     //OrderItem item = null;
     var countTagGuid = 1;
     foreach (var p in element.Elements("СтрокаЗаказа"))
     {
         //Смотрим Стиль
         var kolichestvo = p.Attribute("Количество").Value;
         var bilaPechat = p.Attribute("БылаПечать").Value;
         var productId = p.Attribute("ТоварИД").Value;
         string templateName;
         //Выводим через RecordSet только с количеством "1", поэтому добавим только один такой
         if (kolichestvo == "1" && bilaPechat == "0")
         {
             var flag = p.Attribute("Модификатор").Value != "";
             templateName = flag ? RecSets.MarkerOrder.POPUPORDERChecked + productId : RecSets.MarkerOrder.POPUPORDER + productId;
         }
         else
         {
             templateName = countTagGuid.ToString(CultureInfo.InvariantCulture);
             countTagGuid++;
         }
         string tagGuid;
         try
         {
             //todo оставить два id
             tagGuid = orders.FindIdTagGuid(templateName).Id;
             tagGuid = countTagGuid.ToString(CultureInfo.InvariantCulture);
             countTagGuid++;
         }
         catch (Exception)
         {
             tagGuid = templateName;
         }
         var modifiers = frmOrders.BuilModifiers(productId);
         if(modifiers == null)
         {
             Logger.Info("Ошибка получения модификаторов для Ид: {0}. Строка: {1}. Заказ: {2}",
                 productId, p.ToString(), xElement.ToString());
         }
         var itemOrders = new OrderItem
         {
             Id = productId,
             NumberLine = p.Attribute("НомерСтроки").Value,
             Name = p.Attribute("Товар").Value,
             Kolichestvo = kolichestvo,
             Predchek = p.Attribute("БылПредчек").Value,
             BilaPechat = bilaPechat,
             Price = p.Attribute("Цена").Value,
             TagGuid = tagGuid,
             //Modifiers = frmOrders.BuilModifiers(p.Attribute("ТоварИД").Value),
             Modifiers = modifiers,
             SumDiscaunt = p.Attribute("СуммаСкидки").Value,
             PercentDiscaunt = p.Attribute("ПроцентСкидки").Value
         };
         //orders.AddComponent(item);
         //todo добавлено для многочековых столов, теперь стол расчитан небывает
         if (itemOrders.Predchek == "1") frmOrders._dg.Calc = true;
         var stringModifiers = p.Attribute("Модификатор").Value;
         if (stringModifiers != "")
         {
             char[] delimiterChars = {','};
             var modifier = stringModifiers.Split(delimiterChars);
             foreach (var s in modifier)
             {
                 for (var md = 0; md < itemOrders.Modifiers.Count; md++)
                 {
                     var string1 = s.Replace(" ", "");
                     var string2 = itemOrders.Modifiers.ElementAt(md).Value.Name.Replace(" ", "");
                     if (string1 == string2)
                     {
                         var key = itemOrders.Modifiers.ElementAt(md).Key;
                         var mod = itemOrders.Modifiers[key];
                         mod.Select = true;
                         itemOrders.Modifiers.Remove(key);
                         itemOrders.Modifiers.Add(key, mod);
                     }
                 }
             }
         }
         orders.AddComponent(itemOrders);
     }
     return orders;
 }
 public Order ReadOrderOldModificators(XElement xElement, FrmOrders frmOrders)
 {
     var element = xElement.Element("Заказ");
     if (element == null) return null;
     var orders = new Order
     {
         OrderNumber = element.Attribute("Номер").Value,
         OrderNumberId = element.Attribute("IdOrder").Value,
         NameGarcon = element.Attribute("Официант").Value,
         NameHall = element.Attribute("Зал").Value,
         NameTable = element.Attribute("Стол").Value,
         NamberOfQuests = element.Attribute("КоличествоГостей").Value,
         Name = element.Attribute("Номер").Value,
     };
     OrderItem item = null;
     var countTagGuid = 1;
     foreach (var p in element.Elements("СтрокаЗаказа"))
     {
         //Надо добавить блюдо, к нему модификаторы из меню,
         //а затем изменить их согласно ордера
         if (p.Attribute("Модификатор").Value == "Нет")
         {
             //Смотрим Стиль
             var kolichestvo = p.Attribute("Количество").Value;
             var bilaPechat = p.Attribute("БылаПечать").Value;
             var productId = p.Attribute("ТоварИД").Value;
             string templateName;
             //Выводим через RecordSet только с количеством "1", поэтому добавим только один такой
             if (kolichestvo == "1" && bilaPechat == "0")
             {
                 bool flag;
                 //Проверим наличие выделенных модификаторов и добавим Стиль
                 try
                 {
                     flag = p.ElementsAfterSelf().First().Attribute("Модификатор").Value == "Да";
                 }
                 catch (Exception)
                 {
                     flag = false;
                 }
                 templateName = flag ? RecSets.MarkerOrder.POPUPORDERChecked + productId : RecSets.MarkerOrder.POPUPORDER + productId;
             }
             else
             {
                 templateName = countTagGuid.ToString(CultureInfo.InvariantCulture);
                 countTagGuid++;
             }
             string tagGuid;
             try
             {
                 //todo оставить два id
                 tagGuid = orders.FindIdTagGuid(templateName).Id;
                 tagGuid = countTagGuid.ToString(CultureInfo.InvariantCulture);
                 countTagGuid++;
             }
             catch (Exception)
             {
                 tagGuid = templateName;
             }
             var modifiers = frmOrders.BuilModifiers(productId);
             if (modifiers == null)
             {
                 Logger.Info("Ошибка получения модификаторов для Ид: {0}. Строка: {1}. Заказ: {2}",
                     productId, p.ToString(), xElement.ToString());
             }
             item = new OrderItem
             {
                 Id = productId,
                 NumberLine = p.Attribute("НомерСтроки").Value,
                 Name = p.Attribute("Товар").Value,
                 Kolichestvo = kolichestvo,
                 Predchek = p.Attribute("БылПредчек").Value,
                 BilaPechat = bilaPechat,
                 Price = p.Attribute("Цена").Value,
                 TagGuid = tagGuid,
                 //Modifiers = frmOrders.BuilModifiers(p.Attribute("ТоварИД").Value),
                 Modifiers = modifiers,
                 SumDiscaunt = p.Attribute("СуммаСкидки").Value,
                 PercentDiscaunt = p.Attribute("ПроцентСкидки").Value
             };
             orders.AddComponent(item);
             //todo добавлено для многочековых столов, теперь стол расчитан небывает
             if (item.Predchek == "1") frmOrders._dg.Calc = true;
         }
         //Это модификатор. Изменяем модификаторы в CurrentOrder
         else
         {
             if (item == null) continue;
             try
             {
                 var str = item.Modifiers[p.Attribute("ТоварИД").Value];
                 item.Modifiers.Remove(p.Attribute("ТоварИД").Value);
                 str.Select = true;
                 item.Modifiers.Add(p.Attribute("ТоварИД").Value, str);
             }
             catch (Exception)
             {
                 Logger.Info("ERROR!! МОДИФИКАТОР ОТСУТСТВУЕТ блюдо {0}, модификатор {1}, Ид модификатора {2}",
                     item.Name, p.Attribute("Товар").Value, p.Attribute("ТоварИД").Value);
             }
         }
     }
     return orders;
 }