private SendGridMessage BuildOrderMessage(OrderEventBody eventBody)
        {
            var msg = new SendGridMessage();

            msg.AddSubstitution("-firstname-", eventBody.Order.FromUser.FirstName);
            msg.AddSubstitution("-lastname-", eventBody.Order.FromUser.LastName);
            msg.AddSubstitution("-orderid-", eventBody.Order.ID);
            msg.AddSubstitution("-datesubmitted-", eventBody.Order.DateSubmitted.ToString());
            msg.AddSubstitution("-subtotal-", eventBody.Order.Subtotal.ToString());
            msg.AddSubstitution("-tax-", eventBody.Order.TaxCost.ToString());
            msg.AddSubstitution("-shipping-", eventBody.Order.ShippingCost.ToString());
            msg.AddSubstitution("-total-", eventBody.Order.Total.ToString());
            msg.AddSubstitution("-lineitemcount-", eventBody.Order.LineItemCount.ToString());
            return(msg);
        }
        private List <GlobalMergeVar> BuildOrderMergeVars(OrderEventBody eventBody)
        {
            var mergeVars = new List <GlobalMergeVar>()
            {
                new GlobalMergeVar {
                    name = "firstname", content = eventBody.Order.FromUser.FirstName
                },
                new GlobalMergeVar {
                    name = "lastname", content = eventBody.Order.FromUser.LastName
                },
                new GlobalMergeVar {
                    name = "orderid", content = eventBody.Order.ID
                },
                new GlobalMergeVar {
                    name = "datesubmitted", content = eventBody.Order.DateSubmitted
                },
                new GlobalMergeVar {
                    name = "subtotal", content = eventBody.Order.Subtotal
                },
                new GlobalMergeVar {
                    name = "tax", content = eventBody.Order.TaxCost
                },
                new GlobalMergeVar {
                    name = "shipping", content = eventBody.Order.ShippingCost
                },
                new GlobalMergeVar {
                    name = "total", content = eventBody.Order.Total
                },
                new GlobalMergeVar {
                    name = "lineitemcount", content = eventBody.Order.LineItemCount
                },
                new GlobalMergeVar {
                    name    = "products",
                    content = eventBody.LineItems.Select(li =>
                    {
                        var mli = new MandrillLineItem
                        {
                            Cost             = li.LineTotal,
                            Quantity         = li.Quantity,
                            ProductDesc      = eventBody.Products.FirstOrDefault(p => p.ID == li.ProductID)?.Description,
                            ProductID        = li.ProductID,
                            ProductName      = eventBody.Products.FirstOrDefault(p => p.ID == li.ProductID)?.Name,
                            ShipToName       = li.ShippingAddress?.FirstName + " " + li.ShippingAddress?.LastName,
                            ShipToStreet1    = li.ShippingAddress?.Street1,
                            ShipToStreet2    = li.ShippingAddress?.Street2,
                            ShipToCity       = li.ShippingAddress?.City,
                            ShipToState      = li.ShippingAddress?.State,
                            ShipToPostalCode = li.ShippingAddress?.Zip,
                            ShipToCountry    = li.ShippingAddress?.Country
                        };

                        return(mli);
                    }).ToArray()
                },
                new GlobalMergeVar {
                    name    = "approvals",
                    content = eventBody.Approvals?.Select(a =>
                    {
                        var ma = new MandrillApproval
                        {
                            ApprovingGroupID  = a.ApprovingGroupID,
                            Status            = a.Status,
                            DateCreated       = a.DateCreated,
                            DateCompleted     = a.DateCompleted,
                            ApproverID        = a.Approver?.ID,
                            ApproverUsername  = a.Approver?.Username,
                            ApproverEmail     = a.Approver?.Email,
                            ApproverFirstName = a.Approver?.FirstName,
                            ApproverLastName  = a.Approver?.LastName,
                            ApproverPhone     = a.Approver?.Phone,
                            Comments          = a.Comments
                        };
                        return(ma);
                    }).ToArray()
                }
            };

            if (eventBody.Order.xp != null)
            {
                IList <XpRow> xpRows = XpParser.ToRows(eventBody.Order.xp.ToString());
                mergeVars.AddRange(xpRows.Select(
                                       xpRow => xpRow.Index == null ?
                                       new GlobalMergeVar {
                    name = "orderxp_" + xpRow.Key.Replace(".", "_"), content = xpRow.Value
                } :
                                       new GlobalMergeVar {
                    name = $"orderxp_{xpRow.Key.Replace(".", "_")}_{xpRow.Index}", content = xpRow.Value
                }));
            }
            return(mergeVars);
        }