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);
        }