//NM - At a high level, the primary steps should be broken out into their own methods, for instance
        // LoadConfiguration();
        // ProcessTaxDocument();
        // WriteToAzure();
        // WriteToDatabase();
        //
        // That way people can understand what is going on at a high level without diving deep into the code
        public Worker()
        {
            // NM - Modify this to read these values from a configuration file.  Google 'how to use appsettings'
            CloudStorageAccount csa = CloudStorageAccount.Parse(
                "DefaultEndpointsProtocol=https;AccountName=cminton;AccountKey=9/z9oCB6lMWHXjxBFEmxB79DUVx0bHF91iHMMjvpX1XXXBMwiJ5+ADpnAQhEhJgtBu8uw9qOtRAq/w2uQT723A==");
            CloudBlobClient    blobclient = csa.CreateCloudBlobClient();
            CloudBlobContainer container  = blobclient.GetContainerReference("mycontainer");

            string connectionstr =
                "Server=tcp:cminton.database.windows.net,1433;Database=cmintondb;User ID=cminton;Password=Foopass42;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;";

            // create a blob object, then get the document blob from azure
            CloudBlockBlob docblob = container.GetBlockBlobReference("myblob");

            docblob.FetchAttributes();

            // extract the scan data from the blob
            TaxDocumentScan tdscan = new TaxDocumentScan(docblob);

            // create OCRClient and send scan data through OCR
            // get tax document object with completed fields
            OCRClient   ocr    = new OCRClient();
            TaxDocument taxdoc = ocr.ProcessTaxDocument(tdscan);

            // populate azure sql database with tax document fields
            using (var connection = new SQL.SqlConnection(connectionstr))
            {
                connection.Open();
                Console.WriteLine("Connection opened successfully.");
                UploadTaxDocument(connection, taxdoc);
            }
        }
        // NM - Refactor this into a Repository class (google 'repository pattern'), which uses LINQ and Entity Framework.
        // If you need help this, let me know

        // requires an open connection
        void UploadTaxDocument(SQL.SqlConnection connection, TaxDocument doc)
        {
            Console.WriteLine("Writing tax document to database...");
            SQL.SqlParameter parameter;

            using (var command = new SQL.SqlCommand())
            {
                command.Connection  = connection;
                command.CommandType = D.CommandType.Text;
                command.CommandText = @"
insert into taxdocuments
    (importanttaxnumber,
    taxrate,
    propertyname,
    propertyvalue
    )
values
    (@importanttaxnumber,
    @taxrate,
    @propertyname,
    @propertyvalue
    ); ";

                parameter       = new SQL.SqlParameter("@importanttaxnumber", D.SqlDbType.Int);
                parameter.Value = doc.ImportantTaxNumber;
                command.Parameters.Add(parameter);

                parameter       = new SQL.SqlParameter("@taxrate", D.SqlDbType.Float);
                parameter.Value = doc.TaxRate;
                command.Parameters.Add(parameter);

                parameter       = new SQL.SqlParameter("@propertyname", D.SqlDbType.NVarChar, 50);
                parameter.Value = doc.PropertyName;
                command.Parameters.Add(parameter);

                parameter       = new SQL.SqlParameter("@propertyvalue", D.SqlDbType.Money);
                parameter.Value = doc.PropertyValue;
                command.Parameters.Add(parameter);

                command.ExecuteNonQuery();
                Console.WriteLine("Insert operation completed.");
            }
        }
        public TaxDocument ProcessTaxDocument(TaxDocumentScan document)
        {
            // NM - you may want to rename this variable to something more readable.  Typing is cheap whereas understanding
            // a piece of code is expensive.  Something like 'taxDocument'.
            TaxDocument tdout = new TaxDocument();

            tdout.ImportantTaxNumber = 42;
            tdout.PropertyName       = "Six Flags over Atlanta";
            tdout.PropertyValue      = 988342.37;
            tdout.TaxRate            = 0.51;
            Console.WriteLine("ProcessTaxDocument called");
            Console.WriteLine("blob data: {0}", Encoding.Default.GetString(document.Data));
            Console.WriteLine("Returning TaxDocument with params:");
            Console.WriteLine("ImportantTaxNumber={0}", tdout.ImportantTaxNumber);
            Console.WriteLine("PropertyName={0}", tdout.PropertyName);
            Console.WriteLine("PropertyValue={0}", tdout.PropertyValue);
            Console.WriteLine("TaxRate={0}", tdout.TaxRate);

            return(tdout);
        }