Exemplo n.º 1
0
        private void CompleteEditModel(RefundRequestResultEditModel model, long customerId)
        {
            string value = _configurationSettingRepository.GetConfigurationValue(ConfigurationSettingName.CancellationFee);

            if (!string.IsNullOrEmpty(value))
            {
                decimal fee;
                Decimal.TryParse(value.Trim(), out fee);
                model.CancellationFee = fee;
            }

            if (model.PaymentEditModel == null)
            {
                model.PaymentEditModel = new PaymentEditModel
                {
                    PaymentFlow = PaymentFlow.Out
                };
            }

            if (_isEccEnabled)
            {
                model.PaymentEditModel.AllowedPaymentTypes = new[] { new OrderedPair <long, string>(PaymentType.Check.PersistenceLayerId, PaymentType.Check.Name),
                                                                     new OrderedPair <long, string>(PaymentType.Cash.PersistenceLayerId, PaymentType.Cash.Name),
                                                                     new OrderedPair <long, string>(PaymentType.CreditCard.PersistenceLayerId, PaymentType.CreditCard.Name) }
            }
            ;
            else
            {
                model.PaymentEditModel.AllowedPaymentTypes = new[]
                {
                    new OrderedPair <long, string>(PaymentType.Check.PersistenceLayerId, PaymentType.Check.Name),
                    new OrderedPair <long, string>(PaymentType.Cash.PersistenceLayerId, PaymentType.Cash.Name)
                }
            };


            var order            = _orderRepository.GetOrder(model.OrderId);
            var validCardPayment = order.PaymentsApplied.Where(pi => pi.PaymentType == PaymentType.CreditCard).OrderBy(
                pi => pi.DataRecorderMetaData.DateCreated).Select(pi => (ChargeCardPayment)pi).LastOrDefault();

            if (validCardPayment != null && (_isEccEnabled || (validCardPayment.Amount > 0 && validCardPayment.DataRecorderMetaData.DateCreated > DateTime.Now.Date.AddDays(-120) && ProcessorResponse.IsValidResponseString(validCardPayment.ProcessorResponse))))
            {
                model.PaymentEditModel.ChargeCardonFile = new ChargeCardPaymentEditModel()
                {
                    ChargeCardPayment = validCardPayment,
                    ChargeCard        = _chargeCardRepository.GetById(validCardPayment.ChargeCardId)
                };

                model.PaymentEditModel.AllowedPaymentTypes = model.PaymentEditModel.AllowedPaymentTypes.Concat(new[]
                {
                    new OrderedPair <long, string>(PaymentType.CreditCardOnFile_Value, PaymentType.CreditCardOnFile_Text)
                });
            }

            model.PaymentEditModel.ExistingBillingAddress =
                Mapper.Map <Address, AddressEditModel>(_customerRepository.GetCustomer(customerId).BillingAddress) ?? new AddressEditModel();
        }
Exemplo n.º 2
0
        private void ManagePaymentsbeforeDataSave(RefundRequestResultEditModel model)
        {
            switch (model.RequestResultType)
            {
            case RequestResultType.IssueRefund:
                _paymentController.ManagePayment(model.PaymentEditModel, model.CustomerId, Request.UserHostAddress, "Pr_Rq_IR_" + model.RequestId);
                break;

            case RequestResultType.OfferFreeAddonsAndDiscounts:
                _paymentController.ManagePayment(model.PaymentEditModel, model.CustomerId, Request.UserHostAddress, "Pr_Rq_DiscAdOn_" + model.RequestId);
                break;
            }
        }
Exemplo n.º 3
0
        public void ManageOrderforRefundRequestwithFreeDiscountandProduct(RefundRequestResultEditModel model, long orderId, long customerId, long processedbyOrgRoleUserId)
        {
            var order = _orderRepository.GetOrder(orderId);

            if (order == null)
            {
                return;
            }
            var dataRecorder = new DataRecorderMetaData(processedbyOrgRoleUserId, DateTime.Now, null);

            var productsAvailed = model.OfferFreeProduct.Where(fp => fp.ProductAvailed);

            foreach (var product in productsAvailed)
            {
                long orderItemId = product.OrderItemId;
                if (orderItemId < 1)
                {
                    orderItemId = _orderItemRepository.SaveOrderItem(product.ProductId, OrderItemType.ProductItem).Id;
                    var orderDetail = new OrderDetail()
                    {
                        DataRecorderMetaData      = dataRecorder,
                        Description               = "Offered free product while Resolving Request",
                        DetailType                = OrderItemType.ProductItem,
                        ForOrganizationRoleUserId = customerId,
                        OrderId         = orderId,
                        OrderItemId     = orderItemId,
                        OrderItemStatus =
                            (new OrderItemStatusFactory()).CreateOrderItemStatus(
                                OrderItemType.ProductItem, ProductItemStatus.Availed.StatusCode),
                        Price    = 0.00m,
                        Quantity = 1
                    };
                    order.OrderDetails.Add(orderDetail);
                }
                else
                {
                    var eproduct = _electronicProductRepository.GetById(product.ProductId);
                    order.OrderDetails.Add(GetRefunTypeOrderLineItem(product.ProductPriceinOrder.Value, "Issuing Refund for Product " + eproduct.Name + " in Order [Id:" + orderId + "]", orderId, customerId, processedbyOrgRoleUserId));
                }
            }

            if (model.OfferDiscount)
            {
                order.OrderDetails.Add(GetRefunTypeOrderLineItem(model.DiscountAmount, "Offered Discount while Resolving Request", orderId, customerId, processedbyOrgRoleUserId));
            }

            order = _orderRepository.SaveOrder(order);
        }
