task/ta-nst-009-01 -- new agent_stocktake table structure

nparcel/dbsession.py
* add new attribute agent_stocktake

nparcel/table/agent_stocktake.py
* new Agent Stocktake table
defect/de-25 -- refactor to make outbound FTP connection only if
local files exist
task/ta-nst-008-02 -- job table reference number extraction

nparcel/comms.py
* correct an issue with failed email notifications where multiple
  recipients was skewing the failed email address

nparcel/table/job.py
* new method reference_sql() xtract card_ref_nbr number against
  reference_nbr

nparcel/table/jobitem.py
* update the uncollected_jobitems_sql() method to ignore records that
  have either white space or a spurious "." in the email or phone
  number columns
task/ta-nst-008-03 -- jobitem table reference number extraction

nparcel/table/jobitem.py
* new method reference_sql() extract connote_nbr/item_nbr against
  reference_nbr
task/ta-nst-008-04 -- job item table reference number extraction
based on job.card_ref_nbr

nparcel/table/jobitem.py
* xtract connote_nbr/item_nbr against *reference_nbr* matched to the
  job.card_ref_nbr
task/ta-nst-008-05 -- refactor job item table reference number
extraction to merge query sets across job and job_item tables

nparcel/table/jobitem.py
* update the reference_sql() method to include a union between the job
  and job_item tables
task/ta-nst-008-06 -- agent_stocktake table reference number extraction

nparcel/table/agent_stocktake.py
* new method reference_sql() to extract agent_stocktake.reference_nbr
  records where processed_ts is NULL
task/ta-nst-008-07 -- integrate agent_stocktake.reference_nbr values
into aged stocktake query

nparcel/table/jobitem.py
* update reference_sql() method to conditionally use all
  agent_stocktake.reference_nbr values if not provided as an argument
task/ta-nst-008-08 -- integrate pickup_ts condition check

nparcel/table/jobitem.py
* updated the reference_sql() method to be pickup_ts aware
task/ta-nst-008-09 -- extract times

nparcel/table/jobitem.py
* updated reference_sql() and job_based_reference_sql() methods to
  extract additional date information
task/ta-nst-008-10 -- AgentStocktake reference extraction to be date
based

nparcel/table/agent_stocktake.py
* updated reference_sql() to incorporate day range in search
* added argument "day_range" to the reference_sql() method
task/ta-nst-008-11 -- provide Agent info

nparcel/table/jobitem.py
* refactor the reference_sql() and job_based_reference_sql() methods to
  extract Agent information
task/ta-nst-008-11 -- provide additional Job Item detail

nparcel/table/jobitem.py
* refactor the reference_sql() and job_based_reference_sql() methods to
  extract job BU_ID, job barcode, job_item pieces and job_item
  consumer_name
task/ta-nst-008-12 -- scaffolding for the new Audit() class
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