moved outreach pathology request forms and questionnaire decision tree to model; added ::Tiny::errstr to lims_config.pl after settings.txt corruption caused errors
patched M::Outreach::do_letter_dispatch() to use insert_or_update_on_duplicate_key() instead of insert_or_update(); added array size display to outreach_notification_dispatch.tt
outreach notification mods - callback for template to extract GP surname, set_notifications() in M::Outreach::get_overdue_packs() throws error if %maps undef; reworded cron/outreach_clinic_return.tt
completed outreach overdue pack notification function; moved logic to skip if notification already sent from template to model; separated outreach worklists from other worklists; switched off PDS lookup for test scripts; patched validation_profiles/admin.t consistent with change to username validation
MAJOR CHANGE: moved sql_lib() from M::Base to new M::Role::Query; moved all M::R::QueryFormatter methods into M::R::Query; removed sql_lib() from ScriptHelpers - using new M::Roles::Query method; removed lims_dbix() from M::Base - now loaded via M::Role::DBIxSimple on demand; moved get_sql_with_constraint() from M::R::DBIxSimple to M::R::Query; method gets dbh from lims_db not lims_dbix in M::LabSection::update_lab_sections() & M::Specimen::update_specimens(); added elements() to Local::QueryLibrary