defect/de-23 -- OnDelivery comms write issue during dry run

nparcel/ondelivery.py
* updated the process() method so that failed comms events file writes
  do not log
defect/de-23 -- MSSQL-related issue that errors when single item tuple
is provided within IN clause.

nparcel/table/jobitem.py
* updated uncollected_jobitems_sql() method to re-format single item
  tuple structures to suit MSSQL style
Add more detail to condition map descriptions
defect/de-25 -- refactor to make outbound FTP connection only if
local files exist
defect/de-25 -- refactor to make outbound FTP connection only if
local files exist
task/ta-nst-008-13 -- scaffolding for new Uncollected() service

nparcel/uncollected.py
* new method process() that checks agent_stocktake table for items
  that exist in the Toll Parcel Portal and are uncollected and aged
Merge branch 'master' into dev
Merge branch 'feature/us-nst-008' into dev
task/ta-nst-011-01 -- scaffolding for new Writer() class
task/ta-nst-011-02 -- write out to a CSV file

nparcel/writer.py
* new attributes "headers" and "write_headers"
* new class callable __call__ that prepares a DictWriter object and
  write out data to a CSV file
task/ta-nst-008-14 -- refactor the uncollected query columns

nparcel/table/jobitem.py
* new method _select_columns() as a helper that captures required
columns in the uncollected aged report query
Merge branch 'feature/us-nst-011' of https://github.com/loum/nparcel into feature/us-nst-011
task/ta-nst-011-03 -- raw row-based results cleansing

nparcel/uncollected.py
* new method _cleanse() that at this time simply prepends "=" to the
  "CONNOTE_NBR", "BARCODE" and "ITEM_NBR columns
task/ta-nst-011-03 -- refactor the cleanse to incorporate date columns

nparcel/uncollected.py
* added "JOB_TS", "CREATED_TS", "NOTIFY_TS" and "PICKUP_TS"
  to the _cleanse() method column patch list
* refactor the escape format ('="xxx"') in the _cleanse() method to
  present correctly in Excel
task/ta-nst-008-15 -- update processed_ts before running report

nparcel/table/agent_stocktake.py
* updated the reference_sql() method to exclude processed_ts from the
  query
* new method update_processed_ts_sql() to update the
  agent_stocktake.processed_ts column

nparcel/uncollected.py
* updated the process() method to set the agent_stocktake.processed_ts
  column before starting processing