Exemple #1
0
        private static string ToPaymentDetails(this DBML.payment row, long viewerid)
        {
            string contactParameters;

            if (row.order.receiverUserid == viewerid)
            {
                contactParameters = row.order.owner.ToString();
            }
            else
            {
                contactParameters = row.order.receiverUserid.ToString();
            }

            if (row.order.receiverUserid.HasValue)
            {
                if (row.order.user.organisation1.subdomain != row.order.user1.organisation1.subdomain)
                {
                    if (row.order.receiverUserid == viewerid)
                    {
                        contactParameters = string.Concat(contactParameters, "/", row.order.user1.organisation1.subdomain);
                    }
                    else
                    {
                        contactParameters = string.Concat(contactParameters, "/", row.order.user.organisation1.subdomain);
                    }
                }
            }
            else
            {
                return
                    (string.Format(
                         "<a href='#'>{0}</a> <br/><strong>{1}</strong> {2}",
                         row.order.receiverUserid == viewerid ? row.order.user1.ToFullName() : row.order.user.ToFullName(),
                         row.method,
                         !string.IsNullOrEmpty(row.notes) ? row.notes : ""));
            }

            return
                (string.Format(
                     "<a href='/dashboard/contacts/{0}'>{1}</a> <br/><strong>{2}</strong> {3}",
                     contactParameters,
                     row.order.receiverUserid == viewerid ? row.order.user1.ToFullName() : row.order.user.ToFullName(),
                     row.method,
                     !string.IsNullOrEmpty(row.notes)?row.notes:""));
        }
Exemple #2
0
        public string GetPaymentUrl()
        {
            var paymentReceiver = new Receiver
            {
                email  = PaymentReceiverEmail,
                amount = transaction.GetTotal()
            };

            var receivers = new ReceiverList(new List <Receiver>()
            {
                paymentReceiver
            });

            var payRequest = new PayRequest
            {
                actionType      = "PAY",
                receiverList    = receivers,
                currencyCode    = currency.code,
                requestEnvelope = new RequestEnvelope
                {
                    errorLanguage
                        =
                            "en_US"
                },
                returnUrl  = returnUrl,
                trackingId = uniqueid
            };

            payRequest.cancelUrl = payRequest.returnUrl;

            var configurationMap = Configuration.GetAcctAndConfig();

            var service = new AdaptivePaymentsService(configurationMap);

            var resp = service.Pay(payRequest);

            if (resp.responseEnvelope.ack == AckCode.FAILURE ||
                resp.responseEnvelope.ack == AckCode.FAILUREWITHWARNING)
            {
                // TODO: serialize this properly
                throw new Exception(resp.error.First().message);
            }

            if (resp.paymentExecStatus != "CREATED" && resp.paymentExecStatus != "COMPLETED")
            {
                // create the payment
                string errorString = "";
                foreach (var error in resp.payErrorList.payError)
                {
                    errorString += error.error.message;
                }
                throw new Exception(errorString);
            }

            string paymentStatus = PaymentStatus.Charging.ToString();

            if (resp.paymentExecStatus == "COMPLETED")
            {
                paymentStatus = PaymentStatus.Accepted.ToString();
            }

            var pay = new DBML.payment
            {
                created     = DateTime.UtcNow,
                paidAmount  = transaction.GetTotal(),
                method      = PaymentMethodType.Paypal.ToString(),
                orderid     = transaction.GetID(),
                status      = paymentStatus,
                reference   = uniqueid,
                redirectUrl = PaymentConstants.PaypalRedirectUrl + resp.payKey
            };

            transaction.AddPayment(pay, true);

            // update invoice status
            repository.Save();

            return(pay.redirectUrl);
        }
