示例#1
0
        public Core.Finance.Domain.Order GetOrder(long orderId)
        {
            OrderEntity orderEntity;

            using (var myAdapter = PersistenceLayer.GetDataAccessAdapter())
            {
                var linqMetaData = new LinqMetaData(myAdapter);
                try
                {
                    orderEntity = linqMetaData.Order.Single(o => o.OrderId == orderId);
                }
                catch (NotSupportedException)
                {
                    throw new ObjectNotFoundInPersistenceException <Core.Finance.Domain.Order>(orderId);
                }
            }
            List <OrderDetail> orderDetails = _orderDetailRepository.GetOrderDetailsForOrder(orderId);
            IEnumerable <PaymentInstrument> paymentsApplied = _paymentInstrumentRepository.GetByOrderId
                                                                  (orderId);

            Core.Finance.Domain.Order order = _mapper.Map(orderEntity);
            order.OrderDetails    = orderDetails;
            order.PaymentsApplied = paymentsApplied.ToList();

            // TODO: This has to be moved to each payment instrument repository.
            // HACK: This is done to fetch datarecorder metadata for the payments made for this order.
            var payments = _paymentRepository.GetByOrderId(order.Id);

            order.PaymentsApplied.ForEach(
                pa => pa.DataRecorderMetaData = payments.Single(p => p.Id == pa.PaymentId).DataRecorderMetaData);

            return(order);
        }
