task/us89-ta33 -- Exporter is aware of inbound ParcelPoint report files

nparcel/conf/nparceld.conf
* new config item under the [dirs] section, exporter_in that is a
  directory list for file-based events to trigger a job_item closure
* new config item under the new [exporter] section, "file_formats"
  that is a list of python-based regular expressions that represent
  the type of files that can be parsed by the exporter

nparcel/b2cconfig.py
* support for new config item exporter_in
* support for new config item exporter_file_formats

nparcel/exporter.py
* class Exporter() now inherits from nparcel.Service() to leverage the
  TPP DB connectivity information
* support for new attribute exporter_in
* support for new attribute exporter_file_formats
* new method get_files() that identifies exporter report files
task/us89-ta35 -- nparcel.files.utils.copy_file() function need to
guarantee an atomic copy

nparcel/utils/files
* refactor the copy_files() function to provide an atomic copy
task/us89-ta34 -- Exporter can extract connote and item number from
inbound ParcelPoint report files

nparcel/exporter.py
* new method parse_report_file() that can parse the contents of a
  report file and extract the connote and item number fields
* new attribute connote_header that is a token used to identify the
  connote column in the Exporter report file
* new attribute item_nbr_header token used to identify the item number
  column in the Exporter report file

nparcel/b2cconfig.py
nparcel/conf/nparceld.conf
* support for the new attributes connote_header and item_nbr_header

nparcel/exporterdaemon.py
* refactored the _start() method to construct a kwargs dictionary in
  preparation for a varags-based initialisation of an Exporter() object
task/us89-ta36 -- Exporter can close off the TPP job_item taken from the
inbound ParcelPoint report files

nparcel/table/jobitem.py
* new method upd_file_based_collected_sql() that provides an SQL
  wrapper to update the collected items from the "jobitems" table
  based on connote and item number

nparcel/exporter.py
* new method file_based_updates() that acts as a wrapper to close of
  file-based records
* updated the process() method to include a call to file_based_updates()
task/us89-ta37 -- Exporter raises an exception if detail taken from
the inbound ParcelPoint report files not in TPP DB

nparcel/exporter.py
* updated the file_based_updates() method to trigger and alert if a
  connote/item_nbr combination is missing from the TPP job_item table

nparcel/exporterdaemon.py
* support for support comms notifications if an alert is detected
  during the nparcel.exporter:process() workflow
task/us85-ta39 -- ADP flat file column headers as a configurable item

nparcel/b2cconfig.py
nparcel/conf/nparceld.conf
* new attribute adp_headers that is a dictionary of agent table
  columns to column headers in the ADP bulk insert file
task/us85-ta44 -- Agent table ORM update - functional

nparcel/dbsession.py
* support for new parcel_size table creation

nparcel/table/agent.py
* update the schema() property method to capture all of the fields
  that could come through via the ADP bulk insert list

nparcel/table/parcel_size.py
* ORM for new parcel_size table
task/us85-ta41 -- ADP flat file parser module structure - functional

nparcel/adpparser.py
* new AdpParser() class module structure that includes
  a file parser and and object setter
task/us85-ta45 -- ADP flat file parser daemoniser module structure -
functional

nparcel/adpdaemon.py
* new AdpDaemon facility with _start() method stub
task/us85-ta40 -- xlsx to csv converter

nparcel/conf/nparceld.conf
nparcel/b2cconfig.py
* new attribute adp_dirs that defines the ADP bulk load inbound
  directory
* new attribute file_formats under the [adp] section that is a list of
  filters to apply against ADP bulk load files

nparcel/ondeliverydaemon.py
* refactored the get_files() method by removing the redundant
  validate_file() method

nparcel/adpdaemon.py
* new support for new attribute adp_in_dirs
* _start() method support for inline file processing
* new attribute adp_file_formats that can filter out
  special types of ADP bulk load files
* new method get_files() that looks for ADP files in inbound directory

nparcel/utils/files.py
* new function xlsx_to_csv_converter()
task/us85-ta45 -- ADP flat file parser daemoniser module structure -
functional

nparcel/adpdaemon.py
* new AdpDaemon facility with _start() method stub
Merge branch 'task/us85-ta40' into feature/us-85

Conflicts:
	nparcel/adpdaemon.py
	nparcel/tests/test_adpdaemon.py
task/us85-ta43 -- ADP agent table insert SQL if the code has not
already been defined

nparcel/b2cconfig.py
nparcel/conf/nparceld.conf
* new attribute code_header that is a special ADP bulk insert header
  name that relates to the agent.code column

nparcel/adp.py
* introduce the Adp() class infrastructure
* new attribute "headers" which is a dictionary of  agent  table
  column keys and corresponding ADP bulk insert file header values
* new method process() that parses an ADP bulk insert file and
  attempts to load the items into the agent table
* new method extract_values() takes the raw values presented by a row
  in the ADP bulk update file and extracts the required values as per
  the values in the headers attribute
* update the process() method to check agent table against code before
  attempting an insert
task/us101-ta51 -- ADP bulkd file loader script npadpd

nparcel/bin/npadpd
* new npadpd ADP bulk loader script

nparcel/adpdaemon.py
* update the _start() method to search for ADP bulk load files in
  nominated directory
task/us101-ta55 -- ADP column value to agent table SQL sanitiser and
validator

nparcel/adp.py
* process() method now returns a boolean value against success
* new method sanitise() that provides hardwired sanitiser rules that
  need to be applied to bulk insert data before being inserted into
  the database
* new method validate() that provides hardwired validator rules that
  need to be applied to bulk insert data before being inserted into
  the database

nparcel/loader.py
nparcel/postcode.py
* factor out the translate_postcode() method into generic module,
  parcel/postcode.py
Add support for alerting.
task/us101-ta56 -- Agent reference table ORM update - functional

nparcel/table/delivery_partner.py
nparcel/table/login_account.py
nparcel/table/system_level_access.py
* new ORM module structures
task/us101-ta56 -- Agent reference table ORM update - functional

nparcel/table/login_access.py
* new ORM module structure
task/us101-ta58 -- ADP delivery_partner values as a configuration item

nparcel/conf/nparceld.conf
* support for the new delivery_partners attribute
* support for the new adp_default_password attribute
task/us101-ta55 (commit 2) -- ADP column value to agent table SQL
sanitiser and validator

nparcel/conf/nparceld.conf
nparcel/b2cconfig.py
* new attribute delivery_partners which is a list of
  "delivery_partner.name" column values
* new attribute adp_default_passwords delivery partner lookup for the
  default password to use when populating the "login_account.password"
  field
* refactor the [adp_headers] section so that it includes the table
  name as we are now inserting into multiple tables and need this
  level of separation to avoid ambiguous column names

nparcel/adp.py
* support for new attribute delivery_partners
* new method reset() that clears the alert list and commits to the
  database as per the context of the pass
* refactor the sanitise() method to determine the delivery partner id
  before inserting to the agent table
* refactor the validate method to validate against the
  delivery_partner.id column