public void ApplyTo(Order order)
 {
     foreach(var line in order.Lines)
     {
         line.AddModifier(_factory.CreateModifier(Code, ModifierType.Percentage, Value));
     }
 }
        public void RemoveFrom(Order order)
        {
            foreach(var line in order.Lines)
            {
                var modifiers = line.Modifiers.Where(m => m.Code == Code).ToList();

                foreach(var modifier in modifiers)
                {
                    line.RemoveModifier(modifier);
                }
            }
        }
        public void Save(Order order)
        {
            var record = _context.Orders.Include(o => o.Lines).FirstOrDefault(o => o.OrderID == order.OrderID);

            if (record == null)
            {
                record = new OrderRecord();
                record.Lines = new List<OrderLineRecord>();

                _context.Orders.Add(record);
            }

            order.MapTo(record);

            foreach (var line in order.Lines)
            {
                // If the line in the order entity has an OrderLineID, just update the existing orderline
                var lineRecord = record.Lines.FirstOrDefault(l => l.OrderLineID == line.OrderLineID);

                if (lineRecord != null)
                {
                    line.MapTo(lineRecord);
                    _context.Entry(lineRecord).State = EntityState.Modified;
                }
                else
                {
                    lineRecord = line.MapTo<OrderLineRecord>();
                    // lineRecord.ProductOption = line.ProductOption.MapTo<ProductOptionRecord>();
                    record.Lines.Add(lineRecord);
                }
            }

            var linesToRemove = record.Lines.Where(l => !order.Lines.Any(ol => ol.OrderLineID == l.OrderLineID)).ToList();
            _context.OrderLines.RemoveRange(linesToRemove);

            _context.SaveChanges();

            // Populate the primary keys of the orderlines to pick up any new IDs
            foreach(var line in order.Lines.Where(x => x.OrderLineID == 0))
            {
                var lineRecord = record.Lines.Single(l => l.ProductOption.SKU == line.ProductOption.SKU);
                line.SetPrivatePropertyValue("Order_OrderID", lineRecord.Order_OrderID);
                line.SetPrivatePropertyValue("OrderLineID", lineRecord.OrderLineID);
            }

            // Populate the primary key of the order in case this is a new record
            order.SetPrivatePropertyValue("OrderID", record.OrderID);
        }
 public bool AppliesTo(Order order)
 {
     return true;
 }