示例#2
0
        public Core.Finance.Domain.Order RefundOrder(Core.Finance.Domain.Order order)
        {
            if (!_lineItems.Any())
            {
                throw new InvalidOperationException("The order must contain at least one line item.");
            }

            if (order == null)
            {
                throw new InvalidOperationException("The order can not be null.");
            }

            using (var transaction = new TransactionScope())
            {
                foreach (var lineItem in _lineItems)
                {
                    OrderItem orderItem = _orderItemRepository.SaveOrderItem(lineItem.SecondValue.Id,
                                                                             lineItem.SecondValue.OrderItemType);
                    lineItem.FirstValue.OrderItemId = orderItem.Id;
                    lineItem.FirstValue.OrderId     = order.Id;
                    order.OrderDetails.Add(lineItem.FirstValue);
                }
                order = _orderRepository.SaveOrder(order);
                transaction.Complete();
            }
            _lineItems.Clear();
            return(order);
        }
 private Func <PaymentInstrument, bool> GetClosingCountPredicate(Core.Finance.Domain.Order currentOrder)
 {
     return(pa => pa.DataRecorderMetaData != null &&
            pa.DataRecorderMetaData.DataRecorderCreator.Id == currentOrder.DataRecorderMetaData.DataRecorderCreator.Id &&
            pa.DataRecorderMetaData.DateCreated <= currentOrder.DataRecorderMetaData.DateCreated.AddHours(1) &&
            (pa is ECheckPayment || pa is ChargeCardPayment) && pa.Amount > 0);
 }
        private void CreatePaymentModeMetrics(EventMetricsViewData eventMetricsViewData,
                                              Core.Finance.Domain.Order order, bool noShow)
        {
            var organizationRoleUserCreator =
                _organizationRoleUserRepository.GetOrganizationRoleUser(order,
                                                                        o =>
                                                                        o.DataRecorderMetaData.DataRecorderCreator.Id);

            // If the customer is noShow and Unpiad the count remain same.
            if (noShow || order.DiscountedTotal != order.TotalAmountPaid)
            {
                return;
            }

            var roleId = GetParentRoleIdByRoleId(organizationRoleUserCreator.RoleId);

            if (roleId == (int)Roles.CallCenterRep)
            {
                eventMetricsViewData.PhonePayments += order.DiscountedTotal;
                eventMetricsViewData.PhonePaymentCount++;
            }
            else if (roleId == (int)Roles.Technician)
            {
                eventMetricsViewData.OnsitePaymentCount++;
                eventMetricsViewData.OnsitePayments += order.DiscountedTotal;
            }
            else if (roleId == (int)Roles.Customer)
            {
                eventMetricsViewData.InternetPaymentCount++;
                eventMetricsViewData.InternetPayments += order.DiscountedTotal;
            }
        }
        public CallCenterRepStatisticsViewData GetClosedEventCustomerStatisticsForCallCenterRep(long callCenterCallCenterUserId,
                                                                                                DateTime startDate, DateTime endDate)
        {
            List <Core.Finance.Domain.Order> orders =
                _orderRepository.GetAllOrdersCreatedByCallCenterRep(callCenterCallCenterUserId, startDate, endDate);

            IUniqueItemRepository <EventCustomer> eventCustomerRepository = new EventCustomerRepository();

            int totalCustomers, totalCancelled, totalNoShow, totalAttended;

            totalCustomers = totalCancelled = totalNoShow = totalAttended = 0;

            decimal totalAmount = 0m;

            foreach (var order in orders)
            {
                Core.Finance.Domain.Order currentOrder = order;

                //It will ignore 100% discounted orders.
                if (GetTotalPackagePriceDiscountPredicate(order))
                {
                    continue;
                }

                if (currentOrder != null && !GetReSchedulePredicate(currentOrder) && order.PaymentsApplied.Any(GetClosingCountPredicate(currentOrder)))
                {
                    totalCustomers++;

                    // It will eliminate cancelled records. But add to the the cancelled records.
                    if (!order.OrderDetails.Any(od => (od.DetailType == OrderItemType.EventPackageItem || od.DetailType == OrderItemType.EventTestItem) && od.IsCompleted))
                    {
                        totalCancelled++;
                        continue;
                    }

                    var activeOrderDetail = _orderController.GetActiveOrderDetail(order);

                    if (activeOrderDetail != null && activeOrderDetail.EventCustomerOrderDetail != null)
                    {
                        var eventCustomer =
                            eventCustomerRepository.GetById(
                                activeOrderDetail.EventCustomerOrderDetail.EventCustomerId);

                        if (eventCustomer.AppointmentId.HasValue && eventCustomer.NoShow)
                        {
                            totalNoShow++;
                            continue;
                        }
                        if (eventCustomer.TestConducted)
                        {
                            totalAttended++;
                        }
                    }
                    totalAmount += order.DiscountedTotal;
                }
            }
            return(new CallCenterRepStatisticsViewData(totalCustomers, totalCancelled, totalNoShow, totalAttended,
                                                       totalAmount));
        }
        // This method determines if 100% coupon is applied.
        private bool GetTotalPackagePriceDiscountPredicate(Core.Finance.Domain.Order currentOrder)
        {
            var activeOrderDetail = _orderController.GetActiveOrderDetail(currentOrder);

            if (activeOrderDetail != null && activeOrderDetail.SourceCodeOrderDetail != null && ((activeOrderDetail.Price * activeOrderDetail.Quantity) == activeOrderDetail.SourceCodeOrderDetail.Amount))
            {
                return(true);
            }
            return(false);
        }
        private void CreateRevenueMetrics(EventMetricsViewData eventMetricsViewData, Core.Finance.Domain.Order order, bool noShow)
        {
            if (order.DiscountedTotal > order.TotalAmountPaid)
            {
                eventMetricsViewData.UnPaidCount++;
                eventMetricsViewData.UnPaidRevenue += order.DiscountedTotal - order.TotalAmountPaid;
                if (!noShow)
                {
                    eventMetricsViewData.UnPaidExcluedeNoShowCount++;
                    eventMetricsViewData.UnPaidExcluedeNoShowRevenue += order.DiscountedTotal - order.TotalAmountPaid;
                }
            }

            //if (order.PaymentsApplied.Any(pa => pa.PaymentType == PaymentType.CreditCard))
            //{
            //    var chargeCardPayment = order.PaymentsApplied.Where(pa => pa.PaymentType == PaymentType.CreditCard);
            //    //eventMetricsViewData.ChargeCardCount += chargeCardPayment.Count();
            //    eventMetricsViewData.ChargeCardCount++;
            //    eventMetricsViewData.ChargeCardRevenue += chargeCardPayment.Sum(ccp => ccp.Amount);
            //}
            //if (order.PaymentsApplied.Any(pa => pa.PaymentType == PaymentType.Check))
            //{
            //    var checkPayment = order.PaymentsApplied.Where(pa => pa.PaymentType == PaymentType.Check);
            //    //eventMetricsViewData.CheckCount += checkPayment.Count();
            //    eventMetricsViewData.CheckCount++;
            //    eventMetricsViewData.CheckRevenue += checkPayment.Sum(ccp => ccp.Amount);
            //}
            //if (order.PaymentsApplied.Any(pa => pa.PaymentType == PaymentType.ElectronicCheck))
            //{
            //    var eCheckPayment = order.PaymentsApplied.Where(pa => pa.PaymentType == PaymentType.ElectronicCheck);
            //    //eventMetricsViewData.ECheckCount += eCheckPayment.Count();
            //    eventMetricsViewData.ECheckCount++;
            //    eventMetricsViewData.ECheckRevenue += eCheckPayment.Sum(ccp => ccp.Amount);
            //}
            //if (order.PaymentsApplied.Any(pa => pa.PaymentType == PaymentType.Cash))
            //{
            //    var cashPayment = order.PaymentsApplied.Where(pa => pa.PaymentType == PaymentType.Cash);
            //    //eventMetricsViewData.CashCount += cashPayment.Count();
            //    eventMetricsViewData.CashCount++;
            //    eventMetricsViewData.CashRevenue += cashPayment.Sum(ccp => ccp.Amount);
            //}
            //if (order.PaymentsApplied.Any(pa => pa.PaymentType == PaymentType.GiftCertificate))
            //{
            //    var giftCertificatePayment =
            //        order.PaymentsApplied.Where(pa => pa.PaymentType == PaymentType.GiftCertificate);
            //    //eventMetricsViewData.GiftCertificateCount += giftCertificatePayment.Count();
            //    eventMetricsViewData.GiftCertificateCount++;
            //    eventMetricsViewData.GiftCertificateRevenue += giftCertificatePayment.Sum(ccp => ccp.Amount);
            //}
            //eventMetricsViewData.TotalRevenue += order.DiscountedTotal;
        }
        private OrderDetail GetCurrentOrder(long customerId, long eventId)
        {
            IOrderRepository orderRepository = new OrderRepository();

            try
            {
                _order = orderRepository.GetOrder(customerId, eventId);
                IOrderController orderController = new OrderController();
                return(orderController.GetActiveOrderDetail(_order));
            }
            catch
            {
                return(null);
            }
        }
