예제 #1
0
        public ActionResult Send(long id, string subject, string message, string viewloc)
        {
            var transaction = new Transaction(repository.GetOrder(subdomainid.Value, id), repository, sessionid.Value);

            // get necessary information
            var me     = repository.GetUserById(sessionid.Value, subdomainid.Value);
            var sender = string.Concat(me.organisation1.name, " (", me.email, ")");

            // send mail (do this last in case we can't send email)
            var data = new NewOrderEmailContent
            {
                message = message,
                viewloc = viewloc,
                sender  = sender,
            };

            var msg    = new Message(transaction.GetReceiver(), transaction.GetOwner(), subdomainid.Value);
            var result = msg.SendMessage(this, repository, EmailViewType.INVOICEORDER_NEW, data, subject, viewloc);

            if (!result.success)
            {
                return(Json(result.message.ToJsonFail()));
            }

            // update order status
            transaction.UpdateOrderStatus(OrderStatus.SENT);

            // log activity
            string comment;

            if (transaction.GetType() == TransactionType.ORDER)
            {
                // PURCHASE ORDER
                comment = "Purchase Order sent.";

                repository.AddActivity(transaction.GetOwner().id,
                                       new ActivityMessage(transaction.GetID(), transaction.GetOwner().id,
                                                           ActivityMessageType.ORDER_SENT,
                                                           new HtmlLink(transaction.GetOrderNumber(), transaction.GetID()).ToTransactionString(TransactionType.ORDER)), subdomainid.Value);
                repository.AddActivity(transaction.GetOwner().id,
                                       new ActivityMessage(transaction.GetID(), transaction.GetReceiver().id,
                                                           ActivityMessageType.ORDER_RECEIVED,
                                                           new HtmlLink(transaction.GetOrderNumber(), transaction.GetID()).ToTransactionString(TransactionType.ORDER),
                                                           new HtmlLink(transaction.GetOwner().ToEmailName(true), transaction.GetOwner().id).ToContactString()), subdomainid.Value);
            }
            else
            {
                // SALES INVOICE
                comment = "Sales Invoice sent.";
                repository.AddActivity(transaction.GetOwner().id,
                                       new ActivityMessage(transaction.GetID(), transaction.GetOwner().id,
                                                           ActivityMessageType.INVOICE_SENT,
                                                           new HtmlLink(transaction.GetOrderNumber(), transaction.GetID()).ToTransactionString(TransactionType.INVOICE)), subdomainid.Value);
                repository.AddActivity(transaction.GetOwner().id,
                                       new ActivityMessage(transaction.GetID(), transaction.GetReceiver().id,
                                                           ActivityMessageType.INVOICE_RECEIVED,
                                                           new HtmlLink(transaction.GetOrderNumber(), transaction.GetID()).ToTransactionString(TransactionType.INVOICE),
                                                           new HtmlLink(transaction.GetOwner().ToEmailName(true), transaction.GetOwner().id).ToContactString()), subdomainid.Value);
            }

            transaction.AddComment(comment, sessionid.Value);

            return(Json("".ToJsonOKMessage()));
        }
