private bool PaymentViaSourceCode() { var organizationRoleUser = GetOrganizationRoleUser(); var orderables = new List <IOrderable>(); var packageTestIds = new List <long>(); if (PackageId > 0) { var packageRepository = IoC.Resolve <IEventPackageRepository>(); var package = packageRepository.GetByEventAndPackageIds(EventId.Value, PackageId); if (package != null) { packageTestIds = package.Tests.Select(t => t.Test.Id).ToList(); } orderables.Add(package); } var independentTestIds = !packageTestIds.IsNullOrEmpty() ? TestIds.Where(t => !packageTestIds.Contains(t)).Select(t => t).ToList() : TestIds; if (!independentTestIds.IsNullOrEmpty()) { var eventTestRepository = IoC.Resolve <IEventTestRepository>(); orderables.AddRange(eventTestRepository.GetByEventAndTestIds(EventId.Value, independentTestIds)); } if (ProductId.HasValue && ProductId.Value > 0) { IUniqueItemRepository <ElectronicProduct> itemRepository = new ElectronicProductRepository(); orderables.Add(itemRepository.GetById(ProductId.Value)); } if (orderables.IsNullOrEmpty()) { return(false); } Core.Finance.Domain.Order order = null; EventCustomer eventCustomer; try { order = GetOrder(); if (order == null) { eventCustomer = SaveEventCustomer(organizationRoleUser); } else { eventCustomer = UpdateEventCustomer(organizationRoleUser); } } catch { eventCustomer = SaveEventCustomer(organizationRoleUser); } SourceCode sourceCode; if (SourceCodeId > 0) { sourceCode = new SourceCode { Id = SourceCodeId, CouponCode = SourceCode, CouponValue = SourceCodeAmount } } ; else { sourceCode = null; } if (ShippingDetail != null) { IShippingController shippingController = new ShippingController(); ShippingDetail = shippingController.OrderShipping(ShippingDetail); } IOrderController orderController = new OrderController(); bool indentedLineItemsAdded = false; // TODO: applying hook to the system all the indented line items will be attached to the first order item. foreach (var orderable in orderables) { if (!indentedLineItemsAdded) { orderController.AddItem(orderable, 1, organizationRoleUser.Id, organizationRoleUser.Id, sourceCode, eventCustomer, ShippingDetail, OrderStatusState.FinalSuccess); indentedLineItemsAdded = true; } else { orderController.AddItem(orderable, 1, organizationRoleUser.Id, organizationRoleUser.Id, OrderStatusState.FinalSuccess); } } if (order == null) { order = orderController.PlaceOrder(OrderType.Retail, organizationRoleUser.Id); } else { order = orderController.ActivateOrder(order); } SaveProductShippingDetail(order); return(true); }