示例#9
0
        private void SetCreditCardOnFileDetails(Core.Finance.Domain.Order order)
        {
            var creditCardPaymentInstrument =
                order.PaymentsApplied.OrderBy(pa => pa.DataRecorderMetaData.DateCreated).LastOrDefault(pa => pa.PaymentType == PaymentType.CreditCard) as
                ChargeCardPayment;

            if (creditCardPaymentInstrument == null)
            {
                return;
            }

            string reasonForFailure = "";

            if (!IoC.Resolve <IChargeCardService>().IsCardValidforRefund(creditCardPaymentInstrument, 0, out reasonForFailure))
            {
                Page.ClientScript.RegisterHiddenField(IsValidCardHiddenFieldName, Boolean.FalseString);
            }
            else
            {
                Page.ClientScript.RegisterHiddenField(IsValidCardHiddenFieldName, Boolean.TrueString);
            }

            IChargeCardRepository chargeCardRepository = new ChargeCardRepository();
            var existingChargeCard = chargeCardRepository.GetById(creditCardPaymentInstrument.ChargeCardId);

            spcardholder.InnerText = existingChargeCard.NameOnCard;
            string cardnumber = existingChargeCard.Number;

            if (cardnumber.Length > 0)
            {
                string dispcardnumber = string.Empty;
                for (int jcount = 0; jcount < cardnumber.Length - 4; jcount++)
                {
                    dispcardnumber = dispcardnumber + "X";
                }

                dispcardnumber += cardnumber.Substring(cardnumber.Length - 4, 4);

                spccnumber.InnerText = dispcardnumber;
                spcctype.InnerText   =
                    Enum.Parse(typeof(ChargeCardType), existingChargeCard.TypeId.ToString()).ToString();
                spexpdate.InnerText = existingChargeCard.ExpirationDate.ToString("MM/yyyy");

                ddlpaymentmode.Items.Clear();
                ddlpaymentmode.Items.Insert(ddlpaymentmode.Items.Count, new ListItem(PaymentType.CreditCardOnFile_Text, PaymentType.CreditCardOnFile_Value.ToString()));
            }
        }