Exemplo n.º 4
0
        private static bool IsModelValid(RefundRequestResultEditModel model, IEnumerable <PaymentInstrumentEditModel> Payments)
        {
            bool   isPaymentsValid = true;
            bool   isModelValid    = true;
            string result          = ValidateModel(IoC.Resolve <IValidator <RefundRequestResultEditModel> >(), model);

            if (!string.IsNullOrEmpty(result))
            {
                model.FeedbackMessage =
                    FeedbackMessageModel.CreateFailureMessage(result);
                isModelValid = false;
            }

            if (Payments != null && Payments.Count() > 0)
            {
                var validator = IoC.Resolve <IValidator <PaymentInstrumentEditModel> >();
                foreach (var payment in Payments)
                {
                    result = ValidateModel(validator, payment);
                    if (!string.IsNullOrEmpty(result))
                    {
                        isPaymentsValid         = false;
                        payment.FeedbackMessage =
                            FeedbackMessageModel.CreateFailureMessage(result);
                    }
                }
            }
            else
            {
                if ((model.RequestResultType == RequestResultType.IssueRefund || model.RequestResultType == RequestResultType.OfferFreeAddonsAndDiscounts) && model.RefundAmount > 0)
                {
                    result = result + " Please provide some payment information.<br />";

                    model.FeedbackMessage =
                        FeedbackMessageModel.CreateFailureMessage(result);
                    isModelValid = false;
                }
            }

            return(isPaymentsValid && isModelValid);
        }