Exemple #3
0
        private void SaveEbayOrders(OrderTypeCollection collection)
        {
            using (var repository = new TradelrRepository())
            {
                foreach (OrderType entry in collection)
                {
                    Transaction transaction;
                    // check if order already exists
                    var existingEbayOrder = repository.GetSubDomain(sd.id).ebay_orders.SingleOrDefault(x => x.orderid == entry.OrderID);

                    if (existingEbayOrder != null)
                    {
                        var order = existingEbayOrder.orders.Single();
                        transaction = new Transaction(order, repository, seller.id);

                        // update order status
                        existingEbayOrder.status = entry.OrderStatus.ToString();
                    }
                    else
                    {
                        // check if user already exists
                        var buyer = repository.GetUserByEbayID(entry.BuyerUserID);

                        if (buyer == null)
                        {
                            // get receiver and add to contact db
                            var userService = new UserService(token);

                            // get by itemid as invalid request seems to be returned when get by userid
                            var ebaybuyer = userService.GetUser(entry.BuyerUserID);

                            // we assume that same buyer for all transactions so we get the first email address
                            var buyeremail = entry.TransactionArray.ItemAt(0).Buyer.Email;

                            buyer = SaveEbayBuyer(ebaybuyer, buyeremail);
                        }

                        // add a shipping and billing address
                        if (entry.ShippingAddress != null)
                        {
                            var buyername = Utility.SplitFullName(entry.ShippingAddress.Name);
                            var handler   = new AddressHandler(buyer.organisation1, repository);
                            handler.SetShippingAndBillingAddresses(buyername[0],
                                                                   buyername[1],
                                                                   entry.ShippingAddress.CompanyName ?? "",
                                                                   entry.ShippingAddress.Street1 + "\r\n" + entry.ShippingAddress.Street2,
                                                                   entry.ShippingAddress.CityName,
                                                                   null,
                                                                   entry.ShippingAddress.PostalCode,
                                                                   entry.ShippingAddress.Phone,
                                                                   entry.ShippingAddress.Country.ToString().ToCountry().id,
                                                                   entry.ShippingAddress.StateOrProvince,
                                                                   entry.ShippingAddress.StateOrProvince,
                                                                   entry.ShippingAddress.StateOrProvince,
                                                                   buyername[0],
                                                                   buyername[1],
                                                                   entry.ShippingAddress.CompanyName ?? "",
                                                                   entry.ShippingAddress.Street1 + "\r\n" + entry.ShippingAddress.Street2,
                                                                   entry.ShippingAddress.CityName,
                                                                   null,
                                                                   entry.ShippingAddress.PostalCode,
                                                                   entry.ShippingAddress.Phone,
                                                                   entry.ShippingAddress.Country.ToString().ToCountry().id,
                                                                   entry.ShippingAddress.StateOrProvince,
                                                                   entry.ShippingAddress.StateOrProvince,
                                                                   entry.ShippingAddress.StateOrProvince,
                                                                   true);
                        }

                        // add normal order
                        transaction = new Transaction(sd, buyer, TransactionType.INVOICE, repository, seller.id);

                        transaction.CreateTransaction(repository.GetNewOrderNumber(sd.id, TransactionType.INVOICE),
                                                      entry.CreatedTime, "",
                                                      entry.AmountPaid.currencyID.ToString().ToCurrency().id);

                        // mark as sent
                        var tradelr_orderstatus = GetOrderStatus(entry.OrderStatus);
                        transaction.UpdateOrderStatus(tradelr_orderstatus);

                        // add ebay specific order information
                        var newEbayOrder = new ebay_order();
                        newEbayOrder.orderid     = entry.OrderID;
                        newEbayOrder.status      = entry.OrderStatus.ToString();
                        newEbayOrder.created     = entry.CreatedTime;
                        newEbayOrder.subdomainid = sd.id;
                        transaction.AddEbayOrderInformation(newEbayOrder);

                        foreach (eBay.Service.Core.Soap.TransactionType trans in entry.TransactionArray)
                        {
                            var ebay_itemid = trans.Item.ItemID;

                            // get product details
                            var itemservice = new ItemService(token);
                            var item        = itemservice.GetItem(ebay_itemid);

                            // add new product if necessary
                            var existingproduct = repository.GetProducts(sd.id).SingleOrDefault(x => x.ebayID.HasValue && x.ebay_product.ebayid == ebay_itemid);
                            if (existingproduct == null)
                            {
                                // add new product  (triggered when synchronisation is carried out the first time)
                                var newproduct = new Listing();
                                newproduct.Populate(item);
                                var importer = new ProductImport();
                                var pinfo    = importer.ImportEbay(newproduct, sd.id);

                                repository.AddProduct(pinfo, sd.id);
                                existingproduct = pinfo.p;
                            }
                            else
                            {
                                // if existing product is completed then we need to relist
                                if (entry.OrderStatus == OrderStatusCodeType.Completed ||
                                    entry.OrderStatus == OrderStatusCodeType.Shipped)
                                {
                                    // see if product listing is still active
                                    if (item.SellingStatus.ListingStatus == ListingStatusCodeType.Completed ||
                                        item.SellingStatus.ListingStatus == ListingStatusCodeType.Ended)
                                    {
                                        // set status to inactive
                                        existingproduct.ebay_product.isActive = false;

                                        // check if we should autorelist
                                        if (existingproduct.ebay_product.autorelist)
                                        {
                                            // check that product has enough stock
                                            if (existingproduct.HasStock(existingproduct.ebay_product.quantity))
                                            {
                                                var exporter =
                                                    new EbayExporter(
                                                        existingproduct.ebay_product.siteid.ToEnum <SiteCodeType>(),
                                                        sd.ToHostName(),
                                                        token,
                                                        sd);

                                                exporter.BuildItem(existingproduct.ebay_product);
                                            }
                                        }
                                    }
                                }
                            }

                            // add tradelr order item
                            var orderItem = new orderItem
                            {
                                description = item.Title,
                                variantid   = existingproduct.product_variants[0].id,
                                unitPrice   = (decimal)trans.TransactionPrice.Value,
                                quantity    = trans.QuantityPurchased
                            };

                            if (trans.Taxes != null)
                            {
                                orderItem.tax =
                                    (decimal)(trans.Taxes.TotalTaxAmount.Value / trans.TransactionPrice.Value);
                            }

                            transaction.AddOrderItem(orderItem, null);

                            // update inventory
                            transaction.UpdateInventoryItem(orderItem, trans.QuantityPurchased);

                            // add ebay order item
                            var ebayorderitem = new ebay_orderitem();
                            ebayorderitem.lineid = trans.OrderLineItemID;
                            newEbayOrder.ebay_orderitems.Add(ebayorderitem);
                        }

                        // update shipping
                        transaction.UpdateShippingCost(entry.ShippingServiceSelected.ShippingServiceCost.Value.ToString());
                        transaction.UpdateShippingMethod(entry.ShippingServiceSelected.ShippingService);

                        // update tax : ebay tax is the shipping tax which applies to the entire order total
                        // may or may not include shipping cost
                        if (entry.ShippingDetails.SalesTax != null)
                        {
                            transaction.UpdateOrderTax((decimal)entry.ShippingDetails.SalesTax.SalesTaxPercent,
                                                       entry.ShippingDetails.SalesTax.ShippingIncludedInTax);
                        }


                        transaction.UpdateTotal();
                        transaction.SaveNewTransaction(); ////////////////////// SAVE INVOICE
                    }

                    // the following applies to both new and existing order
                    var existingPayment = transaction.GetPayments().SingleOrDefault(x => x.reference == entry.OrderID);
                    if (existingPayment != null)
                    {
                        var newstatus = GetPaymentStatus(entry.CheckoutStatus.Status);
                        if (existingPayment.status != newstatus.ToString())
                        {
                            transaction.UpdatePaymentStatus(existingPayment, newstatus);
                        }
                    }
                    else
                    {
                        // if payment has been made then add payment
                        if (entry.CheckoutStatus.Status == CompleteStatusCodeType.Complete)
                        {
                            var p = new DBML.payment();
                            p.status     = GetPaymentStatus(entry.CheckoutStatus.Status).ToString();
                            p.method     = entry.CheckoutStatus.PaymentMethod.ToString();
                            p.created    = entry.CheckoutStatus.LastModifiedTime;
                            p.notes      = entry.BuyerCheckoutMessage;
                            p.paidAmount = (decimal)entry.AmountPaid.Value;
                            p.reference  = entry.OrderID;

                            transaction.AddPayment(p, false);
                        }
                    }

                    // if there is a shipped date, mark as ship if not already done so
                    if (transaction.GetOrderStatus() != OrderStatus.SHIPPED &&
                        entry.ShippedTimeSpecified)
                    {
                        transaction.UpdateOrderStatus(OrderStatus.SHIPPED);

                        if (entry.ShippingDetails.ShipmentTrackingDetails.Count != 0)
                        {
                            foreach (ShipmentTrackingDetailsType trackentry in entry.ShippingDetails.ShipmentTrackingDetails)
                            {
                                var comment = string.Format(OrderComment.ORDER_SHIP_STANDARD,
                                                            trackentry.ShippingCarrierUsed,
                                                            trackentry.ShipmentTrackingNumber);
                                transaction.AddComment(comment);
                            }
                        }
                        else
                        {
                            transaction.AddComment(OrderComment.ORDER_SHIP, created: entry.ShippedTime);
                        }
                    }
                    repository.Save();  // save per order
                }
            }
        }