示例#10
0
        private void SaveProductShippingDetail(Core.Finance.Domain.Order order)
        {
            if (ProductId.HasValue && ProductId.Value > 0)
            {
                var shippingOptionRepository = IoC.Resolve <IShippingOptionRepository>();
                var shippingOption           = shippingOptionRepository.GetShippingOptionByProductId(ProductId.Value);

                if (shippingOption == null || ShippingDetail == null)
                {
                    return;
                }

                IOrderController orderController = new OrderController();
                OrderDetail      orderDetail     = orderController.GetActiveOrderDetail(order);

                if (shippingOption.Id == ShippingDetail.ShippingOption.Id)
                {
                    return;
                }
                var productShippingDetail = ShippingDetail;

                productShippingDetail.Id = 0;
                productShippingDetail.ShippingAddress.Id = 0;
                productShippingDetail.ShippingOption.Id  = shippingOption.Id;
                productShippingDetail.ActualPrice        = shippingOption.Price;

                if (orderDetail != null)
                {
                    IShippingController shippingController = new ShippingController();
                    productShippingDetail = shippingController.OrderShipping(productShippingDetail);

                    IRepository <ShippingDetailOrderDetail> shippingDetailOrderDetailRepository =
                        new ShippingDetailOrderDetailRepository();

                    var shippingDetailOrderDetail = new ShippingDetailOrderDetail
                    {
                        Amount           = productShippingDetail.ActualPrice,
                        IsActive         = true,
                        OrderDetailId    = orderDetail.Id,
                        ShippingDetailId = productShippingDetail.Id
                    };

                    shippingDetailOrderDetailRepository.Save(shippingDetailOrderDetail);
                }
            }
        }
示例#11
0
        public Core.Finance.Domain.Order PlaceOrder(Core.Finance.Domain.Order order)
        {
            var newOrder = _orderFactory.CreateDuplicateOrder(order);

            if (!_lineItems.Any())
            {
                throw new InvalidOperationException("The order must contain at least one line item.");
            }

            if (order == null)
            {
                throw new InvalidOperationException("The order can not be null.");
            }

            using (var transaction = new TransactionScope())
            {
                foreach (var lineItem in _lineItems)
                {
                    OrderItem orderItem = _orderItemRepository.SaveOrderItem(lineItem.SecondValue.Id, lineItem.SecondValue.OrderItemType);
                    lineItem.FirstValue.OrderItemId = orderItem.Id;
                    lineItem.FirstValue.OrderId     = order.Id;
                    newOrder.OrderDetails.Add(lineItem.FirstValue);
                }

                // Get the new sourceCode applied...
                var orderDetailWithSourceCode = newOrder.OrderDetails.SingleOrDefault(od => od.SourceCodeOrderDetail != null);
                var sourceCodeOrderDetail     = orderDetailWithSourceCode != null
                                                ? orderDetailWithSourceCode.SourceCodeOrderDetail
                                                : null;
                if (orderDetailWithSourceCode != null)
                {
                    orderDetailWithSourceCode.SourceCodeOrderDetail = null;
                }

                newOrder = _orderSynchronizationService.SynchronizeOrder(order, newOrder, sourceCodeOrderDetail);
                newOrder = _orderRepository.SaveOrder(newOrder);
                transaction.Complete();
            }
            _lineItems.Clear();
            return(newOrder);
        }
        private void SetCreditCardOnFileDetails(Core.Finance.Domain.Order order)
        {
            var creditCardPaymentInstrument =
                order.PaymentsApplied.LastOrDefault(pa => pa.PaymentType == PaymentType.CreditCard) as
                ChargeCardPayment;

            if (creditCardPaymentInstrument != null)
            {
                IChargeCardRepository chargeCardRepository = new ChargeCardRepository();
                var existingChargeCard = chargeCardRepository.GetById(creditCardPaymentInstrument.ChargeCardId);
                CreditCardHolderName.Text = HttpUtility.HtmlEncode(existingChargeCard.NameOnCard);
                string cardNumber = existingChargeCard.Number;
                if (cardNumber.Length > 0)
                {
                    string displayCardNumber = string.Empty;
                    for (int jcount = 0; jcount < cardNumber.Length - 4; jcount++)
                    {
                        displayCardNumber += "X";
                    }

                    displayCardNumber += cardNumber.Substring(cardNumber.Length - 4, 4);

                    CreditCardNumberLabel.Text = HttpUtility.HtmlEncode(displayCardNumber);
                    CreditCardTypeLabel.Text   =
                        Enum.Parse(typeof(ChargeCardType), existingChargeCard.TypeId.ToString()).ToString();
                    ExpirationDateLabel.Text = existingChargeCard.ExpirationDate.ToString("MM/yyyy");

                    ListItem listItem = PaymentModeCombo.Items.FindByText("Credit Card");
                    if (listItem != null)
                    {
                        PaymentModeCombo.Items.Insert(PaymentModeCombo.Items.Count, new ListItem("Credit Card on File", CC_ON_FILE_VALUE));
                    }
                }
                else
                {
                    Page.ClientScript.RegisterStartupScript(typeof(string), "JSCODE",
                                                            "alert('The credit card number supplied is invalid.So you have to enter new credit card information if you wish to refund via credit card');",
                                                            true);
                }
            }
        }