Exemplo n.º 5
0
        public ActionResult Edit(RefundRequestResultEditModel model, IEnumerable <PaymentInstrumentEditModel> payments)
        {
            var request = ((IRefundRequestRepository)_repository).Get(model.RequestId);

            try
            {
                model.PaymentEditModel.Payments = payments;

                model.PreviousProcessingNotes = request.RefundRequestResult != null ? request.RefundRequestResult.Notes : string.Empty;

                if (!IsModelValid(model, payments))
                {
                    CompleteEditModel(model, model.CustomerId);
                    model.RequestedRefundAmount = request.RequestedRefundAmount;
                    return(View(model));
                }
                var notesToSave = PrepareProcessorNotesHtml(model.Notes, model.PreviousProcessingNotes);

                var requestResult = Mapper.Map <RefundRequestResultEditModel, RefundRequestResult>(model);
                requestResult.Notes       = notesToSave;
                requestResult.ProcessedOn = DateTime.Now;
                requestResult.ProcessedByOrgRoleUserId =
                    _sessionContext.UserSession.CurrentOrganizationRole.OrganizationRoleUserId;
                request.RefundRequestResult = requestResult;
                request.RequestStatus       = (long)RequestStatus.Resolved;

                var currentOrgRole = _sessionContext.UserSession.CurrentOrganizationRole;

                ManagePaymentsbeforeDataSave(model);

                bool    isPaymentRefunded = false;
                decimal amountRefunded    = 0;

                if (model.RefundAmount > 0)
                {
                    isPaymentRefunded = true;
                    amountRefunded    = model.RefundAmount;
                }

                using (var scope = new TransactionScope())
                {
                    long paymentId = 0;
                    switch (model.RequestResultType)
                    {
                    case RequestResultType.AdjustOrder:     // Can't do it for Cancelled appointment Record
                        ((IRefundRequestRepository)_repository).SaveProcessorNotes(model.RequestId, notesToSave);
                        scope.Complete();
                        var guid = Guid.NewGuid();
                        if (currentOrgRole.CheckRole((long)Roles.FranchisorAdmin))
                        {
                            Response.RedirectUser("/App/Common/ChangePackage.aspx?" + RefundRequest.ProcessRequestId + "=" + model.RequestId + "&EventId=" + request.EventId + "&CustomerId=" + request.CustomerId + "&" + RefundRequest.ProcessRequest + "=true&guid=" + guid);
                        }
                        else
                        {
                            Response.RedirectUser("/App/CallCenter/CallCenterRep/CallCenterRepChangePackage.aspx?Call=No&" + RefundRequest.ProcessRequestId + "=" + model.RequestId + "&EventId=" + request.EventId + "&CustomerId=" + request.CustomerId + "&" + RefundRequest.ProcessRequest + "=true");
                        }
                        return(null);

                    case RequestResultType.RescheduleAppointment:
                        ((IRefundRequestRepository)_repository).SaveProcessorNotes(model.RequestId, notesToSave);
                        scope.Complete();

                        if (currentOrgRole.CheckRole((long)Roles.FranchisorAdmin))
                        {
                            Response.RedirectUser("/App/Franchisor/FranchisorRescheduleCustomerAppointment.aspx?resolve=true&" + RefundRequest.ProcessRequestId + "=" + model.RequestId + "&EventId=" + request.EventId + "&CustomerId=" + request.CustomerId + "&" + RefundRequest.ProcessRequest + "=true");
                        }
                        else
                        {
                            Response.RedirectUser("/App/CallCenter/CallCenterRep/CallCenterRepRescheduleCustomerAppointment.aspx?resolve=true&Call=No&" + RefundRequest.ProcessRequestId + "=" + model.RequestId + "&EventID=" + request.EventId + "&CustomerID=" + request.CustomerId + "&" + RefundRequest.ProcessRequest + "=true");
                        }
                        return(null);

                    case RequestResultType.IssueRefund:

                        if (model.RefundType == RefundRequestType.CustomerCancellation)
                        {
                            var eventCustomerRepository = IoC.Resolve <IEventCustomerRepository>();
                            var eventCustomer           = eventCustomerRepository.GetCancelledEventForUser(request.CustomerId, request.EventId);
                            var customerService         = IoC.Resolve <ICustomerService>();
                            customerService.UnMarkProspectCustomerConverted(eventCustomer.Id, ProspectCustomerTag.Cancellation);
                            _eventCustomerService.CancelAppointment(request.EventId, request.CustomerId, model.PaymentEditModel, _sessionContext.UserSession.CurrentOrganizationRole.OrganizationRoleUserId, model.ChargeCancellationFee);
                        }
                        else
                        {
                            paymentId = _paymentController.SavePayment(model.PaymentEditModel, _sessionContext.UserSession.CurrentOrganizationRole.OrganizationRoleUserId);
                            _orderRepository.ApplyPaymentToOrder(model.OrderId, paymentId);
                        }
                        break;

                    case RequestResultType.OfferFreeAddonsAndDiscounts:
                        _orderController.ManageOrderforRefundRequestwithFreeDiscountandProduct(model, model.OrderId, request.CustomerId, _sessionContext.UserSession.CurrentOrganizationRole.OrganizationRoleUserId);
                        paymentId = _paymentController.SavePayment(model.PaymentEditModel, _sessionContext.UserSession.CurrentOrganizationRole.OrganizationRoleUserId);
                        _orderRepository.ApplyPaymentToOrder(model.OrderId, paymentId);
                        break;

                    case RequestResultType.IssueGiftCertificate:
                        Session[RefundRequest.ProcessRequestId] = request.Id;
                        ((IRefundRequestRepository)_repository).SaveProcessorNotes(model.RequestId, notesToSave);
                        scope.Complete();
                        Response.RedirectUser("/App/CallCenter/CallCenterRep/GiftCertificate/Details.aspx?Call=No&Amount=" + model.RequestedRefundAmount);
                        return(null);
                    }

                    _repository.Save(request);

                    scope.Complete();
                }

                try
                {
                    if (isPaymentRefunded)
                    {
                        SendRefundNotification(model.CustomerId, amountRefunded);
                    }
                }
                catch (Exception ex)
                {
                    _logger.Error("Refund Request: Failed to send notification. Message:" + ex.Message + "\n\tStackTrace:" + ex.StackTrace);
                }
                Response.RedirectUser("/Finance/RefundRequest");
                return(null);
            }
            catch (Exception ex)
            {
                _logger.Error("Refund Request: Message:" + ex.Message + "\n\tStackTrace:" + ex.StackTrace);
                model.FeedbackMessage = FeedbackMessageModel.CreateFailureMessage("System Failure while Processing Request. Message : " + ex.Message);
                _paymentController.VoidCreditCardGatewayRequests(model.PaymentEditModel);
                CompleteEditModel(model, model.CustomerId);
                model.RequestedRefundAmount = request.RequestedRefundAmount;
            }
            return(View(model));
        }