task/ta-npi-016-06 -- integrate the conditions map with the
nparcel.loader.process() method

nparcel/config.py
* introduced the global FLAG_MAP which maintains a list of flags and
  their index offset in the configuration file
* new method condition_map() which returns the Business Unit condition
  map values

nparcel/loader.py
* process() and table_column_map() method has a new cond_map attribute
  which relates to the Business Unit's condition flags
* set_default_equals() method has new boolean attribute,
  item_number_excp which translates to the BU's item_number_excp
  condition flag value

nparcel/loaderdaemon.py
* refactor the _start() method to be more optimal
* loader.process() call in the _start() method now incorporates the
  condition_map flag data structure
task/ta-npi-016-07 -- barcode, connote or item_number raises exception
if empty

nparcel/loader.py
* set_default_equals() method had a bug which was unconditionally
  raising exceptions if condition flag was set
* made connote a required field

nparcel/tests/__init__.py
nparcel/tests/test_loader_ipec.py
* new Ipec-specific test cases
task/ta-npi-016-09 -- job search against job_item.item_nbr

nparcel/table/job.py
* new item_nbr_based_job_sql() method which queries job table for
  records that are related to a job_item record with  a given item_nbr

nparcel/table/jobitem.py
* new item_number_sql() method that provides an SQL wrapper to extract
  records where job_item.item_nbr is equal to *item_nbr*
task/ta-npi-016-10 -- new condition flags to control where job record
is extracted from either connote or item_nbr

nparcel/config.py
* updated the FLAG_MAP to include the new flags 'job_from_connote' and
  'job_from_item_nbr'
* patched the condition() method to catch IndexError exceptions

nparcel/conf/nparceld.conf
* updated the configuration to reflect new flags
task/ta-npi-016-08 -- manufactured barcode should pre-check job_item
table against connote and item_nbr

nparcel/conf/nparceld.conf
nparcel/config.py
* removed the job_item/connote search flags as these are now redundant
  with new processing logic

nparcel/loader.py
* connote now taken from the fields dictionary for more accuracy
* new method get_jobitem_based_job_id() which checks the "job" table
  for related "job_item" records with provided connote and item_nbr
* new method get_item_number_job_id() which checks the "job" table for
  related "job_item" records with item_nbr

nparcel/table/job.py
* new method jobitem_based_job_search_sql() which generates SQL that
  queries the job table for records that are related to a job_item
  record with provided connote and item_nbr
task/ta-npi-016-11 -- manufactured barcode should not generate another
job_item lookup in an update scenario

nparcel/loader.py
* process() method has extra smarts to flag if a job_item has been
  identified as part of a current job table check.  Specifically
  during the manufactured barcode check
* update() method signature now includes skip_jobitem_chk argument
  which bypasses jobitem insert check and only updates the job table
  record

nparcel/table/jobitem.py
* new method connote_item_nbr_sql() which generates an SQL wrapper to
  extract records where job_item.connote_nbr is equal to connote and
  job_item.item_nbr equals item_nbr
Quick reporter script, nprpt.
task/ta-npi-016-12 -- parse mobile number and email address

nparcel/loader.py
nparcel/table/jobitem.py
* add support for "Mobile Number" and "Email Address"
task/ta-npi-016-13 -- mobile validation

nparcel/smser.py
* new method validate() to validate a given mobile number
task/ta-npi-14 -- email validation

nparcel/emailer.py
* new method validate()
New report around the exporterd process
task/ta-npi-016-15 -- factor our proxy information into the config

nparcel/conf/nparceld.conf
* placeholder for the new proxy section

nparcel/config.py
* new method proxy_kwargs() which extracts the proxy settings from the
  config file
* new method proxy_string() which constructs a proxy string based on
  the kwargs dictionary that could be fed directly into a HTTP/S header

nparcel/loader.py
* __init__ now accepts proxy and scheme attributes to support proxy
  authentication

nparcel/smser.py
* __init__ now accepts proxy and proxy_scheme attributes to support
  proxy authentication
* factor out hardwired proxy credentials
task/ta-npi-016-16 -- verify loader parse

nparcel/loader.py
* patch 'Mobile Number' settings in the FIELD global
task/ta-npi-016-18 -- prepare email and SMS condition flags

nparcel/conf/nparceld.conf
* placeholders for new send_sms and send_email flags

nparcel/config.py
* update the FLAG_MAP global to support send_email and send_sms

required_facility
* new method required_facility() which check the flag conditions as a
  set and returns True if at least one of the flags is set
task/ta-npi-016-17 -- factor out RESTful SMS API

nparcel/conf/nparceld.conf
* placeholder for the new "rest" section

nparcel/config.py
* new attribute, rest
* updated parse_args() method to read the "rest" section

nparcel/loader.py
* __init__ now support API initialisation via the new "api" argument

nparcel/smser.py
* new attribute, api
* __init__ now support API initialisation via the new "api" argument
* send method now checks for a defined api before attempting the SMS
  send
task/ta-npi-016-19 -- support for conditional email

nparcel/loader.py
* deprecated the special email requirements
* update process() method so that connote is taken from the cleansed
  and validated job_item_data variable
* update process() method so that email comms are sent only if the
  facility is enabled

nparcel/emailer.py
* automated sender identification now performed in __init__
* refactored the send() method so that it incorporates email recipient
  validation

nparcel/loaderdaemon.py
* deprecated all reference to the POC special email facility
task/ta-npi-016-20 -- add support for conditional SMS

nparcel/conf/nparceld.conf
* deprecate the SMS special facility
* add placeholder for new option "sms_scheme" in the rest section

nparcel/config.py
* deprecate support for special email and sms facilities

nparcel/emailer.py
* tweak the initialisation of the _sender attribute

nparcel/loader.py
* patch bug with the Smser object initialisation

nparcel/loaderdaemon.py
* deprecate support for special sms facilities
* provide required SMS initialisation argument to Loader() call

nparcel/smser.py
* refactor the send() method to provide some number validation