示例#13
0
        public Core.Finance.Domain.Order SaveOrder(Core.Finance.Domain.Order orderToSave)
        {
            OrderEntity orderEntity = _mapper.Map(orderToSave);

            // TODO: Better method of saving Order + Details?
            using (var transactionScope = new TransactionScope())
            {
                using (var myAdapter = PersistenceLayer.GetDataAccessAdapter())
                {
                    if (!myAdapter.SaveEntity(orderEntity, true))
                    {
                        throw new PersistenceFailureException();
                    }
                }
                orderToSave.OrderDetails.ForEach(orderDetail => orderDetail.OrderId = orderEntity.OrderId);
                orderToSave.OrderDetails = _orderDetailRepository.SaveOrderDetails
                                               (orderToSave.OrderDetails);
                transactionScope.Complete();
            }
            Core.Finance.Domain.Order order = _mapper.Map(orderEntity);
            order.OrderDetails = orderToSave.OrderDetails;
            return(order);
        }
示例#14
0
        private void SetCreditCardOnFileDetails(Core.Finance.Domain.Order order)
        {
            var creditCardPaymentInstrument =
                order.PaymentsApplied.OrderBy(pa => pa.DataRecorderMetaData.DateCreated).LastOrDefault(pa => pa.PaymentType == PaymentType.CreditCard) as
                ChargeCardPayment;

            if (creditCardPaymentInstrument == null)
            {
                return;
            }

            IChargeCardRepository chargeCardRepository = new ChargeCardRepository();
            var existingChargeCard = chargeCardRepository.GetById(creditCardPaymentInstrument.ChargeCardId);

            spcardholder.InnerText = existingChargeCard.NameOnCard;
            string cardnumber = existingChargeCard.Number;

            if (cardnumber.Length > 0)
            {
                string dispcardnumber = "";
                for (int jcount = 0; jcount < cardnumber.Length - 4; jcount++)
                {
                    dispcardnumber = dispcardnumber + "X";
                }

                dispcardnumber += cardnumber.Substring(cardnumber.Length - 4, 4);

                spccnumber.InnerText = dispcardnumber;
                spcctype.InnerHtml   =
                    Enum.Parse(typeof(ChargeCardType), existingChargeCard.TypeId.ToString()).ToString();

                spexpdate.InnerHtml = existingChargeCard.ExpirationDate.ToString("MM/yyyy");
                //hfCardTypeId.Value = ((int)existingChargeCard.TypeId).ToString();

                ddlpaymentmode.Items.Insert(ddlpaymentmode.Items.Count, new ListItem(PaymentType.CreditCardOnFile_Text, PaymentType.CreditCardOnFile_Value.ToString()));
            }
        }