Exemple #4
0
        public void UpdatePaymentStatus(DBML.payment pay, PaymentStatus status)
        {
            pay.status = status.ToString();

            switch (status)
            {
            case PaymentStatus.Accepted:
                // add activity
                repository.AddActivity(pay.order.owner,
                                       new ActivityMessage(order.id, order.receiverUserid,
                                                           ActivityMessageType.INVOICE_PAYMENT_ACCEPTED,
                                                           new HtmlLink(GetOrderNumber(),
                                                                        order.id).ToTransactionString(transactionType)),
                                       senderDomain.id);
                if (HasDigitalOrderItems())
                {
                    // send download links
                    SendDownloadLinksEmail();
                }
                break;

            case PaymentStatus.New:
                break;

            case PaymentStatus.Chargeable:
                break;

            case PaymentStatus.Charging:
                break;

            case PaymentStatus.Declined:
                // update order/invoice total
                order.totalPaid -= pay.paidAmount;

                UpdateTotal();

                repository.AddActivity(pay.order.owner,
                                       new ActivityMessage(order.id, order.receiverUserid,
                                                           ActivityMessageType.INVOICE_PAYMENT_REJECTED,
                                                           new HtmlLink(GetOrderNumber(), order.id).
                                                           ToTransactionString(transactionType)), senderDomain.id);
                break;

            case PaymentStatus.Cancelled:
                break;

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

            // add comment
            var comment = string.Format("<p><strong>{4}</strong>: Payment #{0} of {1}{2} {3}</p>", pay.id, currency.symbol,
                                        pay.paidAmount.ToString("n" + currency.decimalCount),
                                        currency.code, status);

            AddComment(comment, caller_sessionid);

            SendPaymentUpdateEmail(status, status == PaymentStatus.Declined);

            SaveUpdatedTransaction();
        }
Exemple #5
0
        public void AddPayment(DBML.payment payment, bool sendEmail)
        {
            // if enterrer is invoice owner then set status to accepted
            if (caller_sessionid == order.owner)
            {
                payment.status = PaymentStatus.Accepted.ToString();
            }
            else
            {
                if (sendEmail)
                {
                    SendPaymentUpdateEmail(payment.status.ToEnum <PaymentStatus>(), true);
                }
            }

            order.payments.Add(payment);


            order.totalPaid += payment.paidAmount;

            if (order.total == order.totalPaid)
            {
                order.status = OrderStatus.PAID.ToString();
                repository.AddActivity(caller_sessionid,
                                       new ActivityMessage(order.id, order.owner,
                                                           ActivityMessageType.INVOICE_PAYMENT_RECEIVED_FULL,
                                                           new HtmlLink(GetOrderNumber(), GetID()).ToTransactionString(transactionType)), senderDomain.id);
            }
            else
            {
                order.status = OrderStatus.PARTIAL.ToString();
                repository.AddActivity(caller_sessionid,
                                       new ActivityMessage(order.id, order.owner,
                                                           ActivityMessageType.INVOICE_PAYMENT_RECEIVED_PARTIAL,
                                                           new HtmlLink(GetOrderNumber(), GetID()).ToTransactionString(transactionType)), senderDomain.id);
            }

            // need to save to get payment id
            repository.Save();

            // add comment
            var sb = new StringBuilder();

            if (string.IsNullOrEmpty(payment.method))
            {
                sb.AppendFormat("<p><strong>{4}</strong>: Payment #{0} of {1}{2} {3}</p>", payment.id, currency.symbol,
                                payment.paidAmount.ToString("n" + currency.decimalCount),
                                currency.code, payment.status);
            }
            else
            {
                sb.AppendFormat("<p><strong>{4}</strong>: Payment #{0} of {1}{2} {3} via {5}</p>", payment.id,
                                currency.symbol,
                                payment.paidAmount.ToString("n" + currency.decimalCount),
                                currency.code, payment.status, payment.method);
            }

            sb.AppendFormat("<p>{0}</p>", payment.notes);

            AddComment(sb.ToString(), caller_sessionid, payment.created);

            repository.Save();
        }