예제 #2
0
        // json is true when checkout is done from an iframe, eg. facebook page
        public ActionResult create(CheckoutStatus status, string shippingmethod, string paymentmethod, bool isJson = false)
        {
            Debug.Assert(!cart.orderid.HasValue);

            var shop_owner = cart.MASTERsubdomain.organisation.users.First();
            var currency   = cart.MASTERsubdomain.currency.ToCurrency();
            var buyer      = cart.user;

            var transaction = new Transaction(cart.MASTERsubdomain, buyer, TransactionType.INVOICE, repository, sessionid.Value);

            transaction.CreateTransaction(
                repository.GetNewOrderNumber(subdomainid.Value, TransactionType.INVOICE),
                DateTime.UtcNow,
                cart.MASTERsubdomain.paymentTerms,
                currency.id);

            // mark as sent
            transaction.UpdateOrderStatus(OrderStatus.SENT);

            var shoppingcart = new ShoppingCart(currency.code)
            {
                shippingMethod = shippingmethod
            };

            foreach (var item in cart.cartitems)
            {
                var checkOutItem = item.product_variant.ToCheckoutItem(item.quantity, sessionid);
                var orderItem    = new orderItem
                {
                    description = item.product_variant.ToProductFullTitle(),
                    variantid   = item.product_variant.id,
                    unitPrice   = item.product_variant.product.ToUserPrice(cart.userid.Value),
                    tax         = item.product_variant.product.tax,
                    quantity    = item.quantity
                };
                transaction.AddOrderItem(orderItem, item.product_variant.product.products_digitals);
                // update inventory
                transaction.UpdateInventoryItem(orderItem, item.quantity);

                shoppingcart.items.Add(checkOutItem);
            }

            if (!cart.isDigitalOrder())
            {
                shoppingcart.CalculateShippingCost(cart.cartitems.Select(x => x.product_variant).AsQueryable(), cart.MASTERsubdomain, buyer);

                if (cart.cartitems.Select(x => x.product_variant.product.shippingProfile).UseShipwire())
                {
                    transaction.UpdateShippingMethod(shoppingcart.shipwireShippingName, shoppingcart.shippingMethod);
                }
                else
                {
                    transaction.UpdateShippingMethod(shoppingcart.shippingMethod);
                }
            }

            transaction.UpdateTotal(cart.coupon);
            transaction.SaveNewTransaction(); ////////////////////// SAVE INVOICE

            repository.AddActivity(buyer.id,
                                   new ActivityMessage(transaction.GetID(), shop_owner.id,
                                                       ActivityMessageType.INVOICE_NEW,
                                                       new HtmlLink(transaction.GetOrderNumber(), transaction.GetID()).ToTransactionString(TransactionType.INVOICE)), subdomainid.Value);

            // add checkout note as a comment
            if (!string.IsNullOrEmpty(cart.note))
            {
                transaction.AddComment(cart.note, cart.userid.Value);
            }

            // add comment if shipping method not specified
            if (!transaction.HasShippingMethod() && !cart.isDigitalOrder())
            {
                transaction.AddComment(OrderComment.SHIPPING_WAIT_FOR_COST);
            }

            // set cart as processed
            cart.orderid = transaction.GetID();

            // save payment method
            if (!string.IsNullOrEmpty(paymentmethod))
            {
                switch (paymentmethod)
                {
                case "paypal":
                    cart.paymentMethod = PaymentMethodType.Paypal.ToString();
                    break;

                default:
                    cart.paymentMethod   = PaymentMethodType.Custom.ToString();
                    cart.paymentCustomId = long.Parse(paymentmethod);
                    break;
                }
            }

            repository.Save();

            // send emails
            // send mail to buyer
            var buyerEmailContent = new OrderReceipt()
            {
                viewloc =
                    cart.MASTERsubdomain.ToHostName().ToDomainUrl(transaction.GetOrderLink()),
                shopname        = cart.MASTERsubdomain.storeName,
                date            = transaction.GetOrderDate().ToShortDateString(),
                shippingAddress = transaction.GetShippingAddress().ToHtmlString(),
                billingAddress  = transaction.GetBillingAddress().ToHtmlString(),
                subtotal        = string.Format("{0}{1}", currency.symbol, transaction.GetSubTotal().ToString("n" + currency.decimalCount)),
                shippingcost    = string.Format("{0}{1}", currency.symbol, transaction.GetShippingCost().ToString("n" + currency.decimalCount)),
                discount        = string.Format("{0}{1}", currency.symbol, transaction.GetDiscount().ToString("n" + currency.decimalCount)),
                totalcost       = string.Format("{0}{1}{2}", currency.code, currency.symbol, transaction.GetTotal().ToString("n" + currency.decimalCount)),
                orderitems      = transaction
                                  .GetOrderItems()
                                  .Select(x => string.Format("{0} x {1}{2} {3}",
                                                             x.quantity,
                                                             currency.symbol,
                                                             x.unitPrice.Value.ToString("n" + currency.decimalCount),
                                                             x.description))
            };

            // send mail to seller
            var sellerEmailContent = new NewOrderEmailContent
            {
                viewloc =
                    cart.MASTERsubdomain.ToHostName().ToDomainUrl(transaction.GetOrderLink()),
                sender = buyer.organisation1.name
            };

            string buyer_subject;
            string seller_subject;

            switch (status)
            {
            case CheckoutStatus.SHIPPING_FAIL:
                buyer_subject = string.Format("[{0}]Invoice #{1}", cart.MASTERsubdomain.name,
                                              transaction.GetOrderNumber());
                seller_subject = string.Format("[{0}]New Invoice #{1} : ACTION REQUIRED", cart.MASTERsubdomain.name,
                                               transaction.GetOrderNumber());
                buyerEmailContent.message =
                    "Thank you for placing an order with us. Unfortunately, we are not able to provide a shipping cost at this moment. We will contact you once we have the shipping costs. You can check the status of your order by following the link below:";
                sellerEmailContent.message = "A customer has placed an order on your online store. However, the shipping cost could not be calculated. You will need to manually update the invoice with the shipping cost. To update the invoice, follow the link below:";
                break;

            case CheckoutStatus.SHIPPING_NONE:
            case CheckoutStatus.SHIPPING_OK:
                buyer_subject = string.Format("[{0}]Invoice #{1} confirmed", cart.MASTERsubdomain.name,
                                              transaction.GetOrderNumber());
                seller_subject = string.Format("[{0}]New Invoice #{1}", cart.MASTERsubdomain.name,
                                               transaction.GetOrderNumber());

                if (cart.isDigitalOrder())
                {
                    buyerEmailContent.message = "Download links will be provided once payment is confirmed";
                }
                sellerEmailContent.message = "A customer has placed an order on your online store. To view the invoice, follow the link below:";
                break;

            default:
                throw new ArgumentOutOfRangeException("status");
            }

            this.SendEmail(EmailViewType.INVOICEORDER_NEW, sellerEmailContent, seller_subject,
                           shop_owner.GetEmailAddress(), shop_owner.ToFullName(), buyer);

            this.SendEmail(EmailViewType.ORDER_RECEIPT, buyerEmailContent, buyer_subject,
                           buyer.GetEmailAddress(), buyer.ToFullName(), shop_owner);

            // handle payment
            string redirecturl = "";

            if (!string.IsNullOrEmpty(paymentmethod))
            {
                switch (paymentmethod)
                {
                case "paypal":
                    string returnUrl;
                    if (isJson)
                    {
                        returnUrl = string.Format("{0}/checkout/order/{1}/close", GeneralConstants.HTTP_SECURE, cart.id);
                    }
                    else
                    {
                        returnUrl = string.Format("{0}/checkout/order/{1}", GeneralConstants.HTTP_SECURE, cart.id);
                    }
                    var pworker = new PaypalWorker(cart.id.ToString(),
                                                   transaction,
                                                   repository,
                                                   cart.MASTERsubdomain.GetPaypalID(),
                                                   transaction.GetCurrency().id,
                                                   returnUrl);
                    try
                    {
                        redirecturl = pworker.GetPaymentUrl();
                    }
                    catch (Exception ex)
                    {
                        Syslog.Write(ex);
                        return(RedirectToAction("Index", "Error"));
                    }
                    break;

                default:
                    break;
                }
            }

            if (!string.IsNullOrEmpty(redirecturl))
            {
                return(Redirect(redirecturl));
            }

            if (isJson)
            {
                return(View("close"));
            }

            return(RedirectToAction("Index"));
        }