示例#15
0
        public Core.Finance.Domain.Order UpdateOrder(Core.Finance.Domain.Order order, SourceCode sourceCode, long dataRecorderCreatorId)
        {
            if (order == null)
            {
                throw new InvalidOperationException("The order can not be null.");
            }

            var existingActiveOrderDetail = GetActiveOrderDetail(order);

            if (existingActiveOrderDetail == null)
            {
                throw new InvalidOperationException("The order must contain at least one active line item.");
            }

            if (existingActiveOrderDetail.EventCustomerOrderDetail == null)
            {
                throw new InvalidOperationException("The order must contain at least one active line item.");
            }

            existingActiveOrderDetail.SourceCodeOrderDetail = new SourceCodeOrderDetail
            {
                Amount        = sourceCode.CouponValue,
                OrderDetailId = existingActiveOrderDetail.Id,
                IsActive      = true,
                OrganizationRoleUserCreatorId =
                    dataRecorderCreatorId,
                SourceCodeId = sourceCode.Id
            };

            using (var transaction = new TransactionScope())
            {
                order = _orderRepository.SaveOrder(order);
                transaction.Complete();
            }
            return(order);
        }
示例#16
0
        public void SetOrderPackageTest(Core.Finance.Domain.Order order, EventCustomerPackageTestDetailViewData eventCustomerPackageTestDetailViewData)
        {
            IOrderController orderController = new OrderController();
            var orderDetail   = orderController.GetActiveOrderDetail(order);
            var shippingPrice = Math.Round(orderDetail.ShippingDetailOrderDetails.Sum(sdod => sdod.Amount), 2);

            if (eventCustomerPackageTestDetailViewData.Package != null)
            {
                lblPackagename.Text = eventCustomerPackageTestDetailViewData.Package.Name;

                string packageTest = string.Empty;
                foreach (var test in eventCustomerPackageTestDetailViewData.Package.Tests)
                {
                    packageTest += "<li style=\"margin: 0px 10px; padding: 0px 0px; list-style: disc;\">" + test.Name + "</li>";
                }
                _lblTestNames.InnerHtml = packageTest;
            }
            else
            {
                _lblPackageRow.Visible   = false;
                AdditionalTest.InnerHtml = "Test(s):";
            }
            var additionalTest = string.Empty;

            foreach (var test in eventCustomerPackageTestDetailViewData.Tests)
            {
                additionalTest += "<li style=\"margin: 0px 10px; padding: 0px 0px; list-style: disc;\">" + test.Name + "</li>";
            }

            _lblAdditionalTestNames.InnerHtml = additionalTest;
            if (eventCustomerPackageTestDetailViewData.Tests.Count < 1)
            {
                _lblAdditionalTestRow.Visible = false;
            }

            if (eventCustomerPackageTestDetailViewData.ElectronicProduct != null)
            {
                //_lblProductNameRow.Visible = true;
                //lblProductName.Text = eventCustomerPackageTestDetailViewData.ElectronicProduct.Name;
                _lblProductPriceRow.Visible = true;
                lblProductPrice.Text        = eventCustomerPackageTestDetailViewData.ElectronicProduct.Price.ToString("C2");
            }
            else
            {
                //_lblProductNameRow.Visible = false;
                _lblProductPriceRow.Visible = false;
            }
            string strPaymentStatus = "Not Paid";

            if (order.TotalAmountPaid > 0 && order.TotalAmountPaid < order.DiscountedTotal)
            {
                strPaymentStatus = "Partially Paid";
            }
            else if (order.TotalAmountPaid >= order.DiscountedTotal)
            {
                strPaymentStatus = "Paid";
            }

            //strPaymentStatus = (order.TotalAmountPaid - order.DiscountedTotal) >= 0 ? "Paid" : "Not Paid";

            lblPrice.Text         = (order.OrderValue - order.OrderDiscount).ToString("C2");
            lblShippingPrice.Text = orderDetail.ShippingDetailOrderDetails.Count > 0 ? shippingPrice.ToString("C2") : "N/A";
            lblTotalPrice.Text    = order.DiscountedTotal.ToString("C2");
            lblPaymentStatus.Text = strPaymentStatus;
        }
示例#17
0
        private void SetPaymentDetails(Core.Finance.Domain.Order order)
        {
            TotalAmountPayable     = order.DiscountedTotal - order.TotalAmountPaid;
            hfcurrentpayable.Value = (order.DiscountedTotal - order.TotalAmountPaid).ToString("0.00");
            if (order.PaymentsApplied != null && !order.PaymentsApplied.IsEmpty())
            {
                //TODO:Currently it is removed as we don't have CC detail
                SetCreditCardOnFileDetails(order);

                bool    unpaid     = true;
                string  paidstring = string.Empty;
                decimal paidamount = 0.00m;
                foreach (var paymentApplied in order.PaymentsApplied)
                {
                    if (paidstring.Trim().Length < 1)
                    {
                        paidstring = "Paid Amount:";
                    }

                    if (paymentApplied.Amount > 0)
                    {
                        paidamount += paymentApplied.Amount;
                        paidstring += " $" + paymentApplied.Amount.ToString("0.00") + " (" + paymentApplied.PaymentType + "),";
                        unpaid      = false;
                    }
                    else if (paymentApplied.Amount < 0)
                    {
                        paidamount += paymentApplied.Amount;
                        paidstring += " Refund Amount: $" + (-1 * paymentApplied.Amount).ToString("0.00") + " (" + paymentApplied.PaymentType + "),";
                        unpaid      = false;
                    }
                }
                if (TotalAmountPayable < 0)
                {
                    paidstring += " | Unpaid Amount: $" + (TotalAmountPayable.Value * -1).ToString("0.00") + " <i>(To Refund) </i>";
                }
                else
                {
                    paidstring += " | Unpaid Amount: $" + TotalAmountPayable.Value.ToString("0.00");
                }

                if (paidstring.Substring(paidstring.Length - 1, 1) == ",")
                {
                    paidstring = paidstring.Substring(0, paidstring.Length - 1);
                }
                hfpaidamount.Value = paidamount.ToString("N2");

                if (unpaid)
                {
                    sppaymentdetails.InnerText = "Unpaid Amount: $" + TotalAmountPayable.Value.ToString("0.00");
                }
                else
                {
                    sppaymentdetails.InnerHtml = paidstring;
                }
            }
            else
            {
                sppaymentdetails.InnerHtml = "Unpaid Amount: $" + TotalAmountPayable.Value.ToString("0.00");
            }
            if (Customer != null)
            {
                var functionToCall = "javascript:return ShowOrderDetailPopUp(" +
                                     HttpUtility.HtmlEncode(order.Id) + "," + HttpUtility.HtmlEncode(order.DiscountedTotal) + "," + HttpUtility.HtmlEncode(order.TotalAmountPaid) + "," +
                                     HttpUtility.HtmlEncode(order.DiscountedTotal - order.TotalAmountPaid) + ",'" + HttpUtility.HtmlEncode(Customer.Name) + "'," +
                                     HttpUtility.HtmlEncode(Customer.CustomerId) + ");";
                _paymentLinkAnchor.Attributes.Add("onClick", functionToCall);
                _paymentLinkAnchor.HRef = "javascript:void(0);";
            }
        }
示例#18
0
 public OrderDetail GetActiveOrderDetail(Core.Finance.Domain.Order order)
 {
     return(GetActiveOrderDetail(order.OrderDetails));
 }
 // This method eliminates records which have been rescheduled but not paid after rescheduling.
 private bool GetReSchedulePredicate(Core.Finance.Domain.Order currentOrder)
 {
     return(currentOrder.DiscountedTotal > 0 && currentOrder.TotalAmountPaid == 0 &&
            !GetTotalPackagePriceDiscountPredicate(currentOrder));
 }
        private void CreateChangeOrderMetrics(EventMetricsViewData eventMetricsViewData,
                                              Core.Finance.Domain.Order order, OrganizationRoleUser organizationRoleUser)
        {
            // It means the order has been changed, so either downgrade or upgrade will occur for such cases only.
            if (order.DiscountedTotal == order.TotalAmountPaid && order.OrderDetails.Count > 1)
            {
                order.OrderDetails.ForEach(od =>
                {
                    od.DataRecorderMetaData.DateCreated =
                        od.DataRecorderMetaData.DateCreated.GetDateWithDifferentTime(
                            od.DataRecorderMetaData.DateCreated.Hour,
                            od.DataRecorderMetaData.DateCreated.Minute,
                            od.DataRecorderMetaData.DateCreated.Second);
                    if (od.Price < 0)
                    {
                        od.Price = 0;
                    }
                });
                Func <OrderDetail, decimal> amountOfDiscount = od => od.SourceCodeOrderDetail == null ? 0 : od.SourceCodeOrderDetail.Amount;
                var dateCreatedGroups = order.OrderDetails.GroupBy(od => od.DataRecorderMetaData.DateCreated).Select(
                    g =>
                    new
                {
                    g.Key,
                    TotalValue   = g.Sum(od => (od.Price * od.Quantity) - (amountOfDiscount(od))),
                    AvailedValue = g.Where(od => od.OrderItemStatus.OrderStatusState == OrderStatusState.FinalSuccess
                                           //EventPackageItemStatus.Availed || od.OrderItemStatus == EventTestItemStatus.Availed
                                           ).Sum(
                        od => ((od.Price * od.Quantity) - amountOfDiscount(od))),
                    CreatorId = g.Select(od => od.DataRecorderMetaData.DataRecorderCreator.Id).ToList()
                }).ToList();

                var availedPriceToBeAddedToNextGroup = 0m;

                for (int counter = 0; counter < (dateCreatedGroups.Count - 1); counter++)
                {
                    var changedOrderDetailOrganizationRoleUser =
                        _organizationRoleUserRepository.GetOrganizationRoleUser(
                            dateCreatedGroups[counter + 1].CreatorId.LastOrDefault());

                    var originalOrderDetailSum = dateCreatedGroups[counter].TotalValue +
                                                 availedPriceToBeAddedToNextGroup;
                    availedPriceToBeAddedToNextGroup += dateCreatedGroups[counter].AvailedValue;

                    var changedOrderDetailSum = dateCreatedGroups[counter + 1].TotalValue +
                                                availedPriceToBeAddedToNextGroup;

                    if (changedOrderDetailSum == 0)
                    {
                        continue;
                    }

                    var roleId = GetParentRoleIdByRoleId(organizationRoleUser.RoleId);

                    if (roleId == (int)Roles.Technician)
                    {
                        if (GetParentRoleIdByRoleId(changedOrderDetailOrganizationRoleUser.RoleId) == (int)Roles.Technician)
                        {
                            if (originalOrderDetailSum > changedOrderDetailSum)
                            {
                                eventMetricsViewData.DownGradePaymentCount++;
                                eventMetricsViewData.DownGradePayments += originalOrderDetailSum - changedOrderDetailSum;
                            }
                            if (originalOrderDetailSum < changedOrderDetailSum)
                            {
                                eventMetricsViewData.UpGradePaymentCount++;
                                eventMetricsViewData.UpGradePayments += changedOrderDetailSum - originalOrderDetailSum;
                            }
                        }
                    }
                    else
                    {
                        if (originalOrderDetailSum > changedOrderDetailSum)
                        {
                            eventMetricsViewData.DownGradePaymentCount++;
                            eventMetricsViewData.DownGradePayments += originalOrderDetailSum - changedOrderDetailSum;
                        }
                        if (originalOrderDetailSum < changedOrderDetailSum)
                        {
                            eventMetricsViewData.UpGradePaymentCount++;
                            eventMetricsViewData.UpGradePayments += changedOrderDetailSum - originalOrderDetailSum;
                        }
                    }
                }
            }
        }
示例#21
0
        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);
        }