Thursday, July 24, 2014

Recurly Credit Card Processing - True Metered Billing

Overview:  I have a client that wants to simply bill a transaction fee at the end of each month.  After doing my due diligence, Recruly appeared to be the best solution for the problem as they assured me that what was i doing was not only possible but simple.

To make a long story short, technical support couldn't provide me with an example nor would they tell me anything but "look at our website" which was less then helpful as it contradicted itself.  Sometimes it would say to modify the plan subscription itself, sometimes it would say to create an addon.  None of this is correct.

The correct way to do metered billing with Recurly using is to use the following procedure:


  1. Create an account without a subscription plan
  2. At the end of each month simple add an adjustment to the account and invoice the pending charges.

Code (C#):

private void CreateAccount(RecurlyAccount recurlyAccount)
        {

            var account = new Account(recurlyAccount.AccountCode)
            {
                FirstName = recurlyAccount.FirstName,
                LastName = recurlyAccount.LastName,
                Email = recurlyAccount.Email,
                CompanyName = recurlyAccount.CompanyName,
            };

            account.BillingInfo = new BillingInfo(account)
            {
                LastName = recurlyAccount.RecurlyBillingInfo.FirstName,
                FirstName = recurlyAccount.RecurlyBillingInfo.LastName,
                Address1 = recurlyAccount.RecurlyBillingInfo.Address1,
                Address2 = recurlyAccount.RecurlyBillingInfo.Address2,
                City = recurlyAccount.RecurlyBillingInfo.City,
                State = recurlyAccount.RecurlyBillingInfo.State,
                Country = "US",
                PostalCode = recurlyAccount.RecurlyBillingInfo.PostalCode,
                CreditCardNumber = recurlyAccount.RecurlyBillingInfo.CreditCardNumber,
                CardType = recurlyAccount.RecurlyBillingInfo.CardType,
                ExpirationMonth = recurlyAccount.RecurlyBillingInfo.ExpirationMonth,
                ExpirationYear = recurlyAccount.RecurlyBillingInfo.ExpirationYear,
                Company = recurlyAccount.RecurlyBillingInfo.Company
            };

            account.Create();
        }

 
public virtual void BillCreditCard(Account account, int quantity, int amountInCents)
        {

            account.NewAdjustment("USD", amountInCents, "Orders", quantity).Create();
            account.InvoicePendingCharges();
            
        }

Wednesday, May 14, 2014

Scaling Agile Across the Enterprise

Microsoft put out some videos about "Scaling Agile Across the Enterprise".  I particularly like the video which talks about how the waterfall method is not a good way to design software anymore and how businesses struggle with that.

It can be found here: https://www.youtube.com/watch?v=n79fJUiQ-PU


Wednesday, March 12, 2014

Nhibernate, Abstract Base Classes and JSON.NET

While working on a project I ran into an issue where JSON.NET was not serializing and deserializing my nhibernate entities that used polymorphism. I found plenty of examples that showed how to do this with objects directly but none with Lists and Collections. This code isn't generic like it should be but worked for my purposes. So here is my code:

POCO:

 
[JsonConverter(typeof(LineItemConverter))]
public virtual ICollection LineItems { get; set; }

JsonConverter:

 
public class LineItemConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(LineItem).IsAssignableFrom(objectType);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {

            var lineitems = JArray.Load(reader);
            var lineItemObjects = new List();


            foreach (var lineitem in lineitems)
            {
                switch (EnumUtil.ParseEnum(lineitem["lineItemType"].Value()))
                {
                    case LineItemType.Assessorial:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.DeficitWeight:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.Discount:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.FloorAdjustment:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.Freight:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.Fuel:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.Other:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    default:
                        break;

                } 
            }

            return lineItemObjects;
            
        }


        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {

            var lineitems = value as ICollection;
            serializer.Serialize(writer, lineitems.ToArray());
            
        }

Tuesday, January 28, 2014

Angluar JS + c# Web API decimals not routing

For some reason when i would put/get decimal values with the angularjs $resource i would get a 404. After lots of research i found out that this is due to $resource dropping trailing slashes (more info here: http://stackoverflow.com/questions/14533117/angular-trailing-slash-for-resource ). There is talk that in angular 1.3 they will add this as an option but for now we need to use a hack.
HACK: Add "\\/" to the end of your url in the $resource. For example: return $resource('/api/pricingAgreementItem/:id/:action/:value\\/', { id: '@id' },... See below for a more complete example.
 Javascript: C#:

Wednesday, November 20, 2013

Simple Membership + WebMatrix.Data & WebMatrix.WebData

In order to use simple membership roles with an MVC5 project you need WebMatrix.WebData reference.  To obtain this Reference you need to use nuget and install Microsoft.AspNet.WebHelpers.  I am documenting it here so i don't forget. Non-MVC projects need Microsoft.AspNet.WebPages.OAuth (Install-Package Microsoft.AspNet.WebPages.OAuth) http://stackoverflow.com/questions/13324544/how-to-add-asp-net-membership-provider-in-a-empty-mvc-4-project-template/13325883#13325883

Sunday, November 17, 2013

Visual Studio 2013 + Angularjs + JasmineJS + Resharper 7/8 (or Chutzpah)

I recently started a project which used the following technologies: Visual Studio 2013 + Angularjs + JasmineJS + Resharper 7/8 (or Chutzpah).

I was having a rough time getting JasmineJS to work with Resharper/Chutzpah.  The strange thing was that it would work in the specrunner but not in the actual resharper or chutzpah interfaces which directly integrate into Visual Studio (which is what i wanted).

After spending a couple hours of research i came upon this blog: http://microsoftwindowsblogger.blogspot.com/2013/10/best-unit-testing-angularjs-with.html

Basically you have to inject the script references into the unit test files (which i knew) but they must ALSO BE RELATIVE PATHS TO THE TEST FILE!

Here is an example of a working Jasmine Unit Test which integrates angularjs and works with both Chutzpah and Resharper 7+:

Wednesday, October 9, 2013

SQL Express 2012 Automated Backup Script

SQL Express doesn't come with the SQL Server Agent and so you can not use the Full SQL server backup maintenance plans.  To get around this I am using the following script which is executed once a day by the task scheduler.

sp_BackupDatabases can be found here: http://support.microsoft.com/kb/2019698

database_backup.bat

md c:\temp_database_bak
sqlcmd -S {{MACHINE_NAME}}\SQLEXPRESS -Q "EXEC sp_BackupDatabases @backupLocation='c:\temp_database_bak\', @backupType='F'"

FOR %%A IN (%Date%) DO (
    FOR /F "tokens=1-3 delims=/-" %%B in ("%%~A") DO (
        SET Today=%%D%%B%%C
    )
)

"C:\Program Files\7-Zip\7z.exe" a c:\backup_mssql\Database_BAK.%TODAY%.7z "C:\temp_database_bak\"

rmdir c:\temp_database_bak /S /Q

Phoenix

I am resurrecting this tech blog for notes related to Azure Logic Apps with SAP.