From f41ed0848caf111a093c9d4a97d1dbea505e637a Mon Sep 17 00:00:00 2001 From: Llewellyn van der Merwe Date: Tue, 8 Mar 2016 12:24:26 +0200 Subject: [PATCH] Added Clinic, Payment, and help documents. --- README.md | 22 +- admin/access.xml | 166 ++- admin/assets/css/clinic.css | 27 + admin/assets/css/clinics.css | 27 + admin/assets/css/help_document.css | 27 + admin/assets/css/help_documents.css | 27 + admin/assets/css/payment.css | 27 + admin/assets/css/payments.css | 27 + admin/assets/images/component-300.jpg | Bin 42456 -> 44403 bytes admin/assets/images/icons/clinics.png | Bin 0 -> 16919 bytes admin/assets/images/icons/help_documents.png | Bin 0 -> 26097 bytes admin/assets/images/icons/location_add.png | Bin 19789 -> 0 bytes admin/assets/images/icons/payment_add.png | Bin 0 -> 13445 bytes admin/assets/images/icons/payments.png | Bin 0 -> 11855 bytes admin/assets/images/icons/region_add.png | Bin 16144 -> 0 bytes admin/controller.php | 5 +- admin/controllers/clinic.php | 326 ++++++ admin/controllers/clinics.php | 111 +++ admin/controllers/help.php | 129 +++ admin/controllers/help_document.php | 326 ++++++ admin/controllers/help_documents.php | 111 +++ admin/controllers/location.php | 26 +- admin/controllers/payment.php | 326 ++++++ admin/controllers/payments.php | 111 +++ admin/controllers/region.php | 26 +- admin/controllers/support_group.php | 26 +- admin/helpers/negativefinder.php | 67 ++ admin/helpers/supportgroups.php | 205 +++- .../en-GB/en-GB.com_supportgroups.ini | 409 +++++++- .../en-GB/en-GB.com_supportgroups.sys.ini | 2 + .../{location => clinic}/details_above.php | 2 +- .../details_fullwidth.php | 3 +- admin/layouts/clinic/details_under.php | 41 + admin/layouts/clinic/index.html | 1 + admin/layouts/clinic/metadata.php | 56 ++ admin/layouts/clinic/publishing.php | 64 ++ admin/layouts/country/regions_fullwidth.php | 6 +- admin/layouts/help_document/details_above.php | 42 + .../help_document/details_fullwidth.php | 48 + admin/layouts/help_document/details_left.php | 58 ++ admin/layouts/help_document/details_right.php | 56 ++ admin/layouts/help_document/details_under.php | 41 + admin/layouts/help_document/index.html | 1 + admin/layouts/help_document/publishing.php | 58 ++ admin/layouts/help_document/publlshing.php | 60 ++ admin/layouts/location/settings_above.php | 42 + admin/layouts/location/settings_fullwidth.php | 49 + .../location/support_groups_fullwidth.php | 155 +++ admin/layouts/payment/details_above.php | 41 + .../{region => payment}/details_left.php | 2 +- .../{region => payment}/details_right.php | 2 +- admin/layouts/payment/index.html | 1 + admin/layouts/payment/publishing.php | 58 ++ admin/layouts/payment/publlshing.php | 60 ++ admin/layouts/region/locations_fullwidth.php | 127 +++ admin/layouts/region/settings_left.php | 54 + admin/layouts/region/settings_right.php | 54 + admin/layouts/support_group/details_above.php | 41 + admin/layouts/support_group/details_left.php | 4 +- admin/layouts/support_group/details_right.php | 59 ++ admin/layouts/support_group/details_under.php | 41 + .../support_group/payments_fullwidth.php | 133 +++ admin/models/clinic.php | 888 +++++++++++++++++ admin/models/clinics.php | 373 +++++++ admin/models/country.php | 33 +- admin/models/fields/articles.php | 115 +++ admin/models/fields/clinics.php | 115 +++ admin/models/fields/locations.php | 119 +++ admin/models/fields/regions.php | 2 +- admin/models/fields/supportgroups.php | 115 +++ admin/models/forms/clinic.js | 25 + admin/models/forms/clinic.xml | 196 ++++ admin/models/forms/help_document.js | 311 ++++++ admin/models/forms/help_document.xml | 253 +++++ admin/models/forms/location.xml | 1 + admin/models/forms/payment.js | 25 + admin/models/forms/payment.xml | 190 ++++ admin/models/forms/region.xml | 1 + admin/models/forms/support_group.xml | 127 +++ admin/models/help_document.php | 942 ++++++++++++++++++ admin/models/help_documents.php | 479 +++++++++ admin/models/location.php | 122 ++- admin/models/locations.php | 28 +- admin/models/payment.php | 888 +++++++++++++++++ admin/models/payments.php | 466 +++++++++ admin/models/region.php | 118 ++- admin/models/regions.php | 28 +- admin/models/support_group.php | 310 +++++- admin/models/support_groups.php | 79 +- admin/models/supportgroups.php | 39 +- admin/sql/install.mysql.utf8.sql | 489 +++++---- admin/sql/uninstall.mysql.utf8.sql | 5 +- admin/tables/clinic.php | 351 +++++++ admin/tables/help_document.php | 351 +++++++ admin/tables/payment.php | 351 +++++++ admin/views/clinic/submitbutton.js | 49 + admin/views/clinic/tmpl/edit.php | 95 ++ admin/views/clinic/tmpl/index.html | 1 + admin/views/clinic/view.html.php | 200 ++++ admin/views/clinics/index.html | 1 + admin/views/clinics/tmpl/default.php | 99 ++ .../views/clinics/tmpl/default_batch_body.php | 32 + .../clinics/tmpl/default_batch_footer.php | 37 + admin/views/clinics/tmpl/default_body.php | 111 +++ admin/views/clinics/tmpl/default_foot.php | 32 + admin/views/clinics/tmpl/default_head.php | 64 ++ admin/views/clinics/tmpl/default_toolbar.php | 59 ++ admin/views/clinics/tmpl/index.html | 1 + admin/views/clinics/view.html.php | 251 +++++ admin/views/country/tmpl/edit.php | 2 + admin/views/country/view.html.php | 2 +- admin/views/help_document/submitbutton.js | 49 + admin/views/help_document/tmpl/edit.php | 195 ++++ admin/views/help_document/tmpl/index.html | 1 + admin/views/help_document/view.html.php | 200 ++++ admin/views/help_documents/index.html | 1 + admin/views/help_documents/tmpl/default.php | 99 ++ .../tmpl/default_batch_body.php | 32 + .../tmpl/default_batch_footer.php | 37 + .../help_documents/tmpl/default_body.php | 123 +++ .../help_documents/tmpl/default_foot.php | 32 + .../help_documents/tmpl/default_head.php | 76 ++ .../help_documents/tmpl/default_toolbar.php | 59 ++ admin/views/help_documents/tmpl/index.html | 1 + admin/views/help_documents/view.html.php | 478 +++++++++ admin/views/location/tmpl/edit.php | 22 +- admin/views/location/view.html.php | 45 +- admin/views/locations/tmpl/default_body.php | 10 +- admin/views/locations/view.html.php | 8 +- admin/views/payment/submitbutton.js | 49 + admin/views/payment/tmpl/edit.php | 93 ++ admin/views/payment/tmpl/index.html | 1 + admin/views/payment/view.html.php | 200 ++++ admin/views/payments/index.html | 1 + admin/views/payments/tmpl/default.php | 99 ++ .../payments/tmpl/default_batch_body.php | 32 + .../payments/tmpl/default_batch_footer.php | 37 + admin/views/payments/tmpl/default_body.php | 114 +++ admin/views/payments/tmpl/default_foot.php | 32 + admin/views/payments/tmpl/default_head.php | 67 ++ admin/views/payments/tmpl/default_toolbar.php | 59 ++ admin/views/payments/tmpl/index.html | 1 + admin/views/payments/view.html.php | 332 ++++++ admin/views/region/tmpl/edit.php | 22 +- admin/views/region/view.html.php | 45 +- admin/views/regions/tmpl/default_body.php | 8 +- admin/views/regions/view.html.php | 8 +- admin/views/support_group/tmpl/edit.php | 27 +- admin/views/support_group/view.html.php | 45 +- .../support_groups/tmpl/default_body.php | 35 +- .../support_groups/tmpl/default_foot.php | 2 +- .../support_groups/tmpl/default_head.php | 15 + admin/views/support_groups/view.html.php | 59 +- script.php | 549 ++++++++-- site/controllers/help.php | 130 +++ site/helpers/supportgroups.php | 66 +- supportgroups.xml | 2 + 157 files changed, 16111 insertions(+), 474 deletions(-) create mode 100644 admin/assets/css/clinic.css create mode 100644 admin/assets/css/clinics.css create mode 100644 admin/assets/css/help_document.css create mode 100644 admin/assets/css/help_documents.css create mode 100644 admin/assets/css/payment.css create mode 100644 admin/assets/css/payments.css create mode 100644 admin/assets/images/icons/clinics.png create mode 100644 admin/assets/images/icons/help_documents.png delete mode 100644 admin/assets/images/icons/location_add.png create mode 100644 admin/assets/images/icons/payment_add.png create mode 100644 admin/assets/images/icons/payments.png delete mode 100644 admin/assets/images/icons/region_add.png create mode 100644 admin/controllers/clinic.php create mode 100644 admin/controllers/clinics.php create mode 100644 admin/controllers/help.php create mode 100644 admin/controllers/help_document.php create mode 100644 admin/controllers/help_documents.php create mode 100644 admin/controllers/payment.php create mode 100644 admin/controllers/payments.php create mode 100644 admin/helpers/negativefinder.php rename admin/layouts/{location => clinic}/details_above.php (97%) rename admin/layouts/{location => clinic}/details_fullwidth.php (96%) create mode 100644 admin/layouts/clinic/details_under.php create mode 100644 admin/layouts/clinic/index.html create mode 100644 admin/layouts/clinic/metadata.php create mode 100644 admin/layouts/clinic/publishing.php create mode 100644 admin/layouts/help_document/details_above.php create mode 100644 admin/layouts/help_document/details_fullwidth.php create mode 100644 admin/layouts/help_document/details_left.php create mode 100644 admin/layouts/help_document/details_right.php create mode 100644 admin/layouts/help_document/details_under.php create mode 100644 admin/layouts/help_document/index.html create mode 100644 admin/layouts/help_document/publishing.php create mode 100644 admin/layouts/help_document/publlshing.php create mode 100644 admin/layouts/location/settings_above.php create mode 100644 admin/layouts/location/settings_fullwidth.php create mode 100644 admin/layouts/location/support_groups_fullwidth.php create mode 100644 admin/layouts/payment/details_above.php rename admin/layouts/{region => payment}/details_left.php (97%) rename admin/layouts/{region => payment}/details_right.php (97%) create mode 100644 admin/layouts/payment/index.html create mode 100644 admin/layouts/payment/publishing.php create mode 100644 admin/layouts/payment/publlshing.php create mode 100644 admin/layouts/region/locations_fullwidth.php create mode 100644 admin/layouts/region/settings_left.php create mode 100644 admin/layouts/region/settings_right.php create mode 100644 admin/layouts/support_group/details_above.php create mode 100644 admin/layouts/support_group/details_right.php create mode 100644 admin/layouts/support_group/details_under.php create mode 100644 admin/layouts/support_group/payments_fullwidth.php create mode 100644 admin/models/clinic.php create mode 100644 admin/models/clinics.php create mode 100644 admin/models/fields/articles.php create mode 100644 admin/models/fields/clinics.php create mode 100644 admin/models/fields/locations.php create mode 100644 admin/models/fields/supportgroups.php create mode 100644 admin/models/forms/clinic.js create mode 100644 admin/models/forms/clinic.xml create mode 100644 admin/models/forms/help_document.js create mode 100644 admin/models/forms/help_document.xml create mode 100644 admin/models/forms/payment.js create mode 100644 admin/models/forms/payment.xml create mode 100644 admin/models/help_document.php create mode 100644 admin/models/help_documents.php create mode 100644 admin/models/payment.php create mode 100644 admin/models/payments.php create mode 100644 admin/tables/clinic.php create mode 100644 admin/tables/help_document.php create mode 100644 admin/tables/payment.php create mode 100644 admin/views/clinic/submitbutton.js create mode 100644 admin/views/clinic/tmpl/edit.php create mode 100644 admin/views/clinic/tmpl/index.html create mode 100644 admin/views/clinic/view.html.php create mode 100644 admin/views/clinics/index.html create mode 100644 admin/views/clinics/tmpl/default.php create mode 100644 admin/views/clinics/tmpl/default_batch_body.php create mode 100644 admin/views/clinics/tmpl/default_batch_footer.php create mode 100644 admin/views/clinics/tmpl/default_body.php create mode 100644 admin/views/clinics/tmpl/default_foot.php create mode 100644 admin/views/clinics/tmpl/default_head.php create mode 100644 admin/views/clinics/tmpl/default_toolbar.php create mode 100644 admin/views/clinics/tmpl/index.html create mode 100644 admin/views/clinics/view.html.php create mode 100644 admin/views/help_document/submitbutton.js create mode 100644 admin/views/help_document/tmpl/edit.php create mode 100644 admin/views/help_document/tmpl/index.html create mode 100644 admin/views/help_document/view.html.php create mode 100644 admin/views/help_documents/index.html create mode 100644 admin/views/help_documents/tmpl/default.php create mode 100644 admin/views/help_documents/tmpl/default_batch_body.php create mode 100644 admin/views/help_documents/tmpl/default_batch_footer.php create mode 100644 admin/views/help_documents/tmpl/default_body.php create mode 100644 admin/views/help_documents/tmpl/default_foot.php create mode 100644 admin/views/help_documents/tmpl/default_head.php create mode 100644 admin/views/help_documents/tmpl/default_toolbar.php create mode 100644 admin/views/help_documents/tmpl/index.html create mode 100644 admin/views/help_documents/view.html.php create mode 100644 admin/views/payment/submitbutton.js create mode 100644 admin/views/payment/tmpl/edit.php create mode 100644 admin/views/payment/tmpl/index.html create mode 100644 admin/views/payment/view.html.php create mode 100644 admin/views/payments/index.html create mode 100644 admin/views/payments/tmpl/default.php create mode 100644 admin/views/payments/tmpl/default_batch_body.php create mode 100644 admin/views/payments/tmpl/default_batch_footer.php create mode 100644 admin/views/payments/tmpl/default_body.php create mode 100644 admin/views/payments/tmpl/default_foot.php create mode 100644 admin/views/payments/tmpl/default_head.php create mode 100644 admin/views/payments/tmpl/default_toolbar.php create mode 100644 admin/views/payments/tmpl/index.html create mode 100644 admin/views/payments/view.html.php create mode 100644 site/controllers/help.php diff --git a/README.md b/README.md index 21190ae..f4ea299 100644 --- a/README.md +++ b/README.md @@ -15,31 +15,31 @@ Support Groups ## Build Time -**76 Hours** or **10 Eight Hour Days** (actual time the author saved - +**120 Hours** or **15 Eight Hour Days** (actual time the author saved - due to [Automated Component Builder] (https://www.vdm.io/joomla-component-builder)) > (if creating a folder and file took **5 seconds** and writing one line of code took **10 seconds**, > never making one mistake or taking any coffee break.) -+ *Line count*: **27334** -+ *File count*: **229** -+ *Folder count*: **64** ++ *Line count*: **42865** ++ *File count*: **331** ++ *Folder count*: **76** -**51 Hours** or **6 Eight Hour Days** (the actual time the author spent) +**79 Hours** or **10 Eight Hour Days** (the actual time the author spent) > (with the following break down: -> **debugging @19hours** = codingtime / 4; -> **planning @11hours** = codingtime / 7; -> **mapping @8hours** = codingtime / 10; -> **office @13hours** = codingtime / 6;) +> **debugging @30hours** = codingtime / 4; +> **planning @17hours** = codingtime / 7; +> **mapping @12hours** = codingtime / 10; +> **office @20hours** = codingtime / 6;) -**127 Hours** or **16 Eight Hour Days** +**199 Hours** or **25 Eight Hour Days** (a total of the realistic time frame for this project) > (if creating a folder and file took **5 seconds** and writing one line of code took **10 seconds**, > with the normal everyday realities at the office, that includes the component planning, mapping & debugging.) -Project duration: **3.2 weeks** or **0.7 months** +Project duration: **5 weeks** or **1 months** > This **component** was build with a Joomla [Automated Component Builder] (https://www.vdm.io/joomla-component-builder). > Developed by [Llewellyn van der Merwe] (mailto:joomla@vdm.io) \ No newline at end of file diff --git a/admin/access.xml b/admin/access.xml index b2901f6..20b9863 100644 --- a/admin/access.xml +++ b/admin/access.xml @@ -15,6 +15,23 @@ + + + + + + + + + + + + + + + + + @@ -39,47 +56,176 @@ + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + +
+
+ + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+
+ + + + + + + +
@@ -89,13 +235,13 @@
-
- - - - - - - +
+ + + + + + +
\ No newline at end of file diff --git a/admin/assets/css/clinic.css b/admin/assets/css/clinic.css new file mode 100644 index 0000000..096cab9 --- /dev/null +++ b/admin/assets/css/clinic.css @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage clinic.css + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +/* CSS Document */ + + diff --git a/admin/assets/css/clinics.css b/admin/assets/css/clinics.css new file mode 100644 index 0000000..dfe5ce6 --- /dev/null +++ b/admin/assets/css/clinics.css @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage clinics.css + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +/* CSS Document */ + + diff --git a/admin/assets/css/help_document.css b/admin/assets/css/help_document.css new file mode 100644 index 0000000..ef8e578 --- /dev/null +++ b/admin/assets/css/help_document.css @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage help_document.css + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +/* CSS Document */ + + diff --git a/admin/assets/css/help_documents.css b/admin/assets/css/help_documents.css new file mode 100644 index 0000000..cd80498 --- /dev/null +++ b/admin/assets/css/help_documents.css @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage help_documents.css + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +/* CSS Document */ + + diff --git a/admin/assets/css/payment.css b/admin/assets/css/payment.css new file mode 100644 index 0000000..e8ae986 --- /dev/null +++ b/admin/assets/css/payment.css @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage payment.css + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +/* CSS Document */ + + diff --git a/admin/assets/css/payments.css b/admin/assets/css/payments.css new file mode 100644 index 0000000..174964c --- /dev/null +++ b/admin/assets/css/payments.css @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage payments.css + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +/* CSS Document */ + + diff --git a/admin/assets/images/component-300.jpg b/admin/assets/images/component-300.jpg index eef9785abf3727ec3b8825c219638a721a332c0e..6bb95afa557773316dd4e0ea3f3fa193e1c6f2d5 100644 GIT binary patch delta 43589 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 diff --git a/admin/assets/images/icons/clinics.png b/admin/assets/images/icons/clinics.png new file mode 100644 index 0000000000000000000000000000000000000000..b6fa0827cc132ab628fbd81667ee0b5007f921ab GIT binary patch literal 16919 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�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 IM6N<$g2`0eh5!Hn literal 0 HcmV?d00001 diff --git a/admin/assets/images/icons/location_add.png b/admin/assets/images/icons/location_add.png deleted file mode 100644 index 8fe539f6da91cead0251f60819f35813b24682c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19789 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 T(3)g;00000NkvXXu0mjf@3ARJ diff --git a/admin/assets/images/icons/payment_add.png b/admin/assets/images/icons/payment_add.png new file mode 100644 index 0000000000000000000000000000000000000000..51b891ce086ce8a811c19a791e5d5c1393f9e4d3 GIT binary patch literal 13445 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 literal 0 HcmV?d00001 diff --git a/admin/assets/images/icons/region_add.png b/admin/assets/images/icons/region_add.png deleted file mode 100644 index 7e99d4ee67900bcd5e5170eb9130f49f1bcd025c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16144 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 EABr-8Gynhq diff --git a/admin/controller.php b/admin/controller.php index 16500f4..b599c25 100644 --- a/admin/controller.php +++ b/admin/controller.php @@ -89,10 +89,13 @@ class SupportgroupsController extends JControllerLegacy { $views = array( 'support_group' => 'support_groups', + 'payment' => 'payments', + 'clinic' => 'clinics', 'location' => 'locations', 'region' => 'regions', + 'country' => 'countries', 'currency' => 'currencies', - 'country' => 'countries' + 'help_document' => 'help_documents' ); // check if this is a list view if (in_array($view,$views)) diff --git a/admin/controllers/clinic.php b/admin/controllers/clinic.php new file mode 100644 index 0000000..dd3a3bd --- /dev/null +++ b/admin/controllers/clinic.php @@ -0,0 +1,326 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla controllerform library +jimport('joomla.application.component.controllerform'); + +/** + * Clinic Controller + */ +class SupportgroupsControllerClinic extends JControllerForm +{ + /** + * Current or most recently performed task. + * + * @var string + * @since 12.2 + * @note Replaces _task. + */ + protected $task; + + public function __construct($config = array()) + { + $this->view_list = 'Clinics'; // safeguard for setting the return view listing to the main view. + parent::__construct($config); + } + + /** + * Method override to check if you can add a new record. + * + * @param array $data An array of input data. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowAdd($data = array()) + { + // Access check. + $access = JFactory::getUser()->authorise('clinic.access', 'com_supportgroups'); + if (!$access) + { + return false; + } + // In the absense of better information, revert to the component permissions. + return JFactory::getUser()->authorise('clinic.create', $this->option); + } + + /** + * Method override to check if you can edit an existing record. + * + * @param array $data An array of input data. + * @param string $key The name of the key for the primary key. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowEdit($data = array(), $key = 'id') + { + // get user object. + $user = JFactory::getUser(); + // get record id. + $recordId = (int) isset($data[$key]) ? $data[$key] : 0; + + + // Access check. + $access = ($user->authorise('clinic.access', 'com_supportgroups.clinic.' . (int) $recordId) && $user->authorise('clinic.access', 'com_supportgroups')); + if (!$access) + { + return false; + } + + if ($recordId) + { + // The record has been set. Check the record permissions. + $permission = $user->authorise('clinic.edit', 'com_supportgroups.clinic.' . (int) $recordId); + if (!$permission && !is_null($permission)) + { + if ($user->authorise('clinic.edit.own', 'com_supportgroups.clinic.' . $recordId)) + { + // Now test the owner is the user. + $ownerId = (int) isset($data['created_by']) ? $data['created_by'] : 0; + if (empty($ownerId)) + { + // Need to do a lookup from the model. + $record = $this->getModel()->getItem($recordId); + + if (empty($record)) + { + return false; + } + $ownerId = $record->created_by; + } + + // If the owner matches 'me' then allow. + if ($ownerId == $user->id) + { + if ($user->authorise('clinic.edit.own', 'com_supportgroups')) + { + return true; + } + } + } + return false; + } + } + // Since there is no permission, revert to the component permissions. + return $user->authorise('clinic.edit', $this->option); + } + + /** + * Gets the URL arguments to append to an item redirect. + * + * @param integer $recordId The primary key id for the item. + * @param string $urlVar The name of the URL variable for the id. + * + * @return string The arguments to append to the redirect URL. + * + * @since 12.2 + */ + protected function getRedirectToItemAppend($recordId = null, $urlVar = 'id') + { + $tmpl = $this->input->get('tmpl'); + $layout = $this->input->get('layout', 'edit', 'string'); + + $ref = $this->input->get('ref', 0, 'string'); + $refid = $this->input->get('refid', 0, 'int'); + + // Setup redirect info. + + $append = ''; + + if ($refid) + { + $append .= '&ref='.(string)$ref.'&refid='.(int)$refid; + } + elseif ($ref) + { + $append .= '&ref='.(string)$ref; + } + + if ($tmpl) + { + $append .= '&tmpl=' . $tmpl; + } + + if ($layout) + { + $append .= '&layout=' . $layout; + } + + if ($recordId) + { + $append .= '&' . $urlVar . '=' . $recordId; + } + + return $append; + } + + /** + * Method to run batch operations. + * + * @param object $model The model. + * + * @return boolean True if successful, false otherwise and internal error is set. + * + * @since 2.5 + */ + public function batch($model = null) + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Set the model + $model = $this->getModel('Clinic', '', array()); + + // Preset the redirect + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=clinics' . $this->getRedirectToListAppend(), false)); + + return parent::batch($model); + } + + /** + * Method to cancel an edit. + * + * @param string $key The name of the primary key of the URL variable. + * + * @return boolean True if access level checks pass, false otherwise. + * + * @since 12.2 + */ + public function cancel($key = null) + { + // get the referal details + $this->ref = $this->input->get('ref', 0, 'word'); + $this->refid = $this->input->get('refid', 0, 'int'); + + $cancel = parent::cancel($key); + + if ($cancel) + { + if ($this->refid) + { + $redirect = '&view='.(string)$this->ref.'&layout=edit&id='.(int)$this->refid; + + // Redirect to the item screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + elseif ($this->ref) + { + $redirect = '&view='.(string)$this->ref; + + // Redirect to the list screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + } + else + { + // Redirect to the items screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . '&view=' . $this->view_list, false + ) + ); + } + return $cancel; + } + + /** + * Method to save a record. + * + * @param string $key The name of the primary key of the URL variable. + * @param string $urlVar The name of the URL variable if different from the primary key (sometimes required to avoid router collisions). + * + * @return boolean True if successful, false otherwise. + * + * @since 12.2 + */ + public function save($key = null, $urlVar = null) + { + // get the referal details + $this->ref = $this->input->get('ref', 0, 'word'); + $this->refid = $this->input->get('refid', 0, 'int'); + + if ($this->ref || $this->refid) + { + // to make sure the item is checkedin on redirect + $this->task = 'save'; + } + + $saved = parent::save($key, $urlVar); + + if ($this->refid && $saved) + { + $redirect = '&view='.(string)$this->ref.'&layout=edit&id='.(int)$this->refid; + + // Redirect to the item screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + elseif ($this->ref && $saved) + { + $redirect = '&view='.(string)$this->ref; + + // Redirect to the list screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + return $saved; + } + + /** + * Function that allows child controller access to model data + * after the data has been saved. + * + * @param JModel &$model The data model object. + * @param array $validData The validated data. + * + * @return void + * + * @since 11.1 + */ + protected function postSaveHook(JModelLegacy $model, $validData = array()) + { + return; + } + +} diff --git a/admin/controllers/clinics.php b/admin/controllers/clinics.php new file mode 100644 index 0000000..aec2819 --- /dev/null +++ b/admin/controllers/clinics.php @@ -0,0 +1,111 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla controlleradmin library +jimport('joomla.application.component.controlleradmin'); + +/** + * Clinics Controller + */ +class SupportgroupsControllerClinics extends JControllerAdmin +{ + protected $text_prefix = 'COM_SUPPORTGROUPS_CLINICS'; + /** + * Proxy for getModel. + * @since 2.5 + */ + public function getModel($name = 'Clinic', $prefix = 'SupportgroupsModel', $config = array()) + { + $model = parent::getModel($name, $prefix, array('ignore_request' => true)); + + return $model; + } + + public function exportData() + { + // Check for request forgeries + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + // check if export is allowed for this user. + $user = JFactory::getUser(); + if ($user->authorise('clinic.export', 'com_supportgroups') && $user->authorise('core.export', 'com_supportgroups')) + { + // Get the input + $input = JFactory::getApplication()->input; + $pks = $input->post->get('cid', array(), 'array'); + // Sanitize the input + JArrayHelper::toInteger($pks); + // Get the model + $model = $this->getModel('Clinics'); + // get the data to export + $data = $model->getExportData($pks); + if (SupportgroupsHelper::checkArray($data)) + { + // now set the data to the spreadsheet + $date = JFactory::getDate(); + SupportgroupsHelper::xls($data,'Clinics_'.$date->format('jS_F_Y'),'Clinics exported ('.$date->format('jS F, Y').')','clinics'); + } + } + // Redirect to the list screen with error. + $message = JText::_('COM_SUPPORTGROUPS_EXPORT_FAILED'); + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=clinics', false), $message, 'error'); + return; + } + + + public function importData() + { + // Check for request forgeries + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + // check if import is allowed for this user. + $user = JFactory::getUser(); + if ($user->authorise('clinic.import', 'com_supportgroups') && $user->authorise('core.import', 'com_supportgroups')) + { + // Get the import model + $model = $this->getModel('Clinics'); + // get the headers to import + $headers = $model->getExImPortHeaders(); + if (SupportgroupsHelper::checkObject($headers)) + { + // Load headers to session. + $session = JFactory::getSession(); + $headers = json_encode($headers); + $session->set('clinic_VDM_IMPORTHEADERS', $headers); + $session->set('backto_VDM_IMPORT', 'clinics'); + $session->set('dataType_VDM_IMPORTINTO', 'clinic'); + // Redirect to import view. + $message = JText::_('COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_CLINICS'); + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=import', false), $message); + return; + } + } + // Redirect to the list screen with error. + $message = JText::_('COM_SUPPORTGROUPS_IMPORT_FAILED'); + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=clinics', false), $message, 'error'); + return; + } +} diff --git a/admin/controllers/help.php b/admin/controllers/help.php new file mode 100644 index 0000000..ee529a1 --- /dev/null +++ b/admin/controllers/help.php @@ -0,0 +1,129 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla controllerform library +jimport('joomla.application.component.controller'); + +/** + * Supportgroups Help Controller + */ +class SupportgroupsControllerHelp extends JControllerLegacy +{ + public function __construct($config) + { + parent::__construct($config); + // load the tasks + $this->registerTask('getText', 'help'); + } + + public function help() + { + $user = JFactory::getUser(); + $jinput = JFactory::getApplication()->input; + // Check Token! + $token = JSession::getFormToken(); + $call_token = $jinput->get('token', 0, 'ALNUM'); + if($user->id != 0 && $token == $call_token){ + $task = $this->getTask(); + switch($task){ + case 'getText': + try + { + $idValue = $jinput->get('id', 0, 'INT'); + if($idValue) + { + $result = $this->getHelpDocumentText($idValue); + } + else + { + $result = ''; + } + echo $result; + // stop execution gracefully + jexit(); + } + catch(Exception $e) + { + // stop execution gracefully + jexit(); + } + break; + } + } + else + { + // stop execution gracefully + jexit(); + } + } + + protected function getHelpDocumentText($id) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select(array('a.title','a.content')); + $query->from('#__supportgroups_help_document AS a'); + $query->where('a.id = '.(int) $id); + $query->where('a.published = 1'); + $db->setQuery($query); + $db->execute(); + if($db->getNumRows()) + { + $text = array(); + $document = $db->loadObject(); + // fix image issue + $images['src="images'] = 'src="'.JURI::root().'images'; + $images["src='images"] = "src='".JURI::root()."images"; + $images['src="/images'] = 'src="'.JURI::root().'images'; + $images["src='/images"] = "src='".JURI::root()."images"; + // set document template + $text[] = ""; + $text[] = ''; + $text[] = ""; + $text[] = ''; + $text[] = "".$document->title.""; + $text[] = ''; + $text[] = ''; + $text[] = ""; + $text[] = '
'; + $text[] = '
'; + $text[] = '
'; + // build the help text + $text[] = '

'.$document->title."

"; + $text[] = str_replace(array_keys($images),array_values($images),$document->content); + // end template + $text[] = '


'; + $text[] = '
'; + $text[] = ""; + $text[] = ""; + + return implode("\n",$text); + } + return false; + } +} diff --git a/admin/controllers/help_document.php b/admin/controllers/help_document.php new file mode 100644 index 0000000..b7285ac --- /dev/null +++ b/admin/controllers/help_document.php @@ -0,0 +1,326 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla controllerform library +jimport('joomla.application.component.controllerform'); + +/** + * Help_document Controller + */ +class SupportgroupsControllerHelp_document extends JControllerForm +{ + /** + * Current or most recently performed task. + * + * @var string + * @since 12.2 + * @note Replaces _task. + */ + protected $task; + + public function __construct($config = array()) + { + $this->view_list = 'Help_documents'; // safeguard for setting the return view listing to the main view. + parent::__construct($config); + } + + /** + * Method override to check if you can add a new record. + * + * @param array $data An array of input data. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowAdd($data = array()) + { + // Access check. + $access = JFactory::getUser()->authorise('help_document.access', 'com_supportgroups'); + if (!$access) + { + return false; + } + // In the absense of better information, revert to the component permissions. + return JFactory::getUser()->authorise('help_document.create', $this->option); + } + + /** + * Method override to check if you can edit an existing record. + * + * @param array $data An array of input data. + * @param string $key The name of the key for the primary key. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowEdit($data = array(), $key = 'id') + { + // get user object. + $user = JFactory::getUser(); + // get record id. + $recordId = (int) isset($data[$key]) ? $data[$key] : 0; + + + // Access check. + $access = ($user->authorise('help_document.access', 'com_supportgroups.help_document.' . (int) $recordId) && $user->authorise('help_document.access', 'com_supportgroups')); + if (!$access) + { + return false; + } + + if ($recordId) + { + // The record has been set. Check the record permissions. + $permission = $user->authorise('help_document.edit', 'com_supportgroups.help_document.' . (int) $recordId); + if (!$permission && !is_null($permission)) + { + if ($user->authorise('help_document.edit.own', 'com_supportgroups.help_document.' . $recordId)) + { + // Now test the owner is the user. + $ownerId = (int) isset($data['created_by']) ? $data['created_by'] : 0; + if (empty($ownerId)) + { + // Need to do a lookup from the model. + $record = $this->getModel()->getItem($recordId); + + if (empty($record)) + { + return false; + } + $ownerId = $record->created_by; + } + + // If the owner matches 'me' then allow. + if ($ownerId == $user->id) + { + if ($user->authorise('help_document.edit.own', 'com_supportgroups')) + { + return true; + } + } + } + return false; + } + } + // Since there is no permission, revert to the component permissions. + return $user->authorise('help_document.edit', $this->option); + } + + /** + * Gets the URL arguments to append to an item redirect. + * + * @param integer $recordId The primary key id for the item. + * @param string $urlVar The name of the URL variable for the id. + * + * @return string The arguments to append to the redirect URL. + * + * @since 12.2 + */ + protected function getRedirectToItemAppend($recordId = null, $urlVar = 'id') + { + $tmpl = $this->input->get('tmpl'); + $layout = $this->input->get('layout', 'edit', 'string'); + + $ref = $this->input->get('ref', 0, 'string'); + $refid = $this->input->get('refid', 0, 'int'); + + // Setup redirect info. + + $append = ''; + + if ($refid) + { + $append .= '&ref='.(string)$ref.'&refid='.(int)$refid; + } + elseif ($ref) + { + $append .= '&ref='.(string)$ref; + } + + if ($tmpl) + { + $append .= '&tmpl=' . $tmpl; + } + + if ($layout) + { + $append .= '&layout=' . $layout; + } + + if ($recordId) + { + $append .= '&' . $urlVar . '=' . $recordId; + } + + return $append; + } + + /** + * Method to run batch operations. + * + * @param object $model The model. + * + * @return boolean True if successful, false otherwise and internal error is set. + * + * @since 2.5 + */ + public function batch($model = null) + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Set the model + $model = $this->getModel('Help_document', '', array()); + + // Preset the redirect + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=help_documents' . $this->getRedirectToListAppend(), false)); + + return parent::batch($model); + } + + /** + * Method to cancel an edit. + * + * @param string $key The name of the primary key of the URL variable. + * + * @return boolean True if access level checks pass, false otherwise. + * + * @since 12.2 + */ + public function cancel($key = null) + { + // get the referal details + $this->ref = $this->input->get('ref', 0, 'word'); + $this->refid = $this->input->get('refid', 0, 'int'); + + $cancel = parent::cancel($key); + + if ($cancel) + { + if ($this->refid) + { + $redirect = '&view='.(string)$this->ref.'&layout=edit&id='.(int)$this->refid; + + // Redirect to the item screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + elseif ($this->ref) + { + $redirect = '&view='.(string)$this->ref; + + // Redirect to the list screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + } + else + { + // Redirect to the items screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . '&view=' . $this->view_list, false + ) + ); + } + return $cancel; + } + + /** + * Method to save a record. + * + * @param string $key The name of the primary key of the URL variable. + * @param string $urlVar The name of the URL variable if different from the primary key (sometimes required to avoid router collisions). + * + * @return boolean True if successful, false otherwise. + * + * @since 12.2 + */ + public function save($key = null, $urlVar = null) + { + // get the referal details + $this->ref = $this->input->get('ref', 0, 'word'); + $this->refid = $this->input->get('refid', 0, 'int'); + + if ($this->ref || $this->refid) + { + // to make sure the item is checkedin on redirect + $this->task = 'save'; + } + + $saved = parent::save($key, $urlVar); + + if ($this->refid && $saved) + { + $redirect = '&view='.(string)$this->ref.'&layout=edit&id='.(int)$this->refid; + + // Redirect to the item screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + elseif ($this->ref && $saved) + { + $redirect = '&view='.(string)$this->ref; + + // Redirect to the list screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + return $saved; + } + + /** + * Function that allows child controller access to model data + * after the data has been saved. + * + * @param JModel &$model The data model object. + * @param array $validData The validated data. + * + * @return void + * + * @since 11.1 + */ + protected function postSaveHook(JModelLegacy $model, $validData = array()) + { + return; + } + +} diff --git a/admin/controllers/help_documents.php b/admin/controllers/help_documents.php new file mode 100644 index 0000000..2a587c2 --- /dev/null +++ b/admin/controllers/help_documents.php @@ -0,0 +1,111 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla controlleradmin library +jimport('joomla.application.component.controlleradmin'); + +/** + * Help_documents Controller + */ +class SupportgroupsControllerHelp_documents extends JControllerAdmin +{ + protected $text_prefix = 'COM_SUPPORTGROUPS_HELP_DOCUMENTS'; + /** + * Proxy for getModel. + * @since 2.5 + */ + public function getModel($name = 'Help_document', $prefix = 'SupportgroupsModel', $config = array()) + { + $model = parent::getModel($name, $prefix, array('ignore_request' => true)); + + return $model; + } + + public function exportData() + { + // Check for request forgeries + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + // check if export is allowed for this user. + $user = JFactory::getUser(); + if ($user->authorise('help_document.export', 'com_supportgroups') && $user->authorise('core.export', 'com_supportgroups')) + { + // Get the input + $input = JFactory::getApplication()->input; + $pks = $input->post->get('cid', array(), 'array'); + // Sanitize the input + JArrayHelper::toInteger($pks); + // Get the model + $model = $this->getModel('Help_documents'); + // get the data to export + $data = $model->getExportData($pks); + if (SupportgroupsHelper::checkArray($data)) + { + // now set the data to the spreadsheet + $date = JFactory::getDate(); + SupportgroupsHelper::xls($data,'Help_documents_'.$date->format('jS_F_Y'),'Help documents exported ('.$date->format('jS F, Y').')','help documents'); + } + } + // Redirect to the list screen with error. + $message = JText::_('COM_SUPPORTGROUPS_EXPORT_FAILED'); + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=help_documents', false), $message, 'error'); + return; + } + + + public function importData() + { + // Check for request forgeries + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + // check if import is allowed for this user. + $user = JFactory::getUser(); + if ($user->authorise('help_document.import', 'com_supportgroups') && $user->authorise('core.import', 'com_supportgroups')) + { + // Get the import model + $model = $this->getModel('Help_documents'); + // get the headers to import + $headers = $model->getExImPortHeaders(); + if (SupportgroupsHelper::checkObject($headers)) + { + // Load headers to session. + $session = JFactory::getSession(); + $headers = json_encode($headers); + $session->set('help_document_VDM_IMPORTHEADERS', $headers); + $session->set('backto_VDM_IMPORT', 'help_documents'); + $session->set('dataType_VDM_IMPORTINTO', 'help_document'); + // Redirect to import view. + $message = JText::_('COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_HELP_DOCUMENTS'); + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=import', false), $message); + return; + } + } + // Redirect to the list screen with error. + $message = JText::_('COM_SUPPORTGROUPS_IMPORT_FAILED'); + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=help_documents', false), $message, 'error'); + return; + } +} diff --git a/admin/controllers/location.php b/admin/controllers/location.php index f634921..ece8de7 100644 --- a/admin/controllers/location.php +++ b/admin/controllers/location.php @@ -59,8 +59,15 @@ class SupportgroupsControllerLocation extends JControllerForm * @since 1.6 */ protected function allowAdd($data = array()) - { // In the absense of better information, revert to the component permissions. - return parent::allowAdd($data); + { + // Access check. + $access = JFactory::getUser()->authorise('location.access', 'com_supportgroups'); + if (!$access) + { + return false; + } + // In the absense of better information, revert to the component permissions. + return JFactory::getUser()->authorise('location.create', $this->option); } /** @@ -81,13 +88,20 @@ class SupportgroupsControllerLocation extends JControllerForm $recordId = (int) isset($data[$key]) ? $data[$key] : 0; + // Access check. + $access = ($user->authorise('location.access', 'com_supportgroups.location.' . (int) $recordId) && $user->authorise('location.access', 'com_supportgroups')); + if (!$access) + { + return false; + } + if ($recordId) { // The record has been set. Check the record permissions. - $permission = $user->authorise('core.edit', 'com_supportgroups.location.' . (int) $recordId); + $permission = $user->authorise('location.edit', 'com_supportgroups.location.' . (int) $recordId); if (!$permission && !is_null($permission)) { - if ($user->authorise('core.edit.own', 'com_supportgroups.location.' . $recordId)) + if ($user->authorise('location.edit.own', 'com_supportgroups.location.' . $recordId)) { // Now test the owner is the user. $ownerId = (int) isset($data['created_by']) ? $data['created_by'] : 0; @@ -106,7 +120,7 @@ class SupportgroupsControllerLocation extends JControllerForm // If the owner matches 'me' then allow. if ($ownerId == $user->id) { - if ($user->authorise('core.edit.own', 'com_supportgroups')) + if ($user->authorise('location.edit.own', 'com_supportgroups')) { return true; } @@ -116,7 +130,7 @@ class SupportgroupsControllerLocation extends JControllerForm } } // Since there is no permission, revert to the component permissions. - return parent::allowEdit($data, $key); + return $user->authorise('location.edit', $this->option); } /** diff --git a/admin/controllers/payment.php b/admin/controllers/payment.php new file mode 100644 index 0000000..835c31a --- /dev/null +++ b/admin/controllers/payment.php @@ -0,0 +1,326 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla controllerform library +jimport('joomla.application.component.controllerform'); + +/** + * Payment Controller + */ +class SupportgroupsControllerPayment extends JControllerForm +{ + /** + * Current or most recently performed task. + * + * @var string + * @since 12.2 + * @note Replaces _task. + */ + protected $task; + + public function __construct($config = array()) + { + $this->view_list = 'Payments'; // safeguard for setting the return view listing to the main view. + parent::__construct($config); + } + + /** + * Method override to check if you can add a new record. + * + * @param array $data An array of input data. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowAdd($data = array()) + { + // Access check. + $access = JFactory::getUser()->authorise('payment.access', 'com_supportgroups'); + if (!$access) + { + return false; + } + // In the absense of better information, revert to the component permissions. + return JFactory::getUser()->authorise('payment.create', $this->option); + } + + /** + * Method override to check if you can edit an existing record. + * + * @param array $data An array of input data. + * @param string $key The name of the key for the primary key. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowEdit($data = array(), $key = 'id') + { + // get user object. + $user = JFactory::getUser(); + // get record id. + $recordId = (int) isset($data[$key]) ? $data[$key] : 0; + + + // Access check. + $access = ($user->authorise('payment.access', 'com_supportgroups.payment.' . (int) $recordId) && $user->authorise('payment.access', 'com_supportgroups')); + if (!$access) + { + return false; + } + + if ($recordId) + { + // The record has been set. Check the record permissions. + $permission = $user->authorise('payment.edit', 'com_supportgroups.payment.' . (int) $recordId); + if (!$permission && !is_null($permission)) + { + if ($user->authorise('payment.edit.own', 'com_supportgroups.payment.' . $recordId)) + { + // Now test the owner is the user. + $ownerId = (int) isset($data['created_by']) ? $data['created_by'] : 0; + if (empty($ownerId)) + { + // Need to do a lookup from the model. + $record = $this->getModel()->getItem($recordId); + + if (empty($record)) + { + return false; + } + $ownerId = $record->created_by; + } + + // If the owner matches 'me' then allow. + if ($ownerId == $user->id) + { + if ($user->authorise('payment.edit.own', 'com_supportgroups')) + { + return true; + } + } + } + return false; + } + } + // Since there is no permission, revert to the component permissions. + return $user->authorise('payment.edit', $this->option); + } + + /** + * Gets the URL arguments to append to an item redirect. + * + * @param integer $recordId The primary key id for the item. + * @param string $urlVar The name of the URL variable for the id. + * + * @return string The arguments to append to the redirect URL. + * + * @since 12.2 + */ + protected function getRedirectToItemAppend($recordId = null, $urlVar = 'id') + { + $tmpl = $this->input->get('tmpl'); + $layout = $this->input->get('layout', 'edit', 'string'); + + $ref = $this->input->get('ref', 0, 'string'); + $refid = $this->input->get('refid', 0, 'int'); + + // Setup redirect info. + + $append = ''; + + if ($refid) + { + $append .= '&ref='.(string)$ref.'&refid='.(int)$refid; + } + elseif ($ref) + { + $append .= '&ref='.(string)$ref; + } + + if ($tmpl) + { + $append .= '&tmpl=' . $tmpl; + } + + if ($layout) + { + $append .= '&layout=' . $layout; + } + + if ($recordId) + { + $append .= '&' . $urlVar . '=' . $recordId; + } + + return $append; + } + + /** + * Method to run batch operations. + * + * @param object $model The model. + * + * @return boolean True if successful, false otherwise and internal error is set. + * + * @since 2.5 + */ + public function batch($model = null) + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Set the model + $model = $this->getModel('Payment', '', array()); + + // Preset the redirect + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=payments' . $this->getRedirectToListAppend(), false)); + + return parent::batch($model); + } + + /** + * Method to cancel an edit. + * + * @param string $key The name of the primary key of the URL variable. + * + * @return boolean True if access level checks pass, false otherwise. + * + * @since 12.2 + */ + public function cancel($key = null) + { + // get the referal details + $this->ref = $this->input->get('ref', 0, 'word'); + $this->refid = $this->input->get('refid', 0, 'int'); + + $cancel = parent::cancel($key); + + if ($cancel) + { + if ($this->refid) + { + $redirect = '&view='.(string)$this->ref.'&layout=edit&id='.(int)$this->refid; + + // Redirect to the item screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + elseif ($this->ref) + { + $redirect = '&view='.(string)$this->ref; + + // Redirect to the list screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + } + else + { + // Redirect to the items screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . '&view=' . $this->view_list, false + ) + ); + } + return $cancel; + } + + /** + * Method to save a record. + * + * @param string $key The name of the primary key of the URL variable. + * @param string $urlVar The name of the URL variable if different from the primary key (sometimes required to avoid router collisions). + * + * @return boolean True if successful, false otherwise. + * + * @since 12.2 + */ + public function save($key = null, $urlVar = null) + { + // get the referal details + $this->ref = $this->input->get('ref', 0, 'word'); + $this->refid = $this->input->get('refid', 0, 'int'); + + if ($this->ref || $this->refid) + { + // to make sure the item is checkedin on redirect + $this->task = 'save'; + } + + $saved = parent::save($key, $urlVar); + + if ($this->refid && $saved) + { + $redirect = '&view='.(string)$this->ref.'&layout=edit&id='.(int)$this->refid; + + // Redirect to the item screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + elseif ($this->ref && $saved) + { + $redirect = '&view='.(string)$this->ref; + + // Redirect to the list screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . $redirect, false + ) + ); + } + return $saved; + } + + /** + * Function that allows child controller access to model data + * after the data has been saved. + * + * @param JModel &$model The data model object. + * @param array $validData The validated data. + * + * @return void + * + * @since 11.1 + */ + protected function postSaveHook(JModelLegacy $model, $validData = array()) + { + return; + } + +} diff --git a/admin/controllers/payments.php b/admin/controllers/payments.php new file mode 100644 index 0000000..4534087 --- /dev/null +++ b/admin/controllers/payments.php @@ -0,0 +1,111 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla controlleradmin library +jimport('joomla.application.component.controlleradmin'); + +/** + * Payments Controller + */ +class SupportgroupsControllerPayments extends JControllerAdmin +{ + protected $text_prefix = 'COM_SUPPORTGROUPS_PAYMENTS'; + /** + * Proxy for getModel. + * @since 2.5 + */ + public function getModel($name = 'Payment', $prefix = 'SupportgroupsModel', $config = array()) + { + $model = parent::getModel($name, $prefix, array('ignore_request' => true)); + + return $model; + } + + public function exportData() + { + // Check for request forgeries + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + // check if export is allowed for this user. + $user = JFactory::getUser(); + if ($user->authorise('payment.export', 'com_supportgroups') && $user->authorise('core.export', 'com_supportgroups')) + { + // Get the input + $input = JFactory::getApplication()->input; + $pks = $input->post->get('cid', array(), 'array'); + // Sanitize the input + JArrayHelper::toInteger($pks); + // Get the model + $model = $this->getModel('Payments'); + // get the data to export + $data = $model->getExportData($pks); + if (SupportgroupsHelper::checkArray($data)) + { + // now set the data to the spreadsheet + $date = JFactory::getDate(); + SupportgroupsHelper::xls($data,'Payments_'.$date->format('jS_F_Y'),'Payments exported ('.$date->format('jS F, Y').')','payments'); + } + } + // Redirect to the list screen with error. + $message = JText::_('COM_SUPPORTGROUPS_EXPORT_FAILED'); + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=payments', false), $message, 'error'); + return; + } + + + public function importData() + { + // Check for request forgeries + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + // check if import is allowed for this user. + $user = JFactory::getUser(); + if ($user->authorise('payment.import', 'com_supportgroups') && $user->authorise('core.import', 'com_supportgroups')) + { + // Get the import model + $model = $this->getModel('Payments'); + // get the headers to import + $headers = $model->getExImPortHeaders(); + if (SupportgroupsHelper::checkObject($headers)) + { + // Load headers to session. + $session = JFactory::getSession(); + $headers = json_encode($headers); + $session->set('payment_VDM_IMPORTHEADERS', $headers); + $session->set('backto_VDM_IMPORT', 'payments'); + $session->set('dataType_VDM_IMPORTINTO', 'payment'); + // Redirect to import view. + $message = JText::_('COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_PAYMENTS'); + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=import', false), $message); + return; + } + } + // Redirect to the list screen with error. + $message = JText::_('COM_SUPPORTGROUPS_IMPORT_FAILED'); + $this->setRedirect(JRoute::_('index.php?option=com_supportgroups&view=payments', false), $message, 'error'); + return; + } +} diff --git a/admin/controllers/region.php b/admin/controllers/region.php index ca12ca0..c8fddad 100644 --- a/admin/controllers/region.php +++ b/admin/controllers/region.php @@ -59,8 +59,15 @@ class SupportgroupsControllerRegion extends JControllerForm * @since 1.6 */ protected function allowAdd($data = array()) - { // In the absense of better information, revert to the component permissions. - return parent::allowAdd($data); + { + // Access check. + $access = JFactory::getUser()->authorise('region.access', 'com_supportgroups'); + if (!$access) + { + return false; + } + // In the absense of better information, revert to the component permissions. + return JFactory::getUser()->authorise('region.create', $this->option); } /** @@ -81,13 +88,20 @@ class SupportgroupsControllerRegion extends JControllerForm $recordId = (int) isset($data[$key]) ? $data[$key] : 0; + // Access check. + $access = ($user->authorise('region.access', 'com_supportgroups.region.' . (int) $recordId) && $user->authorise('region.access', 'com_supportgroups')); + if (!$access) + { + return false; + } + if ($recordId) { // The record has been set. Check the record permissions. - $permission = $user->authorise('core.edit', 'com_supportgroups.region.' . (int) $recordId); + $permission = $user->authorise('region.edit', 'com_supportgroups.region.' . (int) $recordId); if (!$permission && !is_null($permission)) { - if ($user->authorise('core.edit.own', 'com_supportgroups.region.' . $recordId)) + if ($user->authorise('region.edit.own', 'com_supportgroups.region.' . $recordId)) { // Now test the owner is the user. $ownerId = (int) isset($data['created_by']) ? $data['created_by'] : 0; @@ -106,7 +120,7 @@ class SupportgroupsControllerRegion extends JControllerForm // If the owner matches 'me' then allow. if ($ownerId == $user->id) { - if ($user->authorise('core.edit.own', 'com_supportgroups')) + if ($user->authorise('region.edit.own', 'com_supportgroups')) { return true; } @@ -116,7 +130,7 @@ class SupportgroupsControllerRegion extends JControllerForm } } // Since there is no permission, revert to the component permissions. - return parent::allowEdit($data, $key); + return $user->authorise('region.edit', $this->option); } /** diff --git a/admin/controllers/support_group.php b/admin/controllers/support_group.php index 2a118e5..39d4cb2 100644 --- a/admin/controllers/support_group.php +++ b/admin/controllers/support_group.php @@ -59,8 +59,15 @@ class SupportgroupsControllerSupport_group extends JControllerForm * @since 1.6 */ protected function allowAdd($data = array()) - { // In the absense of better information, revert to the component permissions. - return parent::allowAdd($data); + { + // Access check. + $access = JFactory::getUser()->authorise('support_group.access', 'com_supportgroups'); + if (!$access) + { + return false; + } + // In the absense of better information, revert to the component permissions. + return JFactory::getUser()->authorise('support_group.create', $this->option); } /** @@ -81,13 +88,20 @@ class SupportgroupsControllerSupport_group extends JControllerForm $recordId = (int) isset($data[$key]) ? $data[$key] : 0; + // Access check. + $access = ($user->authorise('support_group.access', 'com_supportgroups.support_group.' . (int) $recordId) && $user->authorise('support_group.access', 'com_supportgroups')); + if (!$access) + { + return false; + } + if ($recordId) { // The record has been set. Check the record permissions. - $permission = $user->authorise('core.edit', 'com_supportgroups.support_group.' . (int) $recordId); + $permission = $user->authorise('support_group.edit', 'com_supportgroups.support_group.' . (int) $recordId); if (!$permission && !is_null($permission)) { - if ($user->authorise('core.edit.own', 'com_supportgroups.support_group.' . $recordId)) + if ($user->authorise('support_group.edit.own', 'com_supportgroups.support_group.' . $recordId)) { // Now test the owner is the user. $ownerId = (int) isset($data['created_by']) ? $data['created_by'] : 0; @@ -106,7 +120,7 @@ class SupportgroupsControllerSupport_group extends JControllerForm // If the owner matches 'me' then allow. if ($ownerId == $user->id) { - if ($user->authorise('core.edit.own', 'com_supportgroups')) + if ($user->authorise('support_group.edit.own', 'com_supportgroups')) { return true; } @@ -116,7 +130,7 @@ class SupportgroupsControllerSupport_group extends JControllerForm } } // Since there is no permission, revert to the component permissions. - return parent::allowEdit($data, $key); + return $user->authorise('support_group.edit', $this->option); } /** diff --git a/admin/helpers/negativefinder.php b/admin/helpers/negativefinder.php new file mode 100644 index 0000000..77c7b04 --- /dev/null +++ b/admin/helpers/negativefinder.php @@ -0,0 +1,67 @@ + +* +**/ + +// No direct access. +defined('_JEXEC') or die; + +/** +* Detecting negative numbers +**/ + +class Expression +{ + protected $expression; + protected $result; + + public function __construct($expression) + { + $this->expression = $expression; + } + + public function evaluate() + { + $this->result = eval("return ".$this->expression.";"); + return $this; + } + + public function getResult() + { + return $this->result; + } +} + +class NegativeFinder +{ + protected $expressionObj; + + public function __construct(Expression $expressionObj) + { + $this->expressionObj = $expressionObj; + } + + + public function isItNegative() + { + $result = $this->expressionObj->evaluate()->getResult(); + + if($this->hasMinusSign($result)) + { + return true; + } + else + { + return false; + } + } + + protected function hasMinusSign($value) + { + return (substr(strval($value), 0, 1) == "-"); + } +} diff --git a/admin/helpers/supportgroups.php b/admin/helpers/supportgroups.php index f0a3959..2e73be0 100644 --- a/admin/helpers/supportgroups.php +++ b/admin/helpers/supportgroups.php @@ -30,7 +30,113 @@ defined('_JEXEC') or die('Restricted access'); * Supportgroups component helper. */ abstract class SupportgroupsHelper -{ +{ + + public static function setCurrency($amount,$support_group) + { + // get the currency id + $currency = self::getCurrency($support_group); + // make money + return self::makeMoney($amount,$currency); + } + + protected static $currency = array(); + + public static function getCurrency($support_group) + { + if (!isset(self::$currency[$support_group])) + { + // get the location + $location = self::getVar('support_group', $support_group, 'id', 'location'); + // get the Region + $region = self::getVar('location', $location, 'id', 'region'); + // get the Country + $country = self::getVar('region', $region, 'id', 'country'); + // get the Currency Codethree + $codethree = self::getVar('country', $country, 'id', 'currency'); + // get currency id + self::$currency[$support_group] = self::getVar('currency', $codethree, 'codethree', 'id'); + } + return self::$currency[$support_group]; + } + + protected static $currencyDetails = array(); + + public static function getCurrencyDetails($id = false) + { + if(is_numeric($id)) + { + if (!isset(self::$currencyDetails[$id])) + { + // Get a db connection. + $db = JFactory::getDbo(); + // Create a new query object. + $query = $db->getQuery(true); + + $query->select($db->quoteName( + array( 'a.id','a.name','a.codethree','a.numericcode','a.symbol','a.thousands','a.decimalplace', + 'a.decimalsymbol','a.positivestyle','a.negativestyle'), + array( 'currency_id','currency_name','currency_codethree','currency_numericcode','currency_symbol', + 'currency_thousands','currency_decimalplace','currency_decimalsymbol','currency_positivestyle', + 'currency_negativestyle'))); + $query->from($db->quoteName('#__supportgroups_currency', 'a')); + $query->where($db->quoteName('id') . ' = '.(int) $id); + $db->setQuery($query); + $db->execute(); + if ($db->getNumRows()) + { + self::$currencyDetails[$id] = $db->loadObject(); + } + else + { + self::$currencyDetails[$id] = false; + } + } + return self::$currencyDetails[$id]; + } + return false; + } + + public static function makeMoney($number,$currency = false) + { + // first check if we have a number + if (is_numeric($number)) + { + // make sure to include the negative finder file + include_once 'negativefinder.php'; + // check if the number is negative + $negativeFinderObj = new NegativeFinder(new Expression("$number")); + $negative = $negativeFinderObj->isItNegative() ? TRUE : FALSE; + } + else + { + throw new Exception('ERROR! ('.$number.') is not a number!'); + } + // setup the currency + $currency = self::getCurrencyDetails($currency); + // set the number to currency + if (self::checkObject($currency)) + { + if (!$negative) + { + $format = $currency->currency_positivestyle; + $sign = '+'; + } + else + { + $format = $currency->currency_negativestyle; + $sign = '-'; + $number = abs($number); + } + $setupNumber = number_format((float)$number, (int)$currency->currency_decimalplace, $currency->currency_decimalsymbol, ' '); //$currency->currency_thousands TODO); + $search = array('{sign}', '{number}', '{symbol}'); + $replace = array($sign, $setupNumber, $currency->currency_symbol); + $moneyMade = str_replace ($search,$replace,$format); + + return $moneyMade; + } + return $number; + } /** * Load the Component xml manifest. **/ @@ -79,11 +185,75 @@ abstract class SupportgroupsHelper } /** - * Can be used to build help urls. + * Load the Component Help URLs. **/ public static function getHelpUrl($view) { + $user = JFactory::getUser(); + $groups = $user->get('groups'); + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select(array('a.id','a.groups','a.target','a.type','a.article','a.url')); + $query->from('#__supportgroups_help_document AS a'); + $query->where('a.admin_view = '.$db->quote($view)); + $query->where('a.location = 1'); + $query->where('a.published = 1'); + $db->setQuery($query); + $db->execute(); + if($db->getNumRows()) + { + $helps = $db->loadObjectList(); + if (self::checkArray($helps)) + { + foreach ($helps as $nr => $help) + { + if ($help->target == 1) + { + $targetgroups = json_decode($help->groups, true); + if (!array_intersect($targetgroups, $groups)) + { + // if user not in those target groups then remove the item + unset($helps[$nr]); + continue; + } + } + // set the return type + switch ($help->type) + { + // set joomla article + case 1: + return self::loadArticleLink($help->article); + break; + // set help text + case 2: + return self::loadHelpTextLink($help->id); + break; + // set Link + case 3: + return $help->url; + break; + } + } + } + } return false; + } + + /** + * Get the Article Link. + **/ + protected static function loadArticleLink($id) + { + return JURI::root().'index.php?option=com_content&view=article&id='.$id.'&tmpl=component&layout=modal'; + } + + /** + * Get the Help Text Link. + **/ + protected static function loadHelpTextLink($id) + { + $token = JSession::getFormToken(); + return 'index.php?option=com_supportgroups&task=help.getText&id=' . (int) $id . '&token=' . $token; } /** @@ -95,16 +265,37 @@ abstract class SupportgroupsHelper $user = JFactory::getUser(); // load the submenus to sidebar JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_DASHBOARD'), 'index.php?option=com_supportgroups&view=supportgroups', $submenu == 'supportgroups'); - JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_SUPPORT_GROUPS'), 'index.php?option=com_supportgroups&view=support_groups', $submenu == 'support_groups'); - JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_LOCATIONS'), 'index.php?option=com_supportgroups&view=locations', $submenu == 'locations'); - JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_REGIONS'), 'index.php?option=com_supportgroups&view=regions', $submenu == 'regions'); - if ($user->authorise('currency.access', 'com_supportgroups') && $user->authorise('currency.submenu', 'com_supportgroups')) + if ($user->authorise('support_group.access', 'com_supportgroups') && $user->authorise('support_group.submenu', 'com_supportgroups')) { - JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_CURRENCIES'), 'index.php?option=com_supportgroups&view=currencies', $submenu == 'currencies'); + JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_SUPPORT_GROUPS'), 'index.php?option=com_supportgroups&view=support_groups', $submenu == 'support_groups'); + } + if ($user->authorise('payment.access', 'com_supportgroups') && $user->authorise('payment.submenu', 'com_supportgroups')) + { + JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_PAYMENTS'), 'index.php?option=com_supportgroups&view=payments', $submenu == 'payments'); + } + if ($user->authorise('clinic.access', 'com_supportgroups') && $user->authorise('clinic.submenu', 'com_supportgroups')) + { + JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_CLINICS'), 'index.php?option=com_supportgroups&view=clinics', $submenu == 'clinics'); + } + if ($user->authorise('location.access', 'com_supportgroups') && $user->authorise('location.submenu', 'com_supportgroups')) + { + JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_LOCATIONS'), 'index.php?option=com_supportgroups&view=locations', $submenu == 'locations'); + } + if ($user->authorise('region.access', 'com_supportgroups') && $user->authorise('region.submenu', 'com_supportgroups')) + { + JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_REGIONS'), 'index.php?option=com_supportgroups&view=regions', $submenu == 'regions'); } if ($user->authorise('country.access', 'com_supportgroups') && $user->authorise('country.submenu', 'com_supportgroups')) { JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_COUNTRIES'), 'index.php?option=com_supportgroups&view=countries', $submenu == 'countries'); + } + if ($user->authorise('currency.access', 'com_supportgroups') && $user->authorise('currency.submenu', 'com_supportgroups')) + { + JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_CURRENCIES'), 'index.php?option=com_supportgroups&view=currencies', $submenu == 'currencies'); + } + if ($user->authorise('help_document.access', 'com_supportgroups') && $user->authorise('help_document.submenu', 'com_supportgroups')) + { + JHtmlSidebar::addEntry(JText::_('COM_SUPPORTGROUPS_SUBMENU_HELP_DOCUMENTS'), 'index.php?option=com_supportgroups&view=help_documents', $submenu == 'help_documents'); } } diff --git a/admin/language/en-GB/en-GB.com_supportgroups.ini b/admin/language/en-GB/en-GB.com_supportgroups.ini index 084e2b2..aaa14fe 100644 --- a/admin/language/en-GB/en-GB.com_supportgroups.ini +++ b/admin/language/en-GB/en-GB.com_supportgroups.ini @@ -1,6 +1,88 @@ COM_SUPPORTGROUPS="Support Groups" COM_SUPPORTGROUPS_AUTHOR="Author" COM_SUPPORTGROUPS_BACK="Back" +COM_SUPPORTGROUPS_CLINIC="Clinic" +COM_SUPPORTGROUPS_CLINICS="Clinics" +COM_SUPPORTGROUPS_CLINICS_ACCESS="Clinics Access" +COM_SUPPORTGROUPS_CLINICS_ACCESS_DESC="Allows the users in this group to access access clinics" +COM_SUPPORTGROUPS_CLINICS_BATCH_OPTIONS="Batch process the selected Clinics" +COM_SUPPORTGROUPS_CLINICS_BATCH_TIP="All changes will be applied to all selected Clinics" +COM_SUPPORTGROUPS_CLINICS_BATCH_USE="Clinics Batch Use" +COM_SUPPORTGROUPS_CLINICS_BATCH_USE_DESC="Allows users in this group to use batch copy/update method of batch clinics" +COM_SUPPORTGROUPS_CLINICS_CREATE="Clinics Create" +COM_SUPPORTGROUPS_CLINICS_CREATE_DESC="Allows the users in this group to create create clinics" +COM_SUPPORTGROUPS_CLINICS_DASHBOARD_LIST="Clinics Dashboard List" +COM_SUPPORTGROUPS_CLINICS_DASHBOARD_LIST_DESC="Allows the users in this group to update the dashboard list of the clinic" +COM_SUPPORTGROUPS_CLINICS_DELETE="Clinics Delete" +COM_SUPPORTGROUPS_CLINICS_DELETE_DESC="Allows the users in this group to delete delete clinics" +COM_SUPPORTGROUPS_CLINICS_EDIT="Clinics Edit" +COM_SUPPORTGROUPS_CLINICS_EDIT_CREATED_BY="Clinics Edit Created By" +COM_SUPPORTGROUPS_CLINICS_EDIT_CREATED_BY_DESC="Allows the users in this group to update the created by of the edit created by clinics" +COM_SUPPORTGROUPS_CLINICS_EDIT_CREATED_DATE="Clinics Edit Created Date" +COM_SUPPORTGROUPS_CLINICS_EDIT_CREATED_DATE_DESC="Allows the users in this group to update the created date of the edit created clinics" +COM_SUPPORTGROUPS_CLINICS_EDIT_DESC="Allows the users in this group to edit the clinic" +COM_SUPPORTGROUPS_CLINICS_EDIT_NAME="Clinics Edit Name" +COM_SUPPORTGROUPS_CLINICS_EDIT_NAME_DESC="Allows the users in this group to update the edit name of the clinic" +COM_SUPPORTGROUPS_CLINICS_EDIT_NOTE_SET_AREA="Clinics Edit Note Set Area" +COM_SUPPORTGROUPS_CLINICS_EDIT_NOTE_SET_AREA_DESC="Allows the users in this group to update the edit note set area of the clinic" +COM_SUPPORTGROUPS_CLINICS_EDIT_OWN="Clinics Edit Own" +COM_SUPPORTGROUPS_CLINICS_EDIT_OWN_DESC="Allows the users in this group to edit edit own clinics created by them" +COM_SUPPORTGROUPS_CLINICS_EDIT_PHONE="Clinics Edit Phone" +COM_SUPPORTGROUPS_CLINICS_EDIT_PHONE_DESC="Allows the users in this group to update the edit phone of the clinic" +COM_SUPPORTGROUPS_CLINICS_EDIT_STATE="Clinics Edit State" +COM_SUPPORTGROUPS_CLINICS_EDIT_STATE_DESC="Allows the users in this group to update the state of the clinic" +COM_SUPPORTGROUPS_CLINICS_EDIT_VERSION="Clinics Edit Version" +COM_SUPPORTGROUPS_CLINICS_EDIT_VERSION_DESC="Allows users in this group to edit versions of version clinics" +COM_SUPPORTGROUPS_CLINICS_EXPORT="Clinics Export" +COM_SUPPORTGROUPS_CLINICS_EXPORT_DESC="Allows the users in this group to export export clinics" +COM_SUPPORTGROUPS_CLINICS_IMPORT="Clinics Import" +COM_SUPPORTGROUPS_CLINICS_IMPORT_DESC="Allows the users in this group to import import clinics" +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_ARCHIVED="%s Clinics archived." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_ARCHIVED_1="%s Clinic archived." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_CHECKED_IN_0="No Clinic successfully checked in." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_CHECKED_IN_1="%d Clinic successfully checked in." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_CHECKED_IN_MORE="%d Clinics successfully checked in." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_DELETED="%s Clinics deleted." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_DELETED_1="%s Clinic deleted." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_FEATURED="%s Clinics featured." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_FEATURED_1="%s Clinic featured." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_PUBLISHED="%s Clinics published." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_PUBLISHED_1="%s Clinic published." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_TRASHED="%s Clinics trashed." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_TRASHED_1="%s Clinic trashed." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_UNFEATURED="%s Clinics unfeatured." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_UNFEATURED_1="%s Clinic unfeatured." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_UNPUBLISHED="%s Clinics unpublished." +COM_SUPPORTGROUPS_CLINICS_N_ITEMS_UNPUBLISHED_1="%s Clinic unpublished." +COM_SUPPORTGROUPS_CLINICS_SUBMENU="Clinics Submenu" +COM_SUPPORTGROUPS_CLINICS_SUBMENU_DESC="Allows the users in this group to update the submenu of the clinic" +COM_SUPPORTGROUPS_CLINIC_AREA="Area" +COM_SUPPORTGROUPS_CLINIC_CREATED_BY_DESC="The user that created the Clinic." +COM_SUPPORTGROUPS_CLINIC_CREATED_BY_LABEL="Created by" +COM_SUPPORTGROUPS_CLINIC_CREATED_DATE_DESC="The date Clinic was created." +COM_SUPPORTGROUPS_CLINIC_CREATED_DATE_LABEL="Created date" +COM_SUPPORTGROUPS_CLINIC_DETAILS="Details" +COM_SUPPORTGROUPS_CLINIC_EDIT="Editing the Clinic" +COM_SUPPORTGROUPS_CLINIC_ERROR_UNIQUE_ALIAS="Another Clinic has the same alias." +COM_SUPPORTGROUPS_CLINIC_ID="Id" +COM_SUPPORTGROUPS_CLINIC_NAME="Name" +COM_SUPPORTGROUPS_CLINIC_NAME_DESCRIPTION="Enter Name Here" +COM_SUPPORTGROUPS_CLINIC_NAME_HINT="Name Here" +COM_SUPPORTGROUPS_CLINIC_NAME_LABEL="Name" +COM_SUPPORTGROUPS_CLINIC_NEW="A New Clinic" +COM_SUPPORTGROUPS_CLINIC_NOTE_SET_AREA_DESCRIPTION="We will add a map here that the location can be drawn on." +COM_SUPPORTGROUPS_CLINIC_NOTE_SET_AREA_LABEL="Set Location" +COM_SUPPORTGROUPS_CLINIC_ORDERING_LABEL="Ordering" +COM_SUPPORTGROUPS_CLINIC_PERMISSION="Permissions" +COM_SUPPORTGROUPS_CLINIC_PHONE="Phone" +COM_SUPPORTGROUPS_CLINIC_PHONE_DESCRIPTION="The phone number of the contact person." +COM_SUPPORTGROUPS_CLINIC_PHONE_HINT="Phone Number Here!" +COM_SUPPORTGROUPS_CLINIC_PHONE_LABEL="Phone Number" +COM_SUPPORTGROUPS_CLINIC_PUBLISHING="Publishing" +COM_SUPPORTGROUPS_CLINIC_SAVE_WARNING="Alias already existed so a number was added at the end. You can re-edit the Clinic to customise the alias." +COM_SUPPORTGROUPS_CLINIC_STATUS="Status" +COM_SUPPORTGROUPS_CLINIC_VERSION_DESC="A count of the number of times this Clinic has been revised." +COM_SUPPORTGROUPS_CLINIC_VERSION_LABEL="Revision" COM_SUPPORTGROUPS_CONFIG_ALMOST_FLAT_LOAD="Almost Flat" COM_SUPPORTGROUPS_CONFIG_AUTHOR="Author Info" COM_SUPPORTGROUPS_CONFIG_AUTHOR_EMAIL_DESC="The email address of the author of this component." @@ -219,12 +301,14 @@ COM_SUPPORTGROUPS_CURRENCY_VERSION_DESC="A count of the number of times this Cur COM_SUPPORTGROUPS_CURRENCY_VERSION_LABEL="Revision" COM_SUPPORTGROUPS_DASH="Dashboard" COM_SUPPORTGROUPS_DASHBOARD="Support Groups Dashboard" +COM_SUPPORTGROUPS_DASHBOARD_CLINICS="Clinics

" COM_SUPPORTGROUPS_DASHBOARD_COUNTRIES="Countries

" COM_SUPPORTGROUPS_DASHBOARD_CURRENCIES="Currencies

" +COM_SUPPORTGROUPS_DASHBOARD_HELP_DOCUMENTS="Help Documents

" COM_SUPPORTGROUPS_DASHBOARD_LOCATIONS="Locations

" -COM_SUPPORTGROUPS_DASHBOARD_LOCATION_ADD="Add Location

" +COM_SUPPORTGROUPS_DASHBOARD_PAYMENTS="Payments

" +COM_SUPPORTGROUPS_DASHBOARD_PAYMENT_ADD="Add Payment

" COM_SUPPORTGROUPS_DASHBOARD_REGIONS="Regions

" -COM_SUPPORTGROUPS_DASHBOARD_REGION_ADD="Add Region

" COM_SUPPORTGROUPS_DASHBOARD_SUPPORT_GROUPS="Support Groups

" COM_SUPPORTGROUPS_DASHBOARD_SUPPORT_GROUP_ADD="Add Support Group

" COM_SUPPORTGROUPS_DATE="Date" @@ -237,6 +321,107 @@ COM_SUPPORTGROUPS_EDIT_VERSIONS_DESC=" Allows users in this group to edit versio COM_SUPPORTGROUPS_EXPORT_DATA="Export Data" COM_SUPPORTGROUPS_EXPORT_DATA_DESC=" Allows users in this group to export data." COM_SUPPORTGROUPS_EXPORT_FAILED="Export Failed" +COM_SUPPORTGROUPS_HELP_DOCUMENT="Help Document" +COM_SUPPORTGROUPS_HELP_DOCUMENTS="Help Documents" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_ACCESS="Help Documents Access" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_ACCESS_DESC="Allows the users in this group to access access help documents" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_BATCH_OPTIONS="Batch process the selected Help Documents" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_BATCH_TIP="All changes will be applied to all selected Help Documents" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_BATCH_USE="Help Documents Batch Use" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_BATCH_USE_DESC="Allows users in this group to use batch copy/update method of batch help documents" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_CREATE="Help Documents Create" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_CREATE_DESC="Allows the users in this group to create create help documents" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_DASHBOARD_LIST="Help Documents Dashboard List" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_DASHBOARD_LIST_DESC="Allows the users in this group to update the dashboard list of the help document" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_DELETE="Help Documents Delete" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_DELETE_DESC="Allows the users in this group to delete delete help documents" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_EDIT="Help Documents Edit" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_EDIT_DESC="Allows the users in this group to edit the help document" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_EDIT_OWN="Help Documents Edit Own" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_EDIT_OWN_DESC="Allows the users in this group to edit edit own help documents created by them" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_EDIT_STATE="Help Documents Edit State" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_EDIT_STATE_DESC="Allows the users in this group to update the state of the help document" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_EDIT_VERSION="Help Documents Edit Version" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_EDIT_VERSION_DESC="Allows users in this group to edit versions of version help documents" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_EXPORT="Help Documents Export" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_EXPORT_DESC="Allows the users in this group to export export help documents" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_IMPORT="Help Documents Import" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_IMPORT_DESC="Allows the users in this group to import import help documents" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_ARCHIVED="%s Help Documents archived." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_ARCHIVED_1="%s Help Document archived." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_CHECKED_IN_0="No Help Document successfully checked in." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_CHECKED_IN_1="%d Help Document successfully checked in." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_CHECKED_IN_MORE="%d Help Documents successfully checked in." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_DELETED="%s Help Documents deleted." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_DELETED_1="%s Help Document deleted." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_FEATURED="%s Help Documents featured." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_FEATURED_1="%s Help Document featured." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_PUBLISHED="%s Help Documents published." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_PUBLISHED_1="%s Help Document published." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_TRASHED="%s Help Documents trashed." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_TRASHED_1="%s Help Document trashed." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_UNFEATURED="%s Help Documents unfeatured." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_UNFEATURED_1="%s Help Document unfeatured." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_UNPUBLISHED="%s Help Documents unpublished." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_N_ITEMS_UNPUBLISHED_1="%s Help Document unpublished." +COM_SUPPORTGROUPS_HELP_DOCUMENTS_SUBMENU="Help Documents Submenu" +COM_SUPPORTGROUPS_HELP_DOCUMENTS_SUBMENU_DESC="Allows the users in this group to update the submenu of the help document" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ADMIN="Admin" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ADMIN_VIEW="Admin View" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ADMIN_VIEW_DESCRIPTION="Select the view being targeted" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ADMIN_VIEW_LABEL="Admin Views" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ALIAS="Alias" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ALIAS_HINT="Auto-generated from name" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ALL="All" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ARTICLE="Article" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ARTICLE_LABEL="Article" +COM_SUPPORTGROUPS_HELP_DOCUMENT_CONTENT="Content" +COM_SUPPORTGROUPS_HELP_DOCUMENT_CONTENT_LABEL="Content" +COM_SUPPORTGROUPS_HELP_DOCUMENT_CREATED_BY_DESC="The user that created the Help Document." +COM_SUPPORTGROUPS_HELP_DOCUMENT_CREATED_BY_LABEL="Created by" +COM_SUPPORTGROUPS_HELP_DOCUMENT_CREATED_DATE_DESC="The date Help Document was created." +COM_SUPPORTGROUPS_HELP_DOCUMENT_CREATED_DATE_LABEL="Created date" +COM_SUPPORTGROUPS_HELP_DOCUMENT_DETAILS="Details" +COM_SUPPORTGROUPS_HELP_DOCUMENT_EDIT="Editing the Help Document" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ERROR_UNIQUE_ALIAS="Another Help Document has the same alias." +COM_SUPPORTGROUPS_HELP_DOCUMENT_GROUPS="Groups" +COM_SUPPORTGROUPS_HELP_DOCUMENT_GROUPS_DESCRIPTION="Select a group/s" +COM_SUPPORTGROUPS_HELP_DOCUMENT_GROUPS_LABEL="Group/s" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ID="Id" +COM_SUPPORTGROUPS_HELP_DOCUMENT_JOOMLA_ARTICLE="Joomla Article" +COM_SUPPORTGROUPS_HELP_DOCUMENT_LOCATION="Location" +COM_SUPPORTGROUPS_HELP_DOCUMENT_LOCATION_DESCRIPTION="Select the help target location." +COM_SUPPORTGROUPS_HELP_DOCUMENT_LOCATION_LABEL="Location" +COM_SUPPORTGROUPS_HELP_DOCUMENT_NEW="A New Help Document" +COM_SUPPORTGROUPS_HELP_DOCUMENT_NOT_REQUIRED="Not Required" +COM_SUPPORTGROUPS_HELP_DOCUMENT_ORDERING_LABEL="Ordering" +COM_SUPPORTGROUPS_HELP_DOCUMENT_PERMISSION="Permissions" +COM_SUPPORTGROUPS_HELP_DOCUMENT_PUBLISHING="Publishing" +COM_SUPPORTGROUPS_HELP_DOCUMENT_SAVE_WARNING="Alias already existed so a number was added at the end. You can re-edit the Help Document to customise the alias." +COM_SUPPORTGROUPS_HELP_DOCUMENT_SELECT_AN_OPTION="Select an option" +COM_SUPPORTGROUPS_HELP_DOCUMENT_SITE="Site" +COM_SUPPORTGROUPS_HELP_DOCUMENT_SITE_VIEW="Site View" +COM_SUPPORTGROUPS_HELP_DOCUMENT_SITE_VIEW_DESCRIPTION="Select the view being targeted" +COM_SUPPORTGROUPS_HELP_DOCUMENT_SITE_VIEW_LABEL="Site Views" +COM_SUPPORTGROUPS_HELP_DOCUMENT_SOME="Some" +COM_SUPPORTGROUPS_HELP_DOCUMENT_STATUS="Status" +COM_SUPPORTGROUPS_HELP_DOCUMENT_TARGET="Target" +COM_SUPPORTGROUPS_HELP_DOCUMENT_TARGET_DESCRIPTION="Select the target option in relation to groups." +COM_SUPPORTGROUPS_HELP_DOCUMENT_TARGET_LABEL="Target Groups" +COM_SUPPORTGROUPS_HELP_DOCUMENT_TEXT="Text" +COM_SUPPORTGROUPS_HELP_DOCUMENT_TITLE="Title" +COM_SUPPORTGROUPS_HELP_DOCUMENT_TITLE_DESCRIPTION="Enter Title Here" +COM_SUPPORTGROUPS_HELP_DOCUMENT_TITLE_HINT="Title Here" +COM_SUPPORTGROUPS_HELP_DOCUMENT_TITLE_LABEL="Title" +COM_SUPPORTGROUPS_HELP_DOCUMENT_TYPE="Type" +COM_SUPPORTGROUPS_HELP_DOCUMENT_TYPE_DESCRIPTION="Select the help type." +COM_SUPPORTGROUPS_HELP_DOCUMENT_TYPE_LABEL="Type" +COM_SUPPORTGROUPS_HELP_DOCUMENT_URL="Url" +COM_SUPPORTGROUPS_HELP_DOCUMENT_URL_DESCRIPTION="Enter url" +COM_SUPPORTGROUPS_HELP_DOCUMENT_URL_HINT="http://www.example.com" +COM_SUPPORTGROUPS_HELP_DOCUMENT_URL_LABEL="URL" +COM_SUPPORTGROUPS_HELP_DOCUMENT_VERSION_DESC="A count of the number of times this Help Document has been revised." +COM_SUPPORTGROUPS_HELP_DOCUMENT_VERSION_LABEL="Revision" COM_SUPPORTGROUPS_HELP_MANAGER="Help" COM_SUPPORTGROUPS_IMPORT_CONTINUE="Continue" COM_SUPPORTGROUPS_IMPORT_DATA="Import Data" @@ -266,9 +451,12 @@ COM_SUPPORTGROUPS_IMPORT_NO_IMPORT_TYPE_FOUND="Import type not found." COM_SUPPORTGROUPS_IMPORT_PLEASE_SELECT_COLUMN="-- Please Select Column --" COM_SUPPORTGROUPS_IMPORT_SELECT_FILE="Select File" COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_DIRECTORY="Set the path to file" +COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_CLINICS="Select the file to import data to clinics." COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_COUNTRIES="Select the file to import data to countries." COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_CURRENCIES="Select the file to import data to currencies." +COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_HELP_DOCUMENTS="Select the file to import data to help_documents." COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_LOCATIONS="Select the file to import data to locations." +COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_PAYMENTS="Select the file to import data to payments." COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_REGIONS="Select the file to import data to regions." COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_FOR_SUPPORT_GROUPS="Select the file to import data to support_groups." COM_SUPPORTGROUPS_IMPORT_SELECT_FILE_URL="Enter file URL" @@ -284,18 +472,32 @@ COM_SUPPORTGROUPS_KEEP_ORIGINAL_STATE="- Keep Original State -" COM_SUPPORTGROUPS_LICENSE="License" COM_SUPPORTGROUPS_LOCATION="Location" COM_SUPPORTGROUPS_LOCATIONS="Locations" +COM_SUPPORTGROUPS_LOCATIONS_ACCESS="Locations Access" +COM_SUPPORTGROUPS_LOCATIONS_ACCESS_DESC="Allows the users in this group to access access locations" COM_SUPPORTGROUPS_LOCATIONS_BATCH_OPTIONS="Batch process the selected Locations" COM_SUPPORTGROUPS_LOCATIONS_BATCH_TIP="All changes will be applied to all selected Locations" COM_SUPPORTGROUPS_LOCATIONS_BATCH_USE="Locations Batch Use" COM_SUPPORTGROUPS_LOCATIONS_BATCH_USE_DESC="Allows users in this group to use batch copy/update method of batch locations" -COM_SUPPORTGROUPS_LOCATIONS_DASHBOARD_ADD="Locations Dashboard Add" -COM_SUPPORTGROUPS_LOCATIONS_DASHBOARD_ADD_DESC="Allows the users in this group to update the dashboard add of the location" +COM_SUPPORTGROUPS_LOCATIONS_CREATE="Locations Create" +COM_SUPPORTGROUPS_LOCATIONS_CREATE_DESC="Allows the users in this group to create create locations" COM_SUPPORTGROUPS_LOCATIONS_DASHBOARD_LIST="Locations Dashboard List" COM_SUPPORTGROUPS_LOCATIONS_DASHBOARD_LIST_DESC="Allows the users in this group to update the dashboard list of the location" +COM_SUPPORTGROUPS_LOCATIONS_DELETE="Locations Delete" +COM_SUPPORTGROUPS_LOCATIONS_DELETE_DESC="Allows the users in this group to delete delete locations" +COM_SUPPORTGROUPS_LOCATIONS_EDIT="Locations Edit" +COM_SUPPORTGROUPS_LOCATIONS_EDIT_CREATED_BY="Locations Edit Created By" +COM_SUPPORTGROUPS_LOCATIONS_EDIT_CREATED_BY_DESC="Allows the users in this group to update the created by of the edit created by locations" +COM_SUPPORTGROUPS_LOCATIONS_EDIT_CREATED_DATE="Locations Edit Created Date" +COM_SUPPORTGROUPS_LOCATIONS_EDIT_CREATED_DATE_DESC="Allows the users in this group to update the created date of the edit created locations" +COM_SUPPORTGROUPS_LOCATIONS_EDIT_DESC="Allows the users in this group to edit the location" COM_SUPPORTGROUPS_LOCATIONS_EDIT_NAME="Locations Edit Name" COM_SUPPORTGROUPS_LOCATIONS_EDIT_NAME_DESC="Allows the users in this group to update the edit name of the location" +COM_SUPPORTGROUPS_LOCATIONS_EDIT_OWN="Locations Edit Own" +COM_SUPPORTGROUPS_LOCATIONS_EDIT_OWN_DESC="Allows the users in this group to edit edit own locations created by them" COM_SUPPORTGROUPS_LOCATIONS_EDIT_REGION="Locations Edit Region" COM_SUPPORTGROUPS_LOCATIONS_EDIT_REGION_DESC="Allows the users in this group to update the edit region of the location" +COM_SUPPORTGROUPS_LOCATIONS_EDIT_STATE="Locations Edit State" +COM_SUPPORTGROUPS_LOCATIONS_EDIT_STATE_DESC="Allows the users in this group to update the state of the location" COM_SUPPORTGROUPS_LOCATIONS_EDIT_VERSION="Locations Edit Version" COM_SUPPORTGROUPS_LOCATIONS_EDIT_VERSION_DESC="Allows users in this group to edit versions of version locations" COM_SUPPORTGROUPS_LOCATIONS_EXPORT="Locations Export" @@ -326,7 +528,6 @@ COM_SUPPORTGROUPS_LOCATION_CREATED_BY_DESC="The user that created the Location." COM_SUPPORTGROUPS_LOCATION_CREATED_BY_LABEL="Created by" COM_SUPPORTGROUPS_LOCATION_CREATED_DATE_DESC="The date Location was created." COM_SUPPORTGROUPS_LOCATION_CREATED_DATE_LABEL="Created date" -COM_SUPPORTGROUPS_LOCATION_DETAILS="Details" COM_SUPPORTGROUPS_LOCATION_EDIT="Editing the Location" COM_SUPPORTGROUPS_LOCATION_ERROR_UNIQUE_ALIAS="Another Location has the same alias." COM_SUPPORTGROUPS_LOCATION_ID="Id" @@ -344,25 +545,145 @@ COM_SUPPORTGROUPS_LOCATION_REGION="Region" COM_SUPPORTGROUPS_LOCATION_REGION_DESCRIPTION="Please select the region this location belongs to." COM_SUPPORTGROUPS_LOCATION_REGION_LABEL="Region" COM_SUPPORTGROUPS_LOCATION_SAVE_WARNING="Alias already existed so a number was added at the end. You can re-edit the Location to customise the alias." +COM_SUPPORTGROUPS_LOCATION_SETTINGS="Settings" COM_SUPPORTGROUPS_LOCATION_STATUS="Status" +COM_SUPPORTGROUPS_LOCATION_SUPPORT_GROUPS="Support Groups" COM_SUPPORTGROUPS_LOCATION_VERSION_DESC="A count of the number of times this Location has been revised." COM_SUPPORTGROUPS_LOCATION_VERSION_LABEL="Revision" COM_SUPPORTGROUPS_NEW="New" COM_SUPPORTGROUPS_NO_ACCESS_GRANTED="No Access Granted!" +COM_SUPPORTGROUPS_PAYMENT="Payment" +COM_SUPPORTGROUPS_PAYMENTS="Payments" +COM_SUPPORTGROUPS_PAYMENTS_ACCESS="Payments Access" +COM_SUPPORTGROUPS_PAYMENTS_ACCESS_DESC="Allows the users in this group to access access payments" +COM_SUPPORTGROUPS_PAYMENTS_BATCH_OPTIONS="Batch process the selected Payments" +COM_SUPPORTGROUPS_PAYMENTS_BATCH_TIP="All changes will be applied to all selected Payments" +COM_SUPPORTGROUPS_PAYMENTS_BATCH_USE="Payments Batch Use" +COM_SUPPORTGROUPS_PAYMENTS_BATCH_USE_DESC="Allows users in this group to use batch copy/update method of batch payments" +COM_SUPPORTGROUPS_PAYMENTS_CREATE="Payments Create" +COM_SUPPORTGROUPS_PAYMENTS_CREATE_DESC="Allows the users in this group to create create payments" +COM_SUPPORTGROUPS_PAYMENTS_DASHBOARD_ADD="Payments Dashboard Add" +COM_SUPPORTGROUPS_PAYMENTS_DASHBOARD_ADD_DESC="Allows the users in this group to update the dashboard add of the payment" +COM_SUPPORTGROUPS_PAYMENTS_DASHBOARD_LIST="Payments Dashboard List" +COM_SUPPORTGROUPS_PAYMENTS_DASHBOARD_LIST_DESC="Allows the users in this group to update the dashboard list of the payment" +COM_SUPPORTGROUPS_PAYMENTS_DELETE="Payments Delete" +COM_SUPPORTGROUPS_PAYMENTS_DELETE_DESC="Allows the users in this group to delete delete payments" +COM_SUPPORTGROUPS_PAYMENTS_EDIT="Payments Edit" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_AMOUNT="Payments Edit Amount" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_AMOUNT_DESC="Allows the users in this group to update the edit amount of the payment" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_CREATED_BY="Payments Edit Created By" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_CREATED_BY_DESC="Allows the users in this group to update the created by of the edit created by payments" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_CREATED_DATE="Payments Edit Created Date" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_CREATED_DATE_DESC="Allows the users in this group to update the created date of the edit created payments" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_DESC="Allows the users in this group to edit the payment" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_OWN="Payments Edit Own" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_OWN_DESC="Allows the users in this group to edit edit own payments created by them" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_STATE="Payments Edit State" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_STATE_DESC="Allows the users in this group to update the state of the payment" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_SUPPORT_GROUP="Payments Edit Support Group" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_SUPPORT_GROUP_DESC="Allows the users in this group to update the edit support group of the payment" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_VERSION="Payments Edit Version" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_VERSION_DESC="Allows users in this group to edit versions of version payments" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_YEAR="Payments Edit Year" +COM_SUPPORTGROUPS_PAYMENTS_EDIT_YEAR_DESC="Allows the users in this group to update the edit year of the payment" +COM_SUPPORTGROUPS_PAYMENTS_EXPORT="Payments Export" +COM_SUPPORTGROUPS_PAYMENTS_EXPORT_DESC="Allows the users in this group to export export payments" +COM_SUPPORTGROUPS_PAYMENTS_IMPORT="Payments Import" +COM_SUPPORTGROUPS_PAYMENTS_IMPORT_DESC="Allows the users in this group to import import payments" +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_ARCHIVED="%s Payments archived." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_ARCHIVED_1="%s Payment archived." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_CHECKED_IN_0="No Payment successfully checked in." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_CHECKED_IN_1="%d Payment successfully checked in." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_CHECKED_IN_MORE="%d Payments successfully checked in." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_DELETED="%s Payments deleted." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_DELETED_1="%s Payment deleted." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_FEATURED="%s Payments featured." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_FEATURED_1="%s Payment featured." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_PUBLISHED="%s Payments published." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_PUBLISHED_1="%s Payment published." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_TRASHED="%s Payments trashed." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_TRASHED_1="%s Payment trashed." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_UNFEATURED="%s Payments unfeatured." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_UNFEATURED_1="%s Payment unfeatured." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_UNPUBLISHED="%s Payments unpublished." +COM_SUPPORTGROUPS_PAYMENTS_N_ITEMS_UNPUBLISHED_1="%s Payment unpublished." +COM_SUPPORTGROUPS_PAYMENTS_SUBMENU="Payments Submenu" +COM_SUPPORTGROUPS_PAYMENTS_SUBMENU_DESC="Allows the users in this group to update the submenu of the payment" +COM_SUPPORTGROUPS_PAYMENT_AMOUNT="Amount" +COM_SUPPORTGROUPS_PAYMENT_AMOUNT_DESCRIPTION="The amount paid in this support group." +COM_SUPPORTGROUPS_PAYMENT_AMOUNT_HINT="Only Numbers & dot" +COM_SUPPORTGROUPS_PAYMENT_AMOUNT_LABEL="Amount" +COM_SUPPORTGROUPS_PAYMENT_CREATED_BY_DESC="The user that created the Payment." +COM_SUPPORTGROUPS_PAYMENT_CREATED_BY_LABEL="Created by" +COM_SUPPORTGROUPS_PAYMENT_CREATED_DATE_DESC="The date Payment was created." +COM_SUPPORTGROUPS_PAYMENT_CREATED_DATE_LABEL="Created date" +COM_SUPPORTGROUPS_PAYMENT_DETAILS="Details" +COM_SUPPORTGROUPS_PAYMENT_EDIT="Editing the Payment" +COM_SUPPORTGROUPS_PAYMENT_ERROR_UNIQUE_ALIAS="Another Payment has the same alias." +COM_SUPPORTGROUPS_PAYMENT_ID="Id" +COM_SUPPORTGROUPS_PAYMENT_NEW="A New Payment" +COM_SUPPORTGROUPS_PAYMENT_ORDERING_LABEL="Ordering" +COM_SUPPORTGROUPS_PAYMENT_PERMISSION="Permissions" +COM_SUPPORTGROUPS_PAYMENT_PUBLISHING="Publishing" +COM_SUPPORTGROUPS_PAYMENT_SAVE_WARNING="Alias already existed so a number was added at the end. You can re-edit the Payment to customise the alias." +COM_SUPPORTGROUPS_PAYMENT_SELECT_A_YEAR="Select a year" +COM_SUPPORTGROUPS_PAYMENT_STATUS="Status" +COM_SUPPORTGROUPS_PAYMENT_SUPPORT_GROUP="Support Group" +COM_SUPPORTGROUPS_PAYMENT_SUPPORT_GROUP_DESCRIPTION="Please select the support group this payment is from." +COM_SUPPORTGROUPS_PAYMENT_SUPPORT_GROUP_LABEL="Support Group" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_EIGHTEEN="2018" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_ELEVEN="2011" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_FIFTEEN="2015" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_FOURTEEN="2014" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_NINETEEN="2019" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_SEVENTEEN="2017" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_SIXTEEN="2016" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TEN="2010" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_THIRTEEN="2013" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_THIRTY="2030" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWELVE="2012" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY="2020" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_EIGHT="2028" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_FIVE="2025" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_FOUR="2024" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_NINE="2029" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_ONE="2021" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_SEVEN="2027" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_SIX="2026" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_THREE="2023" +COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_TWO="2022" +COM_SUPPORTGROUPS_PAYMENT_VERSION_DESC="A count of the number of times this Payment has been revised." +COM_SUPPORTGROUPS_PAYMENT_VERSION_LABEL="Revision" +COM_SUPPORTGROUPS_PAYMENT_YEAR="Year" +COM_SUPPORTGROUPS_PAYMENT_YEAR_LABEL="Year" COM_SUPPORTGROUPS_REGION="Region" COM_SUPPORTGROUPS_REGIONS="Regions" +COM_SUPPORTGROUPS_REGIONS_ACCESS="Regions Access" +COM_SUPPORTGROUPS_REGIONS_ACCESS_DESC="Allows the users in this group to access access regions" COM_SUPPORTGROUPS_REGIONS_BATCH_OPTIONS="Batch process the selected Regions" COM_SUPPORTGROUPS_REGIONS_BATCH_TIP="All changes will be applied to all selected Regions" COM_SUPPORTGROUPS_REGIONS_BATCH_USE="Regions Batch Use" COM_SUPPORTGROUPS_REGIONS_BATCH_USE_DESC="Allows users in this group to use batch copy/update method of batch regions" -COM_SUPPORTGROUPS_REGIONS_DASHBOARD_ADD="Regions Dashboard Add" -COM_SUPPORTGROUPS_REGIONS_DASHBOARD_ADD_DESC="Allows the users in this group to update the dashboard add of the region" +COM_SUPPORTGROUPS_REGIONS_CREATE="Regions Create" +COM_SUPPORTGROUPS_REGIONS_CREATE_DESC="Allows the users in this group to create create regions" COM_SUPPORTGROUPS_REGIONS_DASHBOARD_LIST="Regions Dashboard List" COM_SUPPORTGROUPS_REGIONS_DASHBOARD_LIST_DESC="Allows the users in this group to update the dashboard list of the region" +COM_SUPPORTGROUPS_REGIONS_DELETE="Regions Delete" +COM_SUPPORTGROUPS_REGIONS_DELETE_DESC="Allows the users in this group to delete delete regions" +COM_SUPPORTGROUPS_REGIONS_EDIT="Regions Edit" COM_SUPPORTGROUPS_REGIONS_EDIT_COUNTRY="Regions Edit Country" COM_SUPPORTGROUPS_REGIONS_EDIT_COUNTRY_DESC="Allows the users in this group to update the edit country of the region" +COM_SUPPORTGROUPS_REGIONS_EDIT_CREATED_BY="Regions Edit Created By" +COM_SUPPORTGROUPS_REGIONS_EDIT_CREATED_BY_DESC="Allows the users in this group to update the created by of the edit created by regions" +COM_SUPPORTGROUPS_REGIONS_EDIT_CREATED_DATE="Regions Edit Created Date" +COM_SUPPORTGROUPS_REGIONS_EDIT_CREATED_DATE_DESC="Allows the users in this group to update the created date of the edit created regions" +COM_SUPPORTGROUPS_REGIONS_EDIT_DESC="Allows the users in this group to edit the region" COM_SUPPORTGROUPS_REGIONS_EDIT_NAME="Regions Edit Name" COM_SUPPORTGROUPS_REGIONS_EDIT_NAME_DESC="Allows the users in this group to update the edit name of the region" +COM_SUPPORTGROUPS_REGIONS_EDIT_OWN="Regions Edit Own" +COM_SUPPORTGROUPS_REGIONS_EDIT_OWN_DESC="Allows the users in this group to edit edit own regions created by them" +COM_SUPPORTGROUPS_REGIONS_EDIT_STATE="Regions Edit State" +COM_SUPPORTGROUPS_REGIONS_EDIT_STATE_DESC="Allows the users in this group to update the state of the region" COM_SUPPORTGROUPS_REGIONS_EDIT_VERSION="Regions Edit Version" COM_SUPPORTGROUPS_REGIONS_EDIT_VERSION_DESC="Allows users in this group to edit versions of version regions" COM_SUPPORTGROUPS_REGIONS_EXPORT="Regions Export" @@ -395,10 +716,10 @@ COM_SUPPORTGROUPS_REGION_CREATED_BY_DESC="The user that created the Region." COM_SUPPORTGROUPS_REGION_CREATED_BY_LABEL="Created by" COM_SUPPORTGROUPS_REGION_CREATED_DATE_DESC="The date Region was created." COM_SUPPORTGROUPS_REGION_CREATED_DATE_LABEL="Created date" -COM_SUPPORTGROUPS_REGION_DETAILS="Details" COM_SUPPORTGROUPS_REGION_EDIT="Editing the Region" COM_SUPPORTGROUPS_REGION_ERROR_UNIQUE_ALIAS="Another Region has the same alias." COM_SUPPORTGROUPS_REGION_ID="Id" +COM_SUPPORTGROUPS_REGION_LOCATIONS="Locations" COM_SUPPORTGROUPS_REGION_NAME="Name" COM_SUPPORTGROUPS_REGION_NAME_DESCRIPTION="Enter Name Here" COM_SUPPORTGROUPS_REGION_NAME_HINT="Name Here" @@ -408,29 +729,65 @@ COM_SUPPORTGROUPS_REGION_ORDERING_LABEL="Ordering" COM_SUPPORTGROUPS_REGION_PERMISSION="Permissions" COM_SUPPORTGROUPS_REGION_PUBLISHING="Publishing" COM_SUPPORTGROUPS_REGION_SAVE_WARNING="Alias already existed so a number was added at the end. You can re-edit the Region to customise the alias." +COM_SUPPORTGROUPS_REGION_SETTINGS="Settings" COM_SUPPORTGROUPS_REGION_STATUS="Status" COM_SUPPORTGROUPS_REGION_VERSION_DESC="A count of the number of times this Region has been revised." COM_SUPPORTGROUPS_REGION_VERSION_LABEL="Revision" COM_SUPPORTGROUPS_SAVE_SUCCESS="Great! Item successfully saved." COM_SUPPORTGROUPS_SAVE_WARNING="The value already existed so please select another." +COM_SUPPORTGROUPS_SUBMENU_CLINICS="Clinics" COM_SUPPORTGROUPS_SUBMENU_COUNTRIES="Countries" COM_SUPPORTGROUPS_SUBMENU_CURRENCIES="Currencies" COM_SUPPORTGROUPS_SUBMENU_DASHBOARD="Dashboard" +COM_SUPPORTGROUPS_SUBMENU_HELP_DOCUMENTS="Help Documents" COM_SUPPORTGROUPS_SUBMENU_LOCATIONS="Locations" +COM_SUPPORTGROUPS_SUBMENU_PAYMENTS="Payments" COM_SUPPORTGROUPS_SUBMENU_REGIONS="Regions" COM_SUPPORTGROUPS_SUBMENU_SUPPORT_GROUPS="Support Groups" COM_SUPPORTGROUPS_SUPPORT_GROUP="Support Group" COM_SUPPORTGROUPS_SUPPORT_GROUPS="Support Groups" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_ACCESS="Support Groups Access" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_ACCESS_DESC="Allows the users in this group to access access support groups" COM_SUPPORTGROUPS_SUPPORT_GROUPS_BATCH_OPTIONS="Batch process the selected Support Groups" COM_SUPPORTGROUPS_SUPPORT_GROUPS_BATCH_TIP="All changes will be applied to all selected Support Groups" COM_SUPPORTGROUPS_SUPPORT_GROUPS_BATCH_USE="Support Groups Batch Use" COM_SUPPORTGROUPS_SUPPORT_GROUPS_BATCH_USE_DESC="Allows users in this group to use batch copy/update method of batch support groups" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_CREATE="Support Groups Create" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_CREATE_DESC="Allows the users in this group to create create support groups" COM_SUPPORTGROUPS_SUPPORT_GROUPS_DASHBOARD_ADD="Support Groups Dashboard Add" COM_SUPPORTGROUPS_SUPPORT_GROUPS_DASHBOARD_ADD_DESC="Allows the users in this group to update the dashboard add of the support group" COM_SUPPORTGROUPS_SUPPORT_GROUPS_DASHBOARD_LIST="Support Groups Dashboard List" COM_SUPPORTGROUPS_SUPPORT_GROUPS_DASHBOARD_LIST_DESC="Allows the users in this group to update the dashboard list of the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_DELETE="Support Groups Delete" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_DELETE_DESC="Allows the users in this group to delete delete support groups" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT="Support Groups Edit" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_CLINIC="Support Groups Edit Clinic" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_CLINIC_DESC="Allows the users in this group to update the edit clinic of the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_CREATED_BY="Support Groups Edit Created By" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_CREATED_BY_DESC="Allows the users in this group to update the created by of the edit created by support groups" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_CREATED_DATE="Support Groups Edit Created Date" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_CREATED_DATE_DESC="Allows the users in this group to update the created date of the edit created support groups" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_DESC="Allows the users in this group to edit the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_FEMALE="Support Groups Edit Female" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_FEMALE_ART="Support Groups Edit Female Art" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_FEMALE_ART_DESC="Allows the users in this group to update the edit female art of the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_FEMALE_DESC="Allows the users in this group to update the edit female of the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_LOCATION="Support Groups Edit Location" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_LOCATION_DESC="Allows the users in this group to update the edit location of the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_MALE="Support Groups Edit Male" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_MALE_ART="Support Groups Edit Male Art" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_MALE_ART_DESC="Allows the users in this group to update the edit male art of the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_MALE_CHILDREN="Support Groups Edit Male Children" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_MALE_CHILDREN_DESC="Allows the users in this group to update the edit male children of the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_MALE_DESC="Allows the users in this group to update the edit male of the support group" COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_NAME="Support Groups Edit Name" COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_NAME_DESC="Allows the users in this group to update the edit name of the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_OWN="Support Groups Edit Own" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_OWN_DESC="Allows the users in this group to edit edit own support groups created by them" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_PHONE="Support Groups Edit Phone" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_PHONE_DESC="Allows the users in this group to update the edit phone of the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_STATE="Support Groups Edit State" +COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_STATE_DESC="Allows the users in this group to update the state of the support group" COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_VERSION="Support Groups Edit Version" COM_SUPPORTGROUPS_SUPPORT_GROUPS_EDIT_VERSION_DESC="Allows users in this group to edit versions of version support groups" COM_SUPPORTGROUPS_SUPPORT_GROUPS_EXPORT="Support Groups Export" @@ -456,6 +813,10 @@ COM_SUPPORTGROUPS_SUPPORT_GROUPS_N_ITEMS_UNPUBLISHED="%s Support Groups unpublis COM_SUPPORTGROUPS_SUPPORT_GROUPS_N_ITEMS_UNPUBLISHED_1="%s Support Group unpublished." COM_SUPPORTGROUPS_SUPPORT_GROUPS_SUBMENU="Support Groups Submenu" COM_SUPPORTGROUPS_SUPPORT_GROUPS_SUBMENU_DESC="Allows the users in this group to update the submenu of the support group" +COM_SUPPORTGROUPS_SUPPORT_GROUP_AREA="Area" +COM_SUPPORTGROUPS_SUPPORT_GROUP_CLINIC="Clinic" +COM_SUPPORTGROUPS_SUPPORT_GROUP_CLINIC_DESCRIPTION="Please select the nearest clinic." +COM_SUPPORTGROUPS_SUPPORT_GROUP_CLINIC_LABEL="Clinic" COM_SUPPORTGROUPS_SUPPORT_GROUP_CREATED_BY_DESC="The user that created the Support Group." COM_SUPPORTGROUPS_SUPPORT_GROUP_CREATED_BY_LABEL="Created by" COM_SUPPORTGROUPS_SUPPORT_GROUP_CREATED_DATE_DESC="The date Support Group was created." @@ -463,14 +824,46 @@ COM_SUPPORTGROUPS_SUPPORT_GROUP_CREATED_DATE_LABEL="Created date" COM_SUPPORTGROUPS_SUPPORT_GROUP_DETAILS="Details" COM_SUPPORTGROUPS_SUPPORT_GROUP_EDIT="Editing the Support Group" COM_SUPPORTGROUPS_SUPPORT_GROUP_ERROR_UNIQUE_ALIAS="Another Support Group has the same alias." +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE="Female" +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_ART="Female Art" +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_ART_DESCRIPTION="The number of female members on ART in this support group." +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_ART_HINT="Only Numbers" +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_ART_LABEL="Females on ART" +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_CHILDREN="Female Children" +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_CHILDREN_DESCRIPTION="The number of female members between the age of 5 and 14 years in this support group." +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_CHILDREN_HINT="Only Numbers" +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_CHILDREN_LABEL="Females (5-14)" +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_DESCRIPTION="The number of female members in this support group." +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_HINT="Only Numbers" +COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_LABEL="Females" COM_SUPPORTGROUPS_SUPPORT_GROUP_ID="Id" +COM_SUPPORTGROUPS_SUPPORT_GROUP_LOCATION="Location" +COM_SUPPORTGROUPS_SUPPORT_GROUP_LOCATION_DESCRIPTION="Please select the location this support_group belongs to." +COM_SUPPORTGROUPS_SUPPORT_GROUP_LOCATION_LABEL="Location" +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE="Male" +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_ART="Male Art" +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_ART_DESCRIPTION="The number of male members on ART in this support group." +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_ART_HINT="Only Numbers" +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_ART_LABEL="Males on ART" +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_CHILDREN="Male Children" +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_CHILDREN_DESCRIPTION="The number of male members between the age of 5 and 14 years in this support group." +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_CHILDREN_HINT="Only Numbers" +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_CHILDREN_LABEL="Males (5-14)" +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_DESCRIPTION="The number of male members in this support group." +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_HINT="Only Numbers" +COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_LABEL="Males" COM_SUPPORTGROUPS_SUPPORT_GROUP_NAME="Name" COM_SUPPORTGROUPS_SUPPORT_GROUP_NAME_DESCRIPTION="Enter Name Here" COM_SUPPORTGROUPS_SUPPORT_GROUP_NAME_HINT="Name Here" COM_SUPPORTGROUPS_SUPPORT_GROUP_NAME_LABEL="Name" COM_SUPPORTGROUPS_SUPPORT_GROUP_NEW="A New Support Group" COM_SUPPORTGROUPS_SUPPORT_GROUP_ORDERING_LABEL="Ordering" +COM_SUPPORTGROUPS_SUPPORT_GROUP_PAYMENTS="Payments" COM_SUPPORTGROUPS_SUPPORT_GROUP_PERMISSION="Permissions" +COM_SUPPORTGROUPS_SUPPORT_GROUP_PHONE="Phone" +COM_SUPPORTGROUPS_SUPPORT_GROUP_PHONE_DESCRIPTION="The phone number of the contact person." +COM_SUPPORTGROUPS_SUPPORT_GROUP_PHONE_HINT="Phone Number Here!" +COM_SUPPORTGROUPS_SUPPORT_GROUP_PHONE_LABEL="Phone Number" COM_SUPPORTGROUPS_SUPPORT_GROUP_PUBLISHING="Publishing" COM_SUPPORTGROUPS_SUPPORT_GROUP_SAVE_WARNING="Alias already existed so a number was added at the end. You can re-edit the Support Group to customise the alias." COM_SUPPORTGROUPS_SUPPORT_GROUP_STATUS="Status" diff --git a/admin/language/en-GB/en-GB.com_supportgroups.sys.ini b/admin/language/en-GB/en-GB.com_supportgroups.sys.ini index 435ce81..e04ea4b 100644 --- a/admin/language/en-GB/en-GB.com_supportgroups.sys.ini +++ b/admin/language/en-GB/en-GB.com_supportgroups.sys.ini @@ -1,6 +1,8 @@ COM_SUPPORTGROUPS="Support Groups" COM_SUPPORTGROUPS_CONFIGURATION="Support Groups Configuration" COM_SUPPORTGROUPS_MENU="» Support Groups" +COM_SUPPORTGROUPS_MENU_CLINICS="Clinics" COM_SUPPORTGROUPS_MENU_LOCATIONS="Locations" +COM_SUPPORTGROUPS_MENU_PAYMENTS="Payments" COM_SUPPORTGROUPS_MENU_REGIONS="Regions" COM_SUPPORTGROUPS_MENU_SUPPORT_GROUPS="Support Groups" diff --git a/admin/layouts/location/details_above.php b/admin/layouts/clinic/details_above.php similarity index 97% rename from admin/layouts/location/details_above.php rename to admin/layouts/clinic/details_above.php index 27bae13..8d2e998 100644 --- a/admin/layouts/location/details_above.php +++ b/admin/layouts/clinic/details_above.php @@ -31,7 +31,7 @@ $form = $displayData->getForm(); $fields = array( 'name', - 'region' + 'phone' ); ?> diff --git a/admin/layouts/location/details_fullwidth.php b/admin/layouts/clinic/details_fullwidth.php similarity index 96% rename from admin/layouts/location/details_fullwidth.php rename to admin/layouts/clinic/details_fullwidth.php index 884fe77..b11cfea 100644 --- a/admin/layouts/location/details_fullwidth.php +++ b/admin/layouts/clinic/details_fullwidth.php @@ -30,8 +30,7 @@ defined('_JEXEC') or die('Restricted access'); $form = $displayData->getForm(); $fields = $displayData->get('fields') ?: array( - 'note_set_area', - 'area' + 'note_set_area' ); ?> diff --git a/admin/layouts/clinic/details_under.php b/admin/layouts/clinic/details_under.php new file mode 100644 index 0000000..b5bfe87 --- /dev/null +++ b/admin/layouts/clinic/details_under.php @@ -0,0 +1,41 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = array( + 'area' +); + +?> +
+ renderField($field); + } ?> +
diff --git a/admin/layouts/clinic/index.html b/admin/layouts/clinic/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/layouts/clinic/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/layouts/clinic/metadata.php b/admin/layouts/clinic/metadata.php new file mode 100644 index 0000000..12c0508 --- /dev/null +++ b/admin/layouts/clinic/metadata.php @@ -0,0 +1,56 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +// JLayout for standard handling of metadata fields in the administrator content edit screens. +$fieldSets = $form->getFieldsets('metadata'); +?> + + $fieldSet) : ?> + description) && trim($fieldSet->description)) : ?> +

escape(JText::_($fieldSet->description)); ?>

+ + + renderField('metadesc'); + echo $form->renderField('metakey'); + } + + foreach ($form->getFieldset($name) as $field) + { + if ($field->name != 'jform[metadata][tags][]') + { + echo $field->renderField(); + } + } ?> + diff --git a/admin/layouts/clinic/publishing.php b/admin/layouts/clinic/publishing.php new file mode 100644 index 0000000..1e9db24 --- /dev/null +++ b/admin/layouts/clinic/publishing.php @@ -0,0 +1,64 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$app = JFactory::getApplication(); +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'created', + 'created_by', + 'modified', + 'modified_by', + 'published', + 'ordering', + 'access', + 'version', + 'hits', + 'id' +); + +$hiddenFields = $displayData->get('hidden_fields') ?: array(); + +foreach ($fields as $field) +{ + $field = is_array($field) ? $field : array($field); + foreach ($field as $f) + { + if ($form->getField($f)) + { + if (in_array($f, $hiddenFields)) + { + $form->setFieldAttribute($f, 'type', 'hidden'); + } + + echo $form->renderField($f); + break; + } + } +} diff --git a/admin/layouts/country/regions_fullwidth.php b/admin/layouts/country/regions_fullwidth.php index 72a7d9d..59ece1c 100644 --- a/admin/layouts/country/regions_fullwidth.php +++ b/admin/layouts/country/regions_fullwidth.php @@ -28,7 +28,7 @@ defined('_JEXEC') or die('Restricted access'); // set the defaults -$items = $displayData->vvvregions; +$items = $displayData->vvyregions; $user = JFactory::getUser(); $id = $displayData->item->id; $edit = "index.php?option=com_supportgroups&view=regions&task=region.edit"; @@ -38,7 +38,7 @@ $can = SupportgroupsHelper::getActions('region'); ?>
-get('core.create')): ?> +get('region.create')): ?>

@@ -68,7 +68,7 @@ $can = SupportgroupsHelper::getActions('region'); ?> - get('core.edit')): ?> + get('region.edit')): ?> escape($item->name); ?> checked_out): ?> name, $item->checked_out_time, 'regions.', $canCheckin); ?> diff --git a/admin/layouts/help_document/details_above.php b/admin/layouts/help_document/details_above.php new file mode 100644 index 0000000..9880405 --- /dev/null +++ b/admin/layouts/help_document/details_above.php @@ -0,0 +1,42 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = array( + 'title', + 'alias' +); + +?> +
+ renderField($field); + } ?> +
diff --git a/admin/layouts/help_document/details_fullwidth.php b/admin/layouts/help_document/details_fullwidth.php new file mode 100644 index 0000000..9a2b4cc --- /dev/null +++ b/admin/layouts/help_document/details_fullwidth.php @@ -0,0 +1,48 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'content' +); + +?> +
+ +
+
+ getLabel($field); ?> +
+
+ getInput($field); ?> +
+
+ +
diff --git a/admin/layouts/help_document/details_left.php b/admin/layouts/help_document/details_left.php new file mode 100644 index 0000000..462661a --- /dev/null +++ b/admin/layouts/help_document/details_left.php @@ -0,0 +1,58 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'target', + 'groups', + 'location', + 'admin_view', + 'site_view' +); + +$hiddenFields = $displayData->get('hidden_fields') ?: array(); + +foreach ($fields as $field) +{ + $field = is_array($field) ? $field : array($field); + foreach ($field as $f) + { + if ($form->getField($f)) + { + if (in_array($f, $hiddenFields)) + { + $form->setFieldAttribute($f, 'type', 'hidden'); + } + + echo $form->renderField($f); + break; + } + } +} diff --git a/admin/layouts/help_document/details_right.php b/admin/layouts/help_document/details_right.php new file mode 100644 index 0000000..0fc5d0e --- /dev/null +++ b/admin/layouts/help_document/details_right.php @@ -0,0 +1,56 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'type', + 'url', + 'article' +); + +$hiddenFields = $displayData->get('hidden_fields') ?: array(); + +foreach ($fields as $field) +{ + $field = is_array($field) ? $field : array($field); + foreach ($field as $f) + { + if ($form->getField($f)) + { + if (in_array($f, $hiddenFields)) + { + $form->setFieldAttribute($f, 'type', 'hidden'); + } + + echo $form->renderField($f); + break; + } + } +} diff --git a/admin/layouts/help_document/details_under.php b/admin/layouts/help_document/details_under.php new file mode 100644 index 0000000..ac835f3 --- /dev/null +++ b/admin/layouts/help_document/details_under.php @@ -0,0 +1,41 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = array( + 'not_required' +); + +?> +
+ renderField($field); + } ?> +
diff --git a/admin/layouts/help_document/index.html b/admin/layouts/help_document/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/layouts/help_document/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/layouts/help_document/publishing.php b/admin/layouts/help_document/publishing.php new file mode 100644 index 0000000..a8d2a6d --- /dev/null +++ b/admin/layouts/help_document/publishing.php @@ -0,0 +1,58 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$app = JFactory::getApplication(); +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'created', + 'created_by', + 'modified', + 'modified_by' +); + +$hiddenFields = $displayData->get('hidden_fields') ?: array(); + +foreach ($fields as $field) +{ + $field = is_array($field) ? $field : array($field); + foreach ($field as $f) + { + if ($form->getField($f)) + { + if (in_array($f, $hiddenFields)) + { + $form->setFieldAttribute($f, 'type', 'hidden'); + } + + echo $form->renderField($f); + break; + } + } +} diff --git a/admin/layouts/help_document/publlshing.php b/admin/layouts/help_document/publlshing.php new file mode 100644 index 0000000..a93233d --- /dev/null +++ b/admin/layouts/help_document/publlshing.php @@ -0,0 +1,60 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$app = JFactory::getApplication(); +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'published', + 'ordering', + 'access', + 'version', + 'hits', + 'id' +); + +$hiddenFields = $displayData->get('hidden_fields') ?: array(); + +foreach ($fields as $field) +{ + $field = is_array($field) ? $field : array($field); + foreach ($field as $f) + { + if ($form->getField($f)) + { + if (in_array($f, $hiddenFields)) + { + $form->setFieldAttribute($f, 'type', 'hidden'); + } + + echo $form->renderField($f); + break; + } + } +} diff --git a/admin/layouts/location/settings_above.php b/admin/layouts/location/settings_above.php new file mode 100644 index 0000000..d2fd54d --- /dev/null +++ b/admin/layouts/location/settings_above.php @@ -0,0 +1,42 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = array( + 'name', + 'region' +); + +?> +
+ renderField($field); + } ?> +
diff --git a/admin/layouts/location/settings_fullwidth.php b/admin/layouts/location/settings_fullwidth.php new file mode 100644 index 0000000..a0b76e5 --- /dev/null +++ b/admin/layouts/location/settings_fullwidth.php @@ -0,0 +1,49 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'note_set_area', + 'area' +); + +?> +
+ +
+
+ getLabel($field); ?> +
+
+ getInput($field); ?> +
+
+ +
diff --git a/admin/layouts/location/support_groups_fullwidth.php b/admin/layouts/location/support_groups_fullwidth.php new file mode 100644 index 0000000..ad3a4ee --- /dev/null +++ b/admin/layouts/location/support_groups_fullwidth.php @@ -0,0 +1,155 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +// set the defaults +$items = $displayData->vvwsupport_groups; +$user = JFactory::getUser(); +$id = $displayData->item->id; +$edit = "index.php?option=com_supportgroups&view=support_groups&task=support_group.edit"; +$ref = ($id) ? "&ref=location&refid=".$id : ""; +$new = "index.php?option=com_supportgroups&view=support_group&layout=edit".$ref; +$can = SupportgroupsHelper::getActions('support_group'); + +?> +
+get('support_group.create')): ?> +

+ + + + + + + + + + + + + + + + + $item): ?> + authorise('core.manage', 'com_checkin') || $item->checked_out == $user->id || $item->checked_out == 0; + $userChkOut = JFactory::getUser($item->checked_out); + $canDo = SupportgroupsHelper::getActions('support_group',$item,'support_groups'); + ?> + + + + + + + + published == 1):?> + + published == 0):?> + + published == 2):?> + + published == -2):?> + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ get('support_group.edit')): ?> + escape($item->name); ?> + checked_out): ?> + name, $item->checked_out_time, 'support_groups.', $canCheckin); ?> + + +
escape($item->name); ?>
+ +
+ escape($item->phone); ?> + + escape($item->location_name); ?> + + authorise('clinic.edit', 'com_supportgroups.clinic.' . (int)$item->clinic)): ?> + escape($item->clinic_name); ?> + +
escape($item->clinic_name); ?>
+ +
+ escape($item->male); ?> + + escape($item->female); ?> + + + + + + + + + + + + + + + + + + id; ?> +
+ +
+ +
+ +
+ +
diff --git a/admin/layouts/payment/details_above.php b/admin/layouts/payment/details_above.php new file mode 100644 index 0000000..c1d0df5 --- /dev/null +++ b/admin/layouts/payment/details_above.php @@ -0,0 +1,41 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = array( + 'support_group' +); + +?> +
+ renderField($field); + } ?> +
diff --git a/admin/layouts/region/details_left.php b/admin/layouts/payment/details_left.php similarity index 97% rename from admin/layouts/region/details_left.php rename to admin/layouts/payment/details_left.php index dce05e7..78a923d 100644 --- a/admin/layouts/region/details_left.php +++ b/admin/layouts/payment/details_left.php @@ -30,7 +30,7 @@ defined('_JEXEC') or die('Restricted access'); $form = $displayData->getForm(); $fields = $displayData->get('fields') ?: array( - 'name' + 'year' ); $hiddenFields = $displayData->get('hidden_fields') ?: array(); diff --git a/admin/layouts/region/details_right.php b/admin/layouts/payment/details_right.php similarity index 97% rename from admin/layouts/region/details_right.php rename to admin/layouts/payment/details_right.php index 5c07834..16a246f 100644 --- a/admin/layouts/region/details_right.php +++ b/admin/layouts/payment/details_right.php @@ -30,7 +30,7 @@ defined('_JEXEC') or die('Restricted access'); $form = $displayData->getForm(); $fields = $displayData->get('fields') ?: array( - 'country' + 'amount' ); $hiddenFields = $displayData->get('hidden_fields') ?: array(); diff --git a/admin/layouts/payment/index.html b/admin/layouts/payment/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/layouts/payment/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/layouts/payment/publishing.php b/admin/layouts/payment/publishing.php new file mode 100644 index 0000000..a8d2a6d --- /dev/null +++ b/admin/layouts/payment/publishing.php @@ -0,0 +1,58 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$app = JFactory::getApplication(); +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'created', + 'created_by', + 'modified', + 'modified_by' +); + +$hiddenFields = $displayData->get('hidden_fields') ?: array(); + +foreach ($fields as $field) +{ + $field = is_array($field) ? $field : array($field); + foreach ($field as $f) + { + if ($form->getField($f)) + { + if (in_array($f, $hiddenFields)) + { + $form->setFieldAttribute($f, 'type', 'hidden'); + } + + echo $form->renderField($f); + break; + } + } +} diff --git a/admin/layouts/payment/publlshing.php b/admin/layouts/payment/publlshing.php new file mode 100644 index 0000000..a93233d --- /dev/null +++ b/admin/layouts/payment/publlshing.php @@ -0,0 +1,60 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$app = JFactory::getApplication(); +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'published', + 'ordering', + 'access', + 'version', + 'hits', + 'id' +); + +$hiddenFields = $displayData->get('hidden_fields') ?: array(); + +foreach ($fields as $field) +{ + $field = is_array($field) ? $field : array($field); + foreach ($field as $f) + { + if ($form->getField($f)) + { + if (in_array($f, $hiddenFields)) + { + $form->setFieldAttribute($f, 'type', 'hidden'); + } + + echo $form->renderField($f); + break; + } + } +} diff --git a/admin/layouts/region/locations_fullwidth.php b/admin/layouts/region/locations_fullwidth.php new file mode 100644 index 0000000..f7d1761 --- /dev/null +++ b/admin/layouts/region/locations_fullwidth.php @@ -0,0 +1,127 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +// set the defaults +$items = $displayData->vvxlocations; +$user = JFactory::getUser(); +$id = $displayData->item->id; +$edit = "index.php?option=com_supportgroups&view=locations&task=location.edit"; +$ref = ($id) ? "&ref=region&refid=".$id : ""; +$new = "index.php?option=com_supportgroups&view=location&layout=edit".$ref; +$can = SupportgroupsHelper::getActions('location'); + +?> +
+get('location.create')): ?> +

+ + + + + + + + + + + + + $item): ?> + authorise('core.manage', 'com_checkin') || $item->checked_out == $user->id || $item->checked_out == 0; + $userChkOut = JFactory::getUser($item->checked_out); + $canDo = SupportgroupsHelper::getActions('location',$item,'locations'); + ?> + + + + published == 1):?> + + published == 0):?> + + published == 2):?> + + published == -2):?> + + + + + + + + + + + +
+ + + + + + + +
+ get('location.edit')): ?> + escape($item->name); ?> + checked_out): ?> + name, $item->checked_out_time, 'locations.', $canCheckin); ?> + + +
escape($item->name); ?>
+ +
+ escape($item->region_name); ?> + + + + + + + + + + + + + + + + + + id; ?> +
+ +
+ +
+ +
+ +
diff --git a/admin/layouts/region/settings_left.php b/admin/layouts/region/settings_left.php new file mode 100644 index 0000000..4482cc3 --- /dev/null +++ b/admin/layouts/region/settings_left.php @@ -0,0 +1,54 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'name' +); + +$hiddenFields = $displayData->get('hidden_fields') ?: array(); + +foreach ($fields as $field) +{ + $field = is_array($field) ? $field : array($field); + foreach ($field as $f) + { + if ($form->getField($f)) + { + if (in_array($f, $hiddenFields)) + { + $form->setFieldAttribute($f, 'type', 'hidden'); + } + + echo $form->renderField($f); + break; + } + } +} diff --git a/admin/layouts/region/settings_right.php b/admin/layouts/region/settings_right.php new file mode 100644 index 0000000..90edc8b --- /dev/null +++ b/admin/layouts/region/settings_right.php @@ -0,0 +1,54 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'country' +); + +$hiddenFields = $displayData->get('hidden_fields') ?: array(); + +foreach ($fields as $field) +{ + $field = is_array($field) ? $field : array($field); + foreach ($field as $f) + { + if ($form->getField($f)) + { + if (in_array($f, $hiddenFields)) + { + $form->setFieldAttribute($f, 'type', 'hidden'); + } + + echo $form->renderField($f); + break; + } + } +} diff --git a/admin/layouts/support_group/details_above.php b/admin/layouts/support_group/details_above.php new file mode 100644 index 0000000..97e976a --- /dev/null +++ b/admin/layouts/support_group/details_above.php @@ -0,0 +1,41 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = array( + 'name' +); + +?> +
+ renderField($field); + } ?> +
diff --git a/admin/layouts/support_group/details_left.php b/admin/layouts/support_group/details_left.php index dce05e7..b25fab4 100644 --- a/admin/layouts/support_group/details_left.php +++ b/admin/layouts/support_group/details_left.php @@ -30,7 +30,9 @@ defined('_JEXEC') or die('Restricted access'); $form = $displayData->getForm(); $fields = $displayData->get('fields') ?: array( - 'name' + 'phone', + 'location', + 'clinic' ); $hiddenFields = $displayData->get('hidden_fields') ?: array(); diff --git a/admin/layouts/support_group/details_right.php b/admin/layouts/support_group/details_right.php new file mode 100644 index 0000000..6086b0c --- /dev/null +++ b/admin/layouts/support_group/details_right.php @@ -0,0 +1,59 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = $displayData->get('fields') ?: array( + 'male', + 'male_children', + 'male_art', + 'female', + 'female_children', + 'female_art' +); + +$hiddenFields = $displayData->get('hidden_fields') ?: array(); + +foreach ($fields as $field) +{ + $field = is_array($field) ? $field : array($field); + foreach ($field as $f) + { + if ($form->getField($f)) + { + if (in_array($f, $hiddenFields)) + { + $form->setFieldAttribute($f, 'type', 'hidden'); + } + + echo $form->renderField($f); + break; + } + } +} diff --git a/admin/layouts/support_group/details_under.php b/admin/layouts/support_group/details_under.php new file mode 100644 index 0000000..b5bfe87 --- /dev/null +++ b/admin/layouts/support_group/details_under.php @@ -0,0 +1,41 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +$form = $displayData->getForm(); + +$fields = array( + 'area' +); + +?> +
+ renderField($field); + } ?> +
diff --git a/admin/layouts/support_group/payments_fullwidth.php b/admin/layouts/support_group/payments_fullwidth.php new file mode 100644 index 0000000..2849ce7 --- /dev/null +++ b/admin/layouts/support_group/payments_fullwidth.php @@ -0,0 +1,133 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file + +defined('_JEXEC') or die('Restricted access'); + +// set the defaults +$items = $displayData->vvvpayments; +$user = JFactory::getUser(); +$id = $displayData->item->id; +$edit = "index.php?option=com_supportgroups&view=payments&task=payment.edit"; +$ref = ($id) ? "&ref=support_group&refid=".$id : ""; +$new = "index.php?option=com_supportgroups&view=payment&layout=edit".$ref; +$can = SupportgroupsHelper::getActions('payment'); + +?> +
+get('payment.create')): ?> +

+ + + + + + + + + + + + + + $item): ?> + authorise('core.manage', 'com_checkin') || $item->checked_out == $user->id || $item->checked_out == 0; + $userChkOut = JFactory::getUser($item->checked_out); + $canDo = SupportgroupsHelper::getActions('payment',$item,'payments'); + ?> + + + + + published == 1):?> + + published == 0):?> + + published == 2):?> + + published == -2):?> + + + + + + + + + + + +
+ + + + + + + + + +
+ get('payment.edit')): ?> + escape($item->support_group_name); ?> + checked_out): ?> + name, $item->checked_out_time, 'payments.', $canCheckin); ?> + + +
escape($item->support_group_name); ?>
+ +
+ year); ?> + + escape($item->amount); ?> + + + + + + + + + + + + + + + + + + id; ?> +
+ +
+ +
+ +
+ +
diff --git a/admin/models/clinic.php b/admin/models/clinic.php new file mode 100644 index 0000000..61659bf --- /dev/null +++ b/admin/models/clinic.php @@ -0,0 +1,888 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +use Joomla\Registry\Registry; + +// import Joomla modelform library +jimport('joomla.application.component.modeladmin'); + +/** + * Supportgroups Clinic Model + */ +class SupportgroupsModelClinic extends JModelAdmin +{ + /** + * @var string The prefix to use with controller messages. + * @since 1.6 + */ + protected $text_prefix = 'COM_SUPPORTGROUPS'; + + /** + * The type alias for this content type. + * + * @var string + * @since 3.2 + */ + public $typeAlias = 'com_supportgroups.clinic'; + + /** + * Returns a Table object, always creating it + * + * @param type $type The table type to instantiate + * @param string $prefix A prefix for the table class name. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return JTable A database object + * + * @since 1.6 + */ + public function getTable($type = 'clinic', $prefix = 'SupportgroupsTable', $config = array()) + { + return JTable::getInstance($type, $prefix, $config); + } + + /** + * Method to get a single record. + * + * @param integer $pk The id of the primary key. + * + * @return mixed Object on success, false on failure. + * + * @since 1.6 + */ + public function getItem($pk = null) + { + if ($item = parent::getItem($pk)) + { + if (!empty($item->params)) + { + // Convert the params field to an array. + $registry = new Registry; + $registry->loadString($item->params); + $item->params = $registry->toArray(); + } + + if (!empty($item->metadata)) + { + // Convert the metadata field to an array. + $registry = new Registry; + $registry->loadString($item->metadata); + $item->metadata = $registry->toArray(); + } + + if (!empty($item->id)) + { + $item->tags = new JHelperTags; + $item->tags->getTagIds($item->id, 'com_supportgroups.clinic'); + } + } + + return $item; + } + + /** + * Method to get the record form. + * + * @param array $data Data for the form. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return mixed A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getForm($data = array(), $loadData = true) + { // Get the form. + $form = $this->loadForm('com_supportgroups.clinic', 'clinic', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + $jinput = JFactory::getApplication()->input; + + // The front end calls this model and uses a_id to avoid id clashes so we need to check for that first. + if ($jinput->get('a_id')) + { + $id = $jinput->get('a_id', 0, 'INT'); + } + // The back end uses id so we use that the rest of the time and set it to 0 by default. + else + { + $id = $jinput->get('id', 0, 'INT'); + } + + $user = JFactory::getUser(); + + // Check for existing item. + // Modify the form based on Edit State access controls. + if ($id != 0 && (!$user->authorise('clinic.edit.state', 'com_supportgroups.clinic.' . (int) $id)) + || ($id == 0 && !$user->authorise('clinic.edit.state', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('ordering', 'disabled', 'true'); + $form->setFieldAttribute('published', 'disabled', 'true'); + // Disable fields while saving. + $form->setFieldAttribute('ordering', 'filter', 'unset'); + $form->setFieldAttribute('published', 'filter', 'unset'); + } + // If this is a new item insure the greated by is set. + if (0 == $id) + { + // Set the created_by to this user + $form->setValue('created_by', null, $user->id); + } + // Modify the form based on Edit Creaded By access controls. + if ($id != 0 && (!$user->authorise('clinic.edit.created_by', 'com_supportgroups.clinic.' . (int) $id)) + || ($id == 0 && !$user->authorise('clinic.edit.created_by', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('created_by', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('created_by', 'readonly', 'true'); + // Disable fields while saving. + $form->setFieldAttribute('created_by', 'filter', 'unset'); + } + // Modify the form based on Edit Creaded Date access controls. + if ($id != 0 && (!$user->authorise('clinic.edit.created', 'com_supportgroups.clinic.' . (int) $id)) + || ($id == 0 && !$user->authorise('clinic.edit.created', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('created', 'disabled', 'true'); + // Disable fields while saving. + $form->setFieldAttribute('created', 'filter', 'unset'); + } + // Modify the form based on Edit Name access controls. + if ($id != 0 && (!$user->authorise('clinic.edit.name', 'com_supportgroups.clinic.' . (int) $id)) + || ($id == 0 && !$user->authorise('clinic.edit.name', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('name', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('name', 'readonly', 'true'); + if (!$form->getValue('name')) + { + // Disable fields while saving. + $form->setFieldAttribute('name', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('name', 'required', 'false'); + } + } + // Modify the form based on Edit Phone access controls. + if ($id != 0 && (!$user->authorise('clinic.edit.phone', 'com_supportgroups.clinic.' . (int) $id)) + || ($id == 0 && !$user->authorise('clinic.edit.phone', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('phone', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('phone', 'readonly', 'true'); + if (!$form->getValue('phone')) + { + // Disable fields while saving. + $form->setFieldAttribute('phone', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('phone', 'required', 'false'); + } + } + // Modify the form based on Edit Note Set Area access controls. + if ($id != 0 && (!$user->authorise('clinic.edit.note_set_area', 'com_supportgroups.clinic.' . (int) $id)) + || ($id == 0 && !$user->authorise('clinic.edit.note_set_area', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('note_set_area', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('note_set_area', 'readonly', 'true'); + if (!$form->getValue('note_set_area')) + { + // Disable fields while saving. + $form->setFieldAttribute('note_set_area', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('note_set_area', 'required', 'false'); + } + } + // Only load these values if no id is found + if (0 == $id) + { + // Set redirected field name + $redirectedField = $jinput->get('ref', null, 'STRING'); + // Set redirected field value + $redirectedValue = $jinput->get('refid', 0, 'INT'); + if (0 != $redirectedValue && $redirectedField) + { + // Now set the local-redirected field default value + $form->setValue($redirectedField, null, $redirectedValue); + } + } + + return $form; + } + + /** + * Method to get the script that have to be included on the form + * + * @return string script files + */ + public function getScript() + { + return 'administrator/components/com_supportgroups/models/forms/clinic.js'; + } + + /** + * Method to test whether a record can be deleted. + * + * @param object $record A record object. + * + * @return boolean True if allowed to delete the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canDelete($record) + { + if (!empty($record->id)) + { + if ($record->published != -2) + { + return; + } + + $user = JFactory::getUser(); + // The record has been set. Check the record permissions. + return $user->authorise('clinic.delete', 'com_supportgroups.clinic.' . (int) $record->id); + } + return false; + } + + /** + * Method to test whether a record can have its state edited. + * + * @param object $record A record object. + * + * @return boolean True if allowed to change the state of the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canEditState($record) + { + $user = JFactory::getUser(); + $recordId = (!empty($record->id)) ? $record->id : 0; + + if ($recordId) + { + // The record has been set. Check the record permissions. + $permission = $user->authorise('clinic.edit.state', 'com_supportgroups.clinic.' . (int) $recordId); + if (!$permission && !is_null($permission)) + { + return false; + } + } + // In the absense of better information, revert to the component permissions. + return $user->authorise('clinic.edit.state', 'com_supportgroups'); + } + + /** + * Method override to check if you can edit an existing record. + * + * @param array $data An array of input data. + * @param string $key The name of the key for the primary key. + * + * @return boolean + * @since 2.5 + */ + protected function allowEdit($data = array(), $key = 'id') + { + // Check specific edit permission then general edit permission. + $user = JFactory::getUser(); + + return $user->authorise('clinic.edit', 'com_supportgroups.clinic.'. ((int) isset($data[$key]) ? $data[$key] : 0)) or $user->authorise('clinic.edit', 'com_supportgroups'); + } + + /** + * Prepare and sanitise the table data prior to saving. + * + * @param JTable $table A JTable object. + * + * @return void + * + * @since 1.6 + */ + protected function prepareTable($table) + { + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + if (isset($table->name)) + { + $table->name = htmlspecialchars_decode($table->name, ENT_QUOTES); + } + + if (isset($table->alias) && empty($table->alias)) + { + $table->generateAlias(); + } + + if (empty($table->id)) + { + $table->created = $date->toSql(); + // set the user + if ($table->created_by == 0 || empty($table->created_by)) + { + $table->created_by = $user->id; + } + // Set ordering to the last item if not set + if (empty($table->ordering)) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('MAX(ordering)') + ->from($db->quoteName('#__supportgroups_clinic')); + $db->setQuery($query); + $max = $db->loadResult(); + + $table->ordering = $max + 1; + } + } + else + { + $table->modified = $date->toSql(); + $table->modified_by = $user->id; + } + + if (!empty($table->id)) + { + // Increment the items version number. + $table->version++; + } + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_supportgroups.edit.clinic.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + return $data; + } + + /** + * Method to get the unique fields of this table. + * + * @return mixed An array of field names, boolean false if none is set. + * + * @since 3.0 + */ + protected function getUniqeFields() + { + return false; + } + + /** + * Method to delete one or more records. + * + * @param array &$pks An array of record primary keys. + * + * @return boolean True if successful, false if an error occurs. + * + * @since 12.2 + */ + public function delete(&$pks) + { + if (!parent::delete($pks)) + { + return false; + } + + return true; + } + + /** + * Method to perform batch operations on an item or a set of items. + * + * @param array $commands An array of commands to perform. + * @param array $pks An array of item ids. + * @param array $contexts An array of item contexts. + * + * @return boolean Returns true on success, false on failure. + * + * @since 12.2 + */ + public function batch($commands, $pks, $contexts) + { + // Sanitize ids. + $pks = array_unique($pks); + JArrayHelper::toInteger($pks); + + // Remove any values of zero. + if (array_search(0, $pks, true)) + { + unset($pks[array_search(0, $pks, true)]); + } + + if (empty($pks)) + { + $this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED')); + return false; + } + + $done = false; + + // Set some needed variables. + $this->user = JFactory::getUser(); + $this->table = $this->getTable(); + $this->tableClassName = get_class($this->table); + $this->contentType = new JUcmType; + $this->type = $this->contentType->getTypeByTable($this->tableClassName); + $this->canDo = SupportgroupsHelper::getActions('clinic'); + $this->batchSet = true; + + if (!$this->canDo->get('core.batch')) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION')); + return false; + } + + if ($this->type == false) + { + $type = new JUcmType; + $this->type = $type->getTypeByAlias($this->typeAlias); + } + + $this->tagsObserver = $this->table->getObserverOfClass('JTableObserverTags'); + + if (!empty($commands['move_copy'])) + { + $cmd = JArrayHelper::getValue($commands, 'move_copy', 'c'); + + if ($cmd == 'c') + { + $result = $this->batchCopy($commands, $pks, $contexts); + + if (is_array($result)) + { + foreach ($result as $old => $new) + { + $contexts[$new] = $contexts[$old]; + } + $pks = array_values($result); + } + else + { + return false; + } + } + elseif ($cmd == 'm' && !$this->batchMove($commands, $pks, $contexts)) + { + return false; + } + + $done = true; + } + + if (!$done) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION')); + + return false; + } + + // Clear the cache + $this->cleanCache(); + + return true; + } + + /** + * Batch copy items to a new category or current. + * + * @param integer $values The new values. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return mixed An array of new IDs on success, boolean false on failure. + * + * @since 12.2 + */ + protected function batchCopy($values, $pks, $contexts) + { + if (empty($this->batchSet)) + { + // Set some needed variables. + $this->user = JFactory::getUser(); + $this->table = $this->getTable(); + $this->tableClassName = get_class($this->table); + $this->contentType = new JUcmType; + $this->type = $this->contentType->getTypeByTable($this->tableClassName); + $this->canDo = SupportgroupsHelper::getActions('clinic'); + } + + if (!$this->canDo->get('clinic.create') && !$this->canDo->get('clinic.batch')) + { + return false; + } + + // get list of uniqe fields + $uniqeFields = $this->getUniqeFields(); + // remove move_copy from array + unset($values['move_copy']); + + // make sure published is set + if (!isset($values['published'])) + { + $values['published'] = 0; + } + elseif (isset($values['published']) && !$this->canDo->get('clinic.edit.state')) + { + $values['published'] = 0; + } + + $newIds = array(); + + // Parent exists so let's proceed + while (!empty($pks)) + { + // Pop the first ID off the stack + $pk = array_shift($pks); + + $this->table->reset(); + + // only allow copy if user may edit this item. + + if (!$this->user->authorise('clinic.edit', $contexts[$pk])) + + { + + // Not fatal error + + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + + continue; + + } + + // Check that the row actually exists + if (!$this->table->load($pk)) + { + if ($error = $this->table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + else + { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + $this->table->name = $this->generateUniqe('name',$this->table->name); + + // insert all set values + if (SupportgroupsHelper::checkArray($values)) + { + foreach ($values as $key => $value) + { + if (strlen($value) > 0 && isset($this->table->$key)) + { + $this->table->$key = $value; + } + } + } + + // update all uniqe fields + if (SupportgroupsHelper::checkArray($uniqeFields)) + { + foreach ($uniqeFields as $uniqeField) + { + $this->table->$uniqeField = $this->generateUniqe($uniqeField,$this->table->$uniqeField); + } + } + + // Reset the ID because we are making a copy + $this->table->id = 0; + + // TODO: Deal with ordering? + // $this->table->ordering = 1; + + // Check the row. + if (!$this->table->check()) + { + $this->setError($this->table->getError()); + + return false; + } + + if (!empty($this->type)) + { + $this->createTagsHelper($this->tagsObserver, $this->type, $pk, $this->typeAlias, $this->table); + } + + // Store the row. + if (!$this->table->store()) + { + $this->setError($this->table->getError()); + + return false; + } + + // Get the new item ID + $newId = $this->table->get('id'); + + // Add the new ID to the array + $newIds[$pk] = $newId; + } + + // Clean the cache + $this->cleanCache(); + + return $newIds; + } + + /** + * Batch move items to a new category + * + * @param integer $value The new category ID. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return boolean True if successful, false otherwise and internal error is set. + * + * @since 12.2 + */ + protected function batchMove($values, $pks, $contexts) + { + if (empty($this->batchSet)) + { + // Set some needed variables. + $this->user = JFactory::getUser(); + $this->table = $this->getTable(); + $this->tableClassName = get_class($this->table); + $this->contentType = new JUcmType; + $this->type = $this->contentType->getTypeByTable($this->tableClassName); + $this->canDo = SupportgroupsHelper::getActions('clinic'); + } + + if (!$this->canDo->get('clinic.edit') && !$this->canDo->get('clinic.batch')) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + return false; + } + + // make sure published only updates if user has the permission. + if (isset($values['published']) && !$this->canDo->get('clinic.edit.state')) + { + unset($values['published']); + } + // remove move_copy from array + unset($values['move_copy']); + + // Parent exists so we proceed + foreach ($pks as $pk) + { + if (!$this->user->authorise('clinic.edit', $contexts[$pk])) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + + return false; + } + + // Check that the row actually exists + if (!$this->table->load($pk)) + { + if ($error = $this->table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + else + { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + // insert all set values. + if (SupportgroupsHelper::checkArray($values)) + { + foreach ($values as $key => $value) + { + // Do special action for access. + if ('access' == $key && strlen($value) > 0) + { + $this->table->$key = $value; + } + elseif (strlen($value) > 0 && isset($this->table->$key)) + { + $this->table->$key = $value; + } + } + } + + + // Check the row. + if (!$this->table->check()) + { + $this->setError($this->table->getError()); + + return false; + } + + if (!empty($this->type)) + { + $this->createTagsHelper($this->tagsObserver, $this->type, $pk, $this->typeAlias, $this->table); + } + + // Store the row. + if (!$this->table->store()) + { + $this->setError($this->table->getError()); + + return false; + } + } + + // Clean the cache + $this->cleanCache(); + + return true; + } + + /** + * Method to save the form data. + * + * @param array $data The form data. + * + * @return boolean True on success. + * + * @since 1.6 + */ + public function save($data) + { + $input = JFactory::getApplication()->input; + $filter = JFilterInput::getInstance(); + + // set the metadata to the Item Data + if (isset($data['metadata']) && isset($data['metadata']['author'])) + { + $data['metadata']['author'] = $filter->clean($data['metadata']['author'], 'TRIM'); + + $metadata = new JRegistry; + $metadata->loadArray($data['metadata']); + $data['metadata'] = (string) $metadata; + } + + // Set the Params Items to data + if (isset($data['params']) && is_array($data['params'])) + { + $params = new JRegistry; + $params->loadArray($data['params']); + $data['params'] = (string) $params; + } + + // Alter the uniqe field for save as copy + if ($input->get('task') == 'save2copy') + { + // Automatic handling of other uniqe fields + $uniqeFields = $this->getUniqeFields(); + if (SupportgroupsHelper::checkArray($uniqeFields)) + { + foreach ($uniqeFields as $uniqeField) + { + $data[$uniqeField] = $this->generateUniqe($uniqeField,$data[$uniqeField]); + } + } + } + + if (parent::save($data)) + { + return true; + } + return false; + } + + /** + * Method to generate a uniqe value. + * + * @param string $field name. + * @param string $value data. + * + * @return string New value. + * + * @since 3.0 + */ + protected function generateUniqe($field,$value) + { + + // set field value uniqe + $table = $this->getTable(); + + while ($table->load(array($field => $value))) + { + $value = JString::increment($value); + } + + return $value; + } + + /** + * Method to change the title & alias. + * + * @param string $title The title. + * + * @return array Contains the modified title and alias. + * + */ + protected function _generateNewTitle($title) + { + + // Alter the title + $table = $this->getTable(); + + while ($table->load(array('title' => $title))) + { + $title = JString::increment($title); + } + + return $title; + } +} diff --git a/admin/models/clinics.php b/admin/models/clinics.php new file mode 100644 index 0000000..05db89e --- /dev/null +++ b/admin/models/clinics.php @@ -0,0 +1,373 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import the Joomla modellist library +jimport('joomla.application.component.modellist'); + +/** + * Clinics Model + */ +class SupportgroupsModelClinics extends JModelList +{ + public function __construct($config = array()) + { + if (empty($config['filter_fields'])) + { + $config['filter_fields'] = array( + 'a.id','id', + 'a.published','published', + 'a.ordering','ordering', + 'a.created_by','created_by', + 'a.modified_by','modified_by', + 'a.name','name', + 'a.phone','phone' + ); + } + + parent::__construct($config); + } + + /** + * Method to auto-populate the model state. + * + * @return void + */ + protected function populateState($ordering = null, $direction = null) + { + $app = JFactory::getApplication(); + + // Adjust the context to support modal layouts. + if ($layout = $app->input->get('layout')) + { + $this->context .= '.' . $layout; + } + $name = $this->getUserStateFromRequest($this->context . '.filter.name', 'filter_name'); + $this->setState('filter.name', $name); + + $phone = $this->getUserStateFromRequest($this->context . '.filter.phone', 'filter_phone'); + $this->setState('filter.phone', $phone); + + $sorting = $this->getUserStateFromRequest($this->context . '.filter.sorting', 'filter_sorting', 0, 'int'); + $this->setState('filter.sorting', $sorting); + + $access = $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', 0, 'int'); + $this->setState('filter.access', $access); + + $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $published = $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', ''); + $this->setState('filter.published', $published); + + $created_by = $this->getUserStateFromRequest($this->context . '.filter.created_by', 'filter_created_by', ''); + $this->setState('filter.created_by', $created_by); + + $created = $this->getUserStateFromRequest($this->context . '.filter.created', 'filter_created'); + $this->setState('filter.created', $created); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get an array of data items. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getItems() + { + // check in items + $this->checkInNow(); + + // load parent items + $items = parent::getItems(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('clinic.access', 'com_supportgroups.clinic.' . (int) $item->id) && $user->authorise('clinic.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + } + } + + // return items + return $items; + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + // Get the user object. + $user = JFactory::getUser(); + // Create a new query object. + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + + // Select some fields + $query->select('a.*'); + + // From the supportgroups_item table + $query->from($db->quoteName('#__supportgroups_clinic', 'a')); + + // Filter by published state + $published = $this->getState('filter.published'); + if (is_numeric($published)) + { + $query->where('a.published = ' . (int) $published); + } + elseif ($published === '') + { + $query->where('(a.published = 0 OR a.published = 1)'); + } + + // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + // Filter by access level. + if ($access = $this->getState('filter.access')) + { + $query->where('a.access = ' . (int) $access); + } + // Implement View Level Access + if (!$user->authorise('core.options', 'com_supportgroups')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + // Filter by search. + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where('a.id = ' . (int) substr($search, 3)); + } + else + { + $search = $db->quote('%' . $db->escape($search, true) . '%'); + $query->where('(a.name LIKE '.$search.' OR a.phone LIKE '.$search.')'); + } + } + + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'a.id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + if ($orderCol != '') + { + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + } + + return $query; + } + + /** + * Method to get list export data. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getExportData($pks) + { + // setup the query + if (SupportgroupsHelper::checkArray($pks)) + { + // Get the user object. + $user = JFactory::getUser(); + // Create a new query object. + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + + // Select some fields + $query->select('a.*'); + + // From the supportgroups_clinic table + $query->from($db->quoteName('#__supportgroups_clinic', 'a')); + $query->where('a.id IN (' . implode(',',$pks) . ')'); + // Implement View Level Access + if (!$user->authorise('core.options', 'com_supportgroups')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + + // Order the results by ordering + $query->order('a.ordering ASC'); + + // Load the items + $db->setQuery($query); + $db->execute(); + if ($db->getNumRows()) + { + $items = $db->loadObjectList(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('clinic.access', 'com_supportgroups.clinic.' . (int) $item->id) && $user->authorise('clinic.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + // unset the values we don't want exported. + unset($item->asset_id); + unset($item->checked_out); + unset($item->checked_out_time); + } + } + // Add headers to items array. + $headers = $this->getExImPortHeaders(); + if (SupportgroupsHelper::checkObject($headers)) + { + array_unshift($items,$headers); + } + return $items; + } + } + return false; + } + + /** + * Method to get header. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getExImPortHeaders() + { + // Get a db connection. + $db = JFactory::getDbo(); + // get the columns + $columns = $db->getTableColumns("#__supportgroups_clinic"); + if (SupportgroupsHelper::checkArray($columns)) + { + // remove the headers you don't import/export. + unset($columns['asset_id']); + unset($columns['checked_out']); + unset($columns['checked_out_time']); + $headers = new stdClass(); + foreach ($columns as $column => $type) + { + $headers->{$column} = $column; + } + return $headers; + } + return false; + } + + /** + * Method to get a store id based on model configuration state. + * + * @return string A store id. + * + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.id'); + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.published'); + $id .= ':' . $this->getState('filter.ordering'); + $id .= ':' . $this->getState('filter.created_by'); + $id .= ':' . $this->getState('filter.modified_by'); + $id .= ':' . $this->getState('filter.name'); + $id .= ':' . $this->getState('filter.phone'); + + return parent::getStoreId($id); + } + + /** + * Build an SQL query to checkin all items left checked out longer then a set time. + * + * @return a bool + * + */ + protected function checkInNow() + { + // Get set check in time + $time = JComponentHelper::getParams('com_supportgroups')->get('check_in'); + + if ($time) + { + + // Get a db connection. + $db = JFactory::getDbo(); + // reset query + $query = $db->getQuery(true); + $query->select('*'); + $query->from($db->quoteName('#__supportgroups_clinic')); + $db->setQuery($query); + $db->execute(); + if ($db->getNumRows()) + { + // Get Yesterdays date + $date = JFactory::getDate()->modify($time)->toSql(); + // reset query + $query = $db->getQuery(true); + + // Fields to update. + $fields = array( + $db->quoteName('checked_out_time') . '=\'0000-00-00 00:00:00\'', + $db->quoteName('checked_out') . '=0' + ); + + // Conditions for which records should be updated. + $conditions = array( + $db->quoteName('checked_out') . '!=0', + $db->quoteName('checked_out_time') . '<\''.$date.'\'' + ); + + // Check table + $query->update($db->quoteName('#__supportgroups_clinic'))->set($fields)->where($conditions); + + $db->setQuery($query); + + $db->execute(); + } + } + + return false; + } +} diff --git a/admin/models/country.php b/admin/models/country.php index 1152b1e..51de7b7 100644 --- a/admin/models/country.php +++ b/admin/models/country.php @@ -101,7 +101,7 @@ class SupportgroupsModelCountry extends JModelAdmin $item->tags->getTagIds($item->id, 'com_supportgroups.country'); } } - $this->countryvvvv = $item->id; + $this->countryvvvy = $item->id; return $item; } @@ -111,7 +111,7 @@ class SupportgroupsModelCountry extends JModelAdmin * * @return mixed An array of data items on success, false on failure. */ - public function getVvvregions() + public function getVvyregions() { // Get the user object. $user = JFactory::getUser(); @@ -129,15 +129,15 @@ class SupportgroupsModelCountry extends JModelAdmin $query->select($db->quoteName('g.name','country_name')); $query->join('LEFT', $db->quoteName('#__supportgroups_country', 'g') . ' ON (' . $db->quoteName('a.country') . ' = ' . $db->quoteName('g.id') . ')'); - // Filter by countryvvvv global. - $countryvvvv = $this->countryvvvv; - if (is_numeric($countryvvvv )) + // Filter by countryvvvy global. + $countryvvvy = $this->countryvvvy; + if (is_numeric($countryvvvy )) { - $query->where('a.country = ' . (int) $countryvvvv ); + $query->where('a.country = ' . (int) $countryvvvy ); } - elseif (is_string($countryvvvv)) + elseif (is_string($countryvvvy)) { - $query->where('a.country = ' . $db->quote($countryvvvv)); + $query->where('a.country = ' . $db->quote($countryvvvy)); } else { @@ -168,6 +168,23 @@ class SupportgroupsModelCountry extends JModelAdmin if ($db->getNumRows()) { $items = $db->loadObjectList(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('region.access', 'com_supportgroups.region.' . (int) $item->id) && $user->authorise('region.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + } + } return $items; } return false; diff --git a/admin/models/fields/articles.php b/admin/models/fields/articles.php new file mode 100644 index 0000000..c87a4b6 --- /dev/null +++ b/admin/models/fields/articles.php @@ -0,0 +1,115 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import the list field type +jimport('joomla.form.helper'); +JFormHelper::loadFieldClass('list'); + +/** + * Articles Form Field class for the Supportgroups component + */ +class JFormFieldArticles extends JFormFieldList +{ + /** + * The articles field type. + * + * @var string + */ + public $type = 'articles'; + /** + * Override to add new button + * + * @return string The field input markup. + * + * @since 3.2 + */ + protected function getInput() + { + // see if we should add buttons + $setButton = $this->getAttribute('button'); + // get html + $html = parent::getInput(); + // if true set button + if ($setButton === 'true') + { + $user = JFactory::getUser(); + // only add if user allowed to create article + if ($user->authorise('core.create', 'com_supportgroups')) + { + // get the input from url + $jinput = JFactory::getApplication()->input; + // get the view name & id + $values = $jinput->getArray(array( + 'id' => 'int', + 'view' => 'word' + )); + // check if new item + $ref = ''; + if (!is_null($values['id']) && strlen($values['view'])) + { + // only load referal if not new item. + $ref = '&ref=' . $values['view'] . '&refid=' . $values['id']; + } + // build the button + $button = ' + ' . JText::_('COM_SUPPORTGROUPS_NEW') . ''; + // return the button attached to input field + return $html . $button; + } + } + return $html; + } + + /** + * Method to get a list of options for a list input. + * + * @return array An array of JHtml options. + */ + public function getOptions() + { + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + $query->select($db->quoteName(array('a.id','a.title','a.alias'),array('id','article_title','alias'))); + $query->from($db->quoteName('#__content', 'a')); + $query->where($db->quoteName('a.state') . ' = 1'); + $query->order('a.title ASC'); + $db->setQuery((string)$query); + $items = $db->loadObjectList(); + $options = array(); + if ($items) + { + $options[] = JHtml::_('select.option', '', 'Select an Article'); + foreach($items as $item) + { + $options[] = JHtml::_('select.option', $item->id, $item->article_title . ' (' . $item->alias . ')'); + } + } + return $options; + } +} diff --git a/admin/models/fields/clinics.php b/admin/models/fields/clinics.php new file mode 100644 index 0000000..2b6c368 --- /dev/null +++ b/admin/models/fields/clinics.php @@ -0,0 +1,115 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import the list field type +jimport('joomla.form.helper'); +JFormHelper::loadFieldClass('list'); + +/** + * Clinics Form Field class for the Supportgroups component + */ +class JFormFieldClinics extends JFormFieldList +{ + /** + * The clinics field type. + * + * @var string + */ + public $type = 'clinics'; + /** + * Override to add new button + * + * @return string The field input markup. + * + * @since 3.2 + */ + protected function getInput() + { + // see if we should add buttons + $setButton = $this->getAttribute('button'); + // get html + $html = parent::getInput(); + // if true set button + if ($setButton === 'true') + { + $user = JFactory::getUser(); + // only add if user allowed to create clinic + if ($user->authorise('clinic.create', 'com_supportgroups')) + { + // get the input from url + $jinput = JFactory::getApplication()->input; + // get the view name & id + $values = $jinput->getArray(array( + 'id' => 'int', + 'view' => 'word' + )); + // check if new item + $ref = ''; + if (!is_null($values['id']) && strlen($values['view'])) + { + // only load referal if not new item. + $ref = '&ref=' . $values['view'] . '&refid=' . $values['id']; + } + // build the button + $button = ' + ' . JText::_('COM_SUPPORTGROUPS_NEW') . ''; + // return the button attached to input field + return $html . $button; + } + } + return $html; + } + + /** + * Method to get a list of options for a list input. + * + * @return array An array of JHtml options. + */ + public function getOptions() + { + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + $query->select($db->quoteName(array('a.id','a.name'),array('id','clinic_name'))); + $query->from($db->quoteName('#__supportgroups_clinic', 'a')); + $query->where($db->quoteName('a.published') . ' = 1'); + $query->order('a.name ASC'); + $db->setQuery((string)$query); + $items = $db->loadObjectList(); + $options = array(); + if ($items) + { + $options[] = JHtml::_('select.option', '', 'Select a clinic'); + foreach($items as $item) + { + $options[] = JHtml::_('select.option', $item->id, $item->clinic_name); + } + } + return $options; + } +} diff --git a/admin/models/fields/locations.php b/admin/models/fields/locations.php new file mode 100644 index 0000000..ebf8c45 --- /dev/null +++ b/admin/models/fields/locations.php @@ -0,0 +1,119 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import the list field type +jimport('joomla.form.helper'); +JFormHelper::loadFieldClass('list'); + +/** + * Locations Form Field class for the Supportgroups component + */ +class JFormFieldLocations extends JFormFieldList +{ + /** + * The locations field type. + * + * @var string + */ + public $type = 'locations'; + /** + * Override to add new button + * + * @return string The field input markup. + * + * @since 3.2 + */ + protected function getInput() + { + // see if we should add buttons + $setButton = $this->getAttribute('button'); + // get html + $html = parent::getInput(); + // if true set button + if ($setButton === 'true') + { + $user = JFactory::getUser(); + // only add if user allowed to create location + if ($user->authorise('location.create', 'com_supportgroups')) + { + // get the input from url + $jinput = JFactory::getApplication()->input; + // get the view name & id + $values = $jinput->getArray(array( + 'id' => 'int', + 'view' => 'word' + )); + // check if new item + $ref = ''; + if (!is_null($values['id']) && strlen($values['view'])) + { + // only load referal if not new item. + $ref = '&ref=' . $values['view'] . '&refid=' . $values['id']; + } + // build the button + $button = ' + ' . JText::_('COM_SUPPORTGROUPS_NEW') . ''; + // return the button attached to input field + return $html . $button; + } + } + return $html; + } + + /** + * Method to get a list of options for a list input. + * + * @return array An array of JHtml options. + */ + public function getOptions() + { + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + $query->select($db->quoteName(array('a.id','a.name','b.name','c.codetwo'),array('id','location_name','region','country'))); + $query->from($db->quoteName('#__supportgroups_location', 'a')); + $query->join('LEFT', '#__supportgroups_region AS b ON b.id = a.region'); + $query->join('LEFT', '#__supportgroups_country AS c ON c.id = b.country'); + $query->where($db->quoteName('a.published') . ' = 1'); + $query->order('c.codetwo ASC'); + $query->order('b.name ASC'); + $query->order('a.name ASC'); + $db->setQuery((string)$query); + $items = $db->loadObjectList(); + $options = array(); + if ($items) + { + $options[] = JHtml::_('select.option', '', 'Select a location'); + foreach($items as $item) + { + $options[] = JHtml::_('select.option', $item->id, $item->location_name.' ('.$item->region.' - '.$item->country.')'); + } + } + return $options; + } +} diff --git a/admin/models/fields/regions.php b/admin/models/fields/regions.php index 8ccd593..615be0f 100644 --- a/admin/models/fields/regions.php +++ b/admin/models/fields/regions.php @@ -59,7 +59,7 @@ class JFormFieldRegions extends JFormFieldList { $user = JFactory::getUser(); // only add if user allowed to create region - if ($user->authorise('core.create', 'com_supportgroups')) + if ($user->authorise('region.create', 'com_supportgroups')) { // get the input from url $jinput = JFactory::getApplication()->input; diff --git a/admin/models/fields/supportgroups.php b/admin/models/fields/supportgroups.php new file mode 100644 index 0000000..ba25a20 --- /dev/null +++ b/admin/models/fields/supportgroups.php @@ -0,0 +1,115 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import the list field type +jimport('joomla.form.helper'); +JFormHelper::loadFieldClass('list'); + +/** + * Supportgroups Form Field class for the Supportgroups component + */ +class JFormFieldSupportgroups extends JFormFieldList +{ + /** + * The supportgroups field type. + * + * @var string + */ + public $type = 'supportgroups'; + /** + * Override to add new button + * + * @return string The field input markup. + * + * @since 3.2 + */ + protected function getInput() + { + // see if we should add buttons + $setButton = $this->getAttribute('button'); + // get html + $html = parent::getInput(); + // if true set button + if ($setButton === 'true') + { + $user = JFactory::getUser(); + // only add if user allowed to create support_group + if ($user->authorise('support_group.create', 'com_supportgroups')) + { + // get the input from url + $jinput = JFactory::getApplication()->input; + // get the view name & id + $values = $jinput->getArray(array( + 'id' => 'int', + 'view' => 'word' + )); + // check if new item + $ref = ''; + if (!is_null($values['id']) && strlen($values['view'])) + { + // only load referal if not new item. + $ref = '&ref=' . $values['view'] . '&refid=' . $values['id']; + } + // build the button + $button = ' + ' . JText::_('COM_SUPPORTGROUPS_NEW') . ''; + // return the button attached to input field + return $html . $button; + } + } + return $html; + } + + /** + * Method to get a list of options for a list input. + * + * @return array An array of JHtml options. + */ + public function getOptions() + { + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + $query->select($db->quoteName(array('a.id','a.name'),array('id','support_group_name'))); + $query->from($db->quoteName('#__supportgroups_support_group', 'a')); + $query->where($db->quoteName('a.published') . ' = 1'); + $query->order('a.name ASC'); + $db->setQuery((string)$query); + $items = $db->loadObjectList(); + $options = array(); + if ($items) + { + $options[] = JHtml::_('select.option', '', 'Select a support group'); + foreach($items as $item) + { + $options[] = JHtml::_('select.option', $item->id, $item->support_group_name); + } + } + return $options; + } +} diff --git a/admin/models/forms/clinic.js b/admin/models/forms/clinic.js new file mode 100644 index 0000000..27fa76f --- /dev/null +++ b/admin/models/forms/clinic.js @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage clinic.js + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + + diff --git a/admin/models/forms/clinic.xml b/admin/models/forms/clinic.xml new file mode 100644 index 0000000..59e3e1d --- /dev/null +++ b/admin/models/forms/clinic.xml @@ -0,0 +1,196 @@ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + +
+
+ + +
+ + + + +
+
\ No newline at end of file diff --git a/admin/models/forms/help_document.js b/admin/models/forms/help_document.js new file mode 100644 index 0000000..3ca519c --- /dev/null +++ b/admin/models/forms/help_document.js @@ -0,0 +1,311 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage help_document.js + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// Some Global Values +jform_vvvvvvyvvz_required = false; +jform_vvvvvvzvwa_required = false; +jform_vvvvvwavwb_required = false; +jform_vvvvvwbvwc_required = false; + +// Initial Script +jQuery(document).ready(function() +{ + var location_vvvvvvw = jQuery("#jform_location input[type='radio']:checked").val(); + vvvvvvw(location_vvvvvvw); + + var location_vvvvvvx = jQuery("#jform_location input[type='radio']:checked").val(); + vvvvvvx(location_vvvvvvx); + + var type_vvvvvvy = jQuery("#jform_type").val(); + vvvvvvy(type_vvvvvvy); + + var type_vvvvvvz = jQuery("#jform_type").val(); + vvvvvvz(type_vvvvvvz); + + var type_vvvvvwa = jQuery("#jform_type").val(); + vvvvvwa(type_vvvvvwa); + + var target_vvvvvwb = jQuery("#jform_target input[type='radio']:checked").val(); + vvvvvwb(target_vvvvvwb); +}); + +// the vvvvvvw function +function vvvvvvw(location_vvvvvvw) +{ + // set the function logic + if (location_vvvvvvw == 1) + { + jQuery('#jform_admin_view').closest('.control-group').show(); + } + else + { + jQuery('#jform_admin_view').closest('.control-group').hide(); + } +} + +// the vvvvvvx function +function vvvvvvx(location_vvvvvvx) +{ + // set the function logic + if (location_vvvvvvx == 2) + { + jQuery('#jform_site_view').closest('.control-group').show(); + } + else + { + jQuery('#jform_site_view').closest('.control-group').hide(); + } +} + +// the vvvvvvy function +function vvvvvvy(type_vvvvvvy) +{ + if (isSet(type_vvvvvvy) && type_vvvvvvy.constructor !== Array) + { + var temp_vvvvvvy = type_vvvvvvy; + var type_vvvvvvy = []; + type_vvvvvvy.push(temp_vvvvvvy); + } + else if (!isSet(type_vvvvvvy)) + { + var type_vvvvvvy = []; + } + var type = type_vvvvvvy.some(type_vvvvvvy_SomeFunc); + + + // set this function logic + if (type) + { + jQuery('#jform_url').closest('.control-group').show(); + if (jform_vvvvvvyvvz_required) + { + updateFieldRequired('url',0); + jQuery('#jform_url').prop('required','required'); + jQuery('#jform_url').attr('aria-required',true); + jQuery('#jform_url').addClass('required'); + jform_vvvvvvyvvz_required = false; + } + + } + else + { + jQuery('#jform_url').closest('.control-group').hide(); + if (!jform_vvvvvvyvvz_required) + { + updateFieldRequired('url',1); + jQuery('#jform_url').removeAttr('required'); + jQuery('#jform_url').removeAttr('aria-required'); + jQuery('#jform_url').removeClass('required'); + jform_vvvvvvyvvz_required = true; + } + } +} + +// the vvvvvvy Some function +function type_vvvvvvy_SomeFunc(type_vvvvvvy) +{ + // set the function logic + if (type_vvvvvvy == 3) + { + return true; + } + return false; +} + +// the vvvvvvz function +function vvvvvvz(type_vvvvvvz) +{ + if (isSet(type_vvvvvvz) && type_vvvvvvz.constructor !== Array) + { + var temp_vvvvvvz = type_vvvvvvz; + var type_vvvvvvz = []; + type_vvvvvvz.push(temp_vvvvvvz); + } + else if (!isSet(type_vvvvvvz)) + { + var type_vvvvvvz = []; + } + var type = type_vvvvvvz.some(type_vvvvvvz_SomeFunc); + + + // set this function logic + if (type) + { + jQuery('#jform_article').closest('.control-group').show(); + if (jform_vvvvvvzvwa_required) + { + updateFieldRequired('article',0); + jQuery('#jform_article').prop('required','required'); + jQuery('#jform_article').attr('aria-required',true); + jQuery('#jform_article').addClass('required'); + jform_vvvvvvzvwa_required = false; + } + + } + else + { + jQuery('#jform_article').closest('.control-group').hide(); + if (!jform_vvvvvvzvwa_required) + { + updateFieldRequired('article',1); + jQuery('#jform_article').removeAttr('required'); + jQuery('#jform_article').removeAttr('aria-required'); + jQuery('#jform_article').removeClass('required'); + jform_vvvvvvzvwa_required = true; + } + } +} + +// the vvvvvvz Some function +function type_vvvvvvz_SomeFunc(type_vvvvvvz) +{ + // set the function logic + if (type_vvvvvvz == 1) + { + return true; + } + return false; +} + +// the vvvvvwa function +function vvvvvwa(type_vvvvvwa) +{ + if (isSet(type_vvvvvwa) && type_vvvvvwa.constructor !== Array) + { + var temp_vvvvvwa = type_vvvvvwa; + var type_vvvvvwa = []; + type_vvvvvwa.push(temp_vvvvvwa); + } + else if (!isSet(type_vvvvvwa)) + { + var type_vvvvvwa = []; + } + var type = type_vvvvvwa.some(type_vvvvvwa_SomeFunc); + + + // set this function logic + if (type) + { + jQuery('#jform_content-lbl').closest('.control-group').show(); + if (jform_vvvvvwavwb_required) + { + updateFieldRequired('content',0); + jQuery('#jform_content').prop('required','required'); + jQuery('#jform_content').attr('aria-required',true); + jQuery('#jform_content').addClass('required'); + jform_vvvvvwavwb_required = false; + } + + } + else + { + jQuery('#jform_content-lbl').closest('.control-group').hide(); + if (!jform_vvvvvwavwb_required) + { + updateFieldRequired('content',1); + jQuery('#jform_content').removeAttr('required'); + jQuery('#jform_content').removeAttr('aria-required'); + jQuery('#jform_content').removeClass('required'); + jform_vvvvvwavwb_required = true; + } + } +} + +// the vvvvvwa Some function +function type_vvvvvwa_SomeFunc(type_vvvvvwa) +{ + // set the function logic + if (type_vvvvvwa == 2) + { + return true; + } + return false; +} + +// the vvvvvwb function +function vvvvvwb(target_vvvvvwb) +{ + // set the function logic + if (target_vvvvvwb == 1) + { + jQuery('#jform_groups').closest('.control-group').show(); + if (jform_vvvvvwbvwc_required) + { + updateFieldRequired('groups',0); + jQuery('#jform_groups').prop('required','required'); + jQuery('#jform_groups').attr('aria-required',true); + jQuery('#jform_groups').addClass('required'); + jform_vvvvvwbvwc_required = false; + } + + } + else + { + jQuery('#jform_groups').closest('.control-group').hide(); + if (!jform_vvvvvwbvwc_required) + { + updateFieldRequired('groups',1); + jQuery('#jform_groups').removeAttr('required'); + jQuery('#jform_groups').removeAttr('aria-required'); + jQuery('#jform_groups').removeClass('required'); + jform_vvvvvwbvwc_required = true; + } + } +} + +// update required fields +function updateFieldRequired(name,status) +{ + var not_required = jQuery('#jform_not_required').val(); + + if(status == 1) + { + if (isSet(not_required) && not_required != 0) + { + not_required = not_required+','+name; + } + else + { + not_required = ','+name; + } + } + else + { + if (isSet(not_required) && not_required != 0) + { + not_required = not_required.replace(','+name,''); + } + } + + jQuery('#jform_not_required').val(not_required); +} + +// the isSet function +function isSet(val) +{ + if ((val != undefined) && (val != null) && 0 !== val.length){ + return true; + } + return false; +} diff --git a/admin/models/forms/help_document.xml b/admin/models/forms/help_document.xml new file mode 100644 index 0000000..ef2c63b --- /dev/null +++ b/admin/models/forms/help_document.xml @@ -0,0 +1,253 @@ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + +
+
\ No newline at end of file diff --git a/admin/models/forms/location.xml b/admin/models/forms/location.xml index 2350a18..16853c5 100644 --- a/admin/models/forms/location.xml +++ b/admin/models/forms/location.xml @@ -126,6 +126,7 @@ description="COM_SUPPORTGROUPS_LOCATION_REGION_DESCRIPTION" class="list_class" multiple="false" + required="true" button="true" /> diff --git a/admin/models/forms/payment.js b/admin/models/forms/payment.js new file mode 100644 index 0000000..5bcef89 --- /dev/null +++ b/admin/models/forms/payment.js @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage payment.js + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + + diff --git a/admin/models/forms/payment.xml b/admin/models/forms/payment.xml new file mode 100644 index 0000000..80e889b --- /dev/null +++ b/admin/models/forms/payment.xml @@ -0,0 +1,190 @@ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + +
+
\ No newline at end of file diff --git a/admin/models/forms/region.xml b/admin/models/forms/region.xml index a8307cf..5a0fe22 100644 --- a/admin/models/forms/region.xml +++ b/admin/models/forms/region.xml @@ -126,6 +126,7 @@ description="COM_SUPPORTGROUPS_REGION_COUNTRY_DESCRIPTION" class="list_class" multiple="false" + required="true" button="false" /> diff --git a/admin/models/forms/support_group.xml b/admin/models/forms/support_group.xml index c002ee7..fdfdf7d 100644 --- a/admin/models/forms/support_group.xml +++ b/admin/models/forms/support_group.xml @@ -118,6 +118,133 @@ message="Error! Please add name here." hint="COM_SUPPORTGROUPS_SUPPORT_GROUP_NAME_HINT" /> + + + + + + + + + + + + + + + + + + + + diff --git a/admin/models/help_document.php b/admin/models/help_document.php new file mode 100644 index 0000000..e5d4055 --- /dev/null +++ b/admin/models/help_document.php @@ -0,0 +1,942 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +use Joomla\Registry\Registry; + +// import Joomla modelform library +jimport('joomla.application.component.modeladmin'); + +/** + * Supportgroups Help_document Model + */ +class SupportgroupsModelHelp_document extends JModelAdmin +{ + /** + * @var string The prefix to use with controller messages. + * @since 1.6 + */ + protected $text_prefix = 'COM_SUPPORTGROUPS'; + + /** + * The type alias for this content type. + * + * @var string + * @since 3.2 + */ + public $typeAlias = 'com_supportgroups.help_document'; + + /** + * Returns a Table object, always creating it + * + * @param type $type The table type to instantiate + * @param string $prefix A prefix for the table class name. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return JTable A database object + * + * @since 1.6 + */ + public function getTable($type = 'help_document', $prefix = 'SupportgroupsTable', $config = array()) + { + return JTable::getInstance($type, $prefix, $config); + } + + /** + * Method to get a single record. + * + * @param integer $pk The id of the primary key. + * + * @return mixed Object on success, false on failure. + * + * @since 1.6 + */ + public function getItem($pk = null) + { + if ($item = parent::getItem($pk)) + { + if (!empty($item->params)) + { + // Convert the params field to an array. + $registry = new Registry; + $registry->loadString($item->params); + $item->params = $registry->toArray(); + } + + if (!empty($item->metadata)) + { + // Convert the metadata field to an array. + $registry = new Registry; + $registry->loadString($item->metadata); + $item->metadata = $registry->toArray(); + } + + if (!empty($item->groups)) + { + // JSON Decode groups. + $item->groups = json_decode($item->groups,true); + } + + if (!empty($item->id)) + { + $item->tags = new JHelperTags; + $item->tags->getTagIds($item->id, 'com_supportgroups.help_document'); + } + } + + return $item; + } + + /** + * Method to get the record form. + * + * @param array $data Data for the form. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return mixed A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getForm($data = array(), $loadData = true) + { // Get the form. + $form = $this->loadForm('com_supportgroups.help_document', 'help_document', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + $jinput = JFactory::getApplication()->input; + + // The front end calls this model and uses a_id to avoid id clashes so we need to check for that first. + if ($jinput->get('a_id')) + { + $id = $jinput->get('a_id', 0, 'INT'); + } + // The back end uses id so we use that the rest of the time and set it to 0 by default. + else + { + $id = $jinput->get('id', 0, 'INT'); + } + + $user = JFactory::getUser(); + + // Check for existing item. + // Modify the form based on Edit State access controls. + if ($id != 0 && (!$user->authorise('help_document.edit.state', 'com_supportgroups.help_document.' . (int) $id)) + || ($id == 0 && !$user->authorise('help_document.edit.state', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('ordering', 'disabled', 'true'); + $form->setFieldAttribute('published', 'disabled', 'true'); + // Disable fields while saving. + $form->setFieldAttribute('ordering', 'filter', 'unset'); + $form->setFieldAttribute('published', 'filter', 'unset'); + } + // If this is a new item insure the greated by is set. + if (0 == $id) + { + // Set the created_by to this user + $form->setValue('created_by', null, $user->id); + } + // Modify the form based on Edit Creaded By access controls. + if (!$user->authorise('core.edit.created_by', 'com_supportgroups')) + { + // Disable fields for display. + $form->setFieldAttribute('created_by', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('created_by', 'readonly', 'true'); + // Disable fields while saving. + $form->setFieldAttribute('created_by', 'filter', 'unset'); + } + // Modify the form based on Edit Creaded Date access controls. + if (!$user->authorise('core.edit.created', 'com_supportgroups')) + { + // Disable fields for display. + $form->setFieldAttribute('created', 'disabled', 'true'); + // Disable fields while saving. + $form->setFieldAttribute('created', 'filter', 'unset'); + } + // Only load these values if no id is found + if (0 == $id) + { + // Set redirected field name + $redirectedField = $jinput->get('ref', null, 'STRING'); + // Set redirected field value + $redirectedValue = $jinput->get('refid', 0, 'INT'); + if (0 != $redirectedValue && $redirectedField) + { + // Now set the local-redirected field default value + $form->setValue($redirectedField, null, $redirectedValue); + } + } + + return $form; + } + + /** + * Method to get the script that have to be included on the form + * + * @return string script files + */ + public function getScript() + { + return 'administrator/components/com_supportgroups/models/forms/help_document.js'; + } + + /** + * Method to test whether a record can be deleted. + * + * @param object $record A record object. + * + * @return boolean True if allowed to delete the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canDelete($record) + { + if (!empty($record->id)) + { + if ($record->published != -2) + { + return; + } + + $user = JFactory::getUser(); + // The record has been set. Check the record permissions. + return $user->authorise('help_document.delete', 'com_supportgroups.help_document.' . (int) $record->id); + } + return false; + } + + /** + * Method to test whether a record can have its state edited. + * + * @param object $record A record object. + * + * @return boolean True if allowed to change the state of the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canEditState($record) + { + $user = JFactory::getUser(); + $recordId = (!empty($record->id)) ? $record->id : 0; + + if ($recordId) + { + // The record has been set. Check the record permissions. + $permission = $user->authorise('help_document.edit.state', 'com_supportgroups.help_document.' . (int) $recordId); + if (!$permission && !is_null($permission)) + { + return false; + } + } + // In the absense of better information, revert to the component permissions. + return $user->authorise('help_document.edit.state', 'com_supportgroups'); + } + + /** + * Method override to check if you can edit an existing record. + * + * @param array $data An array of input data. + * @param string $key The name of the key for the primary key. + * + * @return boolean + * @since 2.5 + */ + protected function allowEdit($data = array(), $key = 'id') + { + // Check specific edit permission then general edit permission. + $user = JFactory::getUser(); + + return $user->authorise('help_document.edit', 'com_supportgroups.help_document.'. ((int) isset($data[$key]) ? $data[$key] : 0)) or $user->authorise('help_document.edit', 'com_supportgroups'); + } + + /** + * Prepare and sanitise the table data prior to saving. + * + * @param JTable $table A JTable object. + * + * @return void + * + * @since 1.6 + */ + protected function prepareTable($table) + { + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + if (isset($table->name)) + { + $table->name = htmlspecialchars_decode($table->name, ENT_QUOTES); + } + + if (isset($table->alias) && empty($table->alias)) + { + $table->generateAlias(); + } + + if (empty($table->id)) + { + $table->created = $date->toSql(); + // set the user + if ($table->created_by == 0 || empty($table->created_by)) + { + $table->created_by = $user->id; + } + // Set ordering to the last item if not set + if (empty($table->ordering)) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('MAX(ordering)') + ->from($db->quoteName('#__supportgroups_help_document')); + $db->setQuery($query); + $max = $db->loadResult(); + + $table->ordering = $max + 1; + } + } + else + { + $table->modified = $date->toSql(); + $table->modified_by = $user->id; + } + + if (!empty($table->id)) + { + // Increment the items version number. + $table->version++; + } + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_supportgroups.edit.help_document.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + return $data; + } + + /** + * Method to validate the form data. + * + * @param JForm $form The form to validate against. + * @param array $data The data to validate. + * @param string $group The name of the field group to validate. + * + * @return mixed Array of filtered data if valid, false otherwise. + * + * @see JFormRule + * @see JFilterInput + * @since 12.2 + */ + public function validate($form, $data, $group = null) + { + // check if the not_required field is set + if (SupportgroupsHelper::checkString($data['not_required'])) + { + $requiredFields = (array) explode(',',(string) $data['not_required']); + $requiredFields = array_unique($requiredFields); + // now change the required field attributes value + foreach ($requiredFields as $requiredField) + { + // make sure there is a string value + if (SupportgroupsHelper::checkString($requiredField)) + { + // change to false + $form->setFieldAttribute($requiredField, 'required', 'false'); + // also clear the data set + $data[$requiredField] = ''; + } + } + } + return parent::validate($form, $data, $group); + } + + /** + * Method to get the unique fields of this table. + * + * @return mixed An array of field names, boolean false if none is set. + * + * @since 3.0 + */ + protected function getUniqeFields() + { + return false; + } + + /** + * Method to delete one or more records. + * + * @param array &$pks An array of record primary keys. + * + * @return boolean True if successful, false if an error occurs. + * + * @since 12.2 + */ + public function delete(&$pks) + { + if (!parent::delete($pks)) + { + return false; + } + + return true; + } + + /** + * Method to perform batch operations on an item or a set of items. + * + * @param array $commands An array of commands to perform. + * @param array $pks An array of item ids. + * @param array $contexts An array of item contexts. + * + * @return boolean Returns true on success, false on failure. + * + * @since 12.2 + */ + public function batch($commands, $pks, $contexts) + { + // Sanitize ids. + $pks = array_unique($pks); + JArrayHelper::toInteger($pks); + + // Remove any values of zero. + if (array_search(0, $pks, true)) + { + unset($pks[array_search(0, $pks, true)]); + } + + if (empty($pks)) + { + $this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED')); + return false; + } + + $done = false; + + // Set some needed variables. + $this->user = JFactory::getUser(); + $this->table = $this->getTable(); + $this->tableClassName = get_class($this->table); + $this->contentType = new JUcmType; + $this->type = $this->contentType->getTypeByTable($this->tableClassName); + $this->canDo = SupportgroupsHelper::getActions('help_document'); + $this->batchSet = true; + + if (!$this->canDo->get('core.batch')) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION')); + return false; + } + + if ($this->type == false) + { + $type = new JUcmType; + $this->type = $type->getTypeByAlias($this->typeAlias); + } + + $this->tagsObserver = $this->table->getObserverOfClass('JTableObserverTags'); + + if (!empty($commands['move_copy'])) + { + $cmd = JArrayHelper::getValue($commands, 'move_copy', 'c'); + + if ($cmd == 'c') + { + $result = $this->batchCopy($commands, $pks, $contexts); + + if (is_array($result)) + { + foreach ($result as $old => $new) + { + $contexts[$new] = $contexts[$old]; + } + $pks = array_values($result); + } + else + { + return false; + } + } + elseif ($cmd == 'm' && !$this->batchMove($commands, $pks, $contexts)) + { + return false; + } + + $done = true; + } + + if (!$done) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION')); + + return false; + } + + // Clear the cache + $this->cleanCache(); + + return true; + } + + /** + * Batch copy items to a new category or current. + * + * @param integer $values The new values. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return mixed An array of new IDs on success, boolean false on failure. + * + * @since 12.2 + */ + protected function batchCopy($values, $pks, $contexts) + { + if (empty($this->batchSet)) + { + // Set some needed variables. + $this->user = JFactory::getUser(); + $this->table = $this->getTable(); + $this->tableClassName = get_class($this->table); + $this->contentType = new JUcmType; + $this->type = $this->contentType->getTypeByTable($this->tableClassName); + $this->canDo = SupportgroupsHelper::getActions('help_document'); + } + + if (!$this->canDo->get('help_document.create') && !$this->canDo->get('help_document.batch')) + { + return false; + } + + // get list of uniqe fields + $uniqeFields = $this->getUniqeFields(); + // remove move_copy from array + unset($values['move_copy']); + + // make sure published is set + if (!isset($values['published'])) + { + $values['published'] = 0; + } + elseif (isset($values['published']) && !$this->canDo->get('help_document.edit.state')) + { + $values['published'] = 0; + } + + $newIds = array(); + + // Parent exists so let's proceed + while (!empty($pks)) + { + // Pop the first ID off the stack + $pk = array_shift($pks); + + $this->table->reset(); + + // only allow copy if user may edit this item. + + if (!$this->user->authorise('help_document.edit', $contexts[$pk])) + + { + + // Not fatal error + + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + + continue; + + } + + // Check that the row actually exists + if (!$this->table->load($pk)) + { + if ($error = $this->table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + else + { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + list($this->table->title, $this->table->alias) = $this->_generateNewTitle($this->table->alias, $this->table->title); + + // insert all set values + if (SupportgroupsHelper::checkArray($values)) + { + foreach ($values as $key => $value) + { + if (strlen($value) > 0 && isset($this->table->$key)) + { + $this->table->$key = $value; + } + } + } + + // update all uniqe fields + if (SupportgroupsHelper::checkArray($uniqeFields)) + { + foreach ($uniqeFields as $uniqeField) + { + $this->table->$uniqeField = $this->generateUniqe($uniqeField,$this->table->$uniqeField); + } + } + + // Reset the ID because we are making a copy + $this->table->id = 0; + + // TODO: Deal with ordering? + // $this->table->ordering = 1; + + // Check the row. + if (!$this->table->check()) + { + $this->setError($this->table->getError()); + + return false; + } + + if (!empty($this->type)) + { + $this->createTagsHelper($this->tagsObserver, $this->type, $pk, $this->typeAlias, $this->table); + } + + // Store the row. + if (!$this->table->store()) + { + $this->setError($this->table->getError()); + + return false; + } + + // Get the new item ID + $newId = $this->table->get('id'); + + // Add the new ID to the array + $newIds[$pk] = $newId; + } + + // Clean the cache + $this->cleanCache(); + + return $newIds; + } + + /** + * Batch move items to a new category + * + * @param integer $value The new category ID. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return boolean True if successful, false otherwise and internal error is set. + * + * @since 12.2 + */ + protected function batchMove($values, $pks, $contexts) + { + if (empty($this->batchSet)) + { + // Set some needed variables. + $this->user = JFactory::getUser(); + $this->table = $this->getTable(); + $this->tableClassName = get_class($this->table); + $this->contentType = new JUcmType; + $this->type = $this->contentType->getTypeByTable($this->tableClassName); + $this->canDo = SupportgroupsHelper::getActions('help_document'); + } + + if (!$this->canDo->get('help_document.edit') && !$this->canDo->get('help_document.batch')) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + return false; + } + + // make sure published only updates if user has the permission. + if (isset($values['published']) && !$this->canDo->get('help_document.edit.state')) + { + unset($values['published']); + } + // remove move_copy from array + unset($values['move_copy']); + + // Parent exists so we proceed + foreach ($pks as $pk) + { + if (!$this->user->authorise('help_document.edit', $contexts[$pk])) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + + return false; + } + + // Check that the row actually exists + if (!$this->table->load($pk)) + { + if ($error = $this->table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + else + { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + // insert all set values. + if (SupportgroupsHelper::checkArray($values)) + { + foreach ($values as $key => $value) + { + // Do special action for access. + if ('access' == $key && strlen($value) > 0) + { + $this->table->$key = $value; + } + elseif (strlen($value) > 0 && isset($this->table->$key)) + { + $this->table->$key = $value; + } + } + } + + + // Check the row. + if (!$this->table->check()) + { + $this->setError($this->table->getError()); + + return false; + } + + if (!empty($this->type)) + { + $this->createTagsHelper($this->tagsObserver, $this->type, $pk, $this->typeAlias, $this->table); + } + + // Store the row. + if (!$this->table->store()) + { + $this->setError($this->table->getError()); + + return false; + } + } + + // Clean the cache + $this->cleanCache(); + + return true; + } + + /** + * Method to save the form data. + * + * @param array $data The form data. + * + * @return boolean True on success. + * + * @since 1.6 + */ + public function save($data) + { + $input = JFactory::getApplication()->input; + $filter = JFilterInput::getInstance(); + + // set the metadata to the Item Data + if (isset($data['metadata']) && isset($data['metadata']['author'])) + { + $data['metadata']['author'] = $filter->clean($data['metadata']['author'], 'TRIM'); + + $metadata = new JRegistry; + $metadata->loadArray($data['metadata']); + $data['metadata'] = (string) $metadata; + } + + // Set the groups string to JSON string. + if (isset($data['groups'])) + { + $data['groups'] = (string) json_encode($data['groups']); + } + + // Set the Params Items to data + if (isset($data['params']) && is_array($data['params'])) + { + $params = new JRegistry; + $params->loadArray($data['params']); + $data['params'] = (string) $params; + } + + // Alter the title for save as copy + if ($input->get('task') == 'save2copy') + { + $origTable = clone $this->getTable(); + $origTable->load($input->getInt('id')); + + if ($data['title'] == $origTable->title) + { + list($title, $alias) = $this->_generateNewTitle($data['alias'], $data['title']); + $data['title'] = $title; + $data['alias'] = $alias; + } + else + { + if ($data['alias'] == $origTable->alias) + { + $data['alias'] = ''; + } + } + + $data['published'] = 0; + } + + // Automatic handling of alias for empty fields + if (in_array($input->get('task'), array('apply', 'save', 'save2new')) && (int) $input->get('id') == 0) + { + if ($data['alias'] == null) + { + if (JFactory::getConfig()->get('unicodeslugs') == 1) + { + $data['alias'] = JFilterOutput::stringURLUnicodeSlug($data['title']); + } + else + { + $data['alias'] = JFilterOutput::stringURLSafe($data['title']); + } + + $table = JTable::getInstance('help_document', 'supportgroupsTable'); + + if ($table->load(array('alias' => $data['alias'])) && ($table->id != $data['id'] || $data['id'] == 0)) + { + $msg = JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_SAVE_WARNING'); + } + + list($title, $alias) = $this->_generateNewTitle($data['alias'], $data['title']); + $data['alias'] = $alias; + + if (isset($msg)) + { + JFactory::getApplication()->enqueueMessage($msg, 'warning'); + } + } + } + + // Alter the uniqe field for save as copy + if ($input->get('task') == 'save2copy') + { + // Automatic handling of other uniqe fields + $uniqeFields = $this->getUniqeFields(); + if (SupportgroupsHelper::checkArray($uniqeFields)) + { + foreach ($uniqeFields as $uniqeField) + { + $data[$uniqeField] = $this->generateUniqe($uniqeField,$data[$uniqeField]); + } + } + } + + if (parent::save($data)) + { + return true; + } + return false; + } + + /** + * Method to generate a uniqe value. + * + * @param string $field name. + * @param string $value data. + * + * @return string New value. + * + * @since 3.0 + */ + protected function generateUniqe($field,$value) + { + + // set field value uniqe + $table = $this->getTable(); + + while ($table->load(array($field => $value))) + { + $value = JString::increment($value); + } + + return $value; + } + + /** + * Method to change the title & alias. + * + * @param string $alias The alias. + * @param string $title The title. + * + * @return array Contains the modified title and alias. + * + */ + protected function _generateNewTitle($alias, $title) + { + + // Alter the title & alias + $table = $this->getTable(); + + while ($table->load(array('alias' => $alias))) + { + $title = JString::increment($title); + $alias = JString::increment($alias, 'dash'); + } + + return array($title, $alias); + } +} diff --git a/admin/models/help_documents.php b/admin/models/help_documents.php new file mode 100644 index 0000000..a9ab8ac --- /dev/null +++ b/admin/models/help_documents.php @@ -0,0 +1,479 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import the Joomla modellist library +jimport('joomla.application.component.modellist'); + +/** + * Help_documents Model + */ +class SupportgroupsModelHelp_documents extends JModelList +{ + public function __construct($config = array()) + { + if (empty($config['filter_fields'])) + { + $config['filter_fields'] = array( + 'a.id','id', + 'a.published','published', + 'a.ordering','ordering', + 'a.created_by','created_by', + 'a.modified_by','modified_by', + 'a.title','title', + 'a.type','type', + 'a.location','location', + 'a.admin_view','admin_view', + 'a.site_view','site_view' + ); + } + + parent::__construct($config); + } + + /** + * Method to auto-populate the model state. + * + * @return void + */ + protected function populateState($ordering = null, $direction = null) + { + $app = JFactory::getApplication(); + + // Adjust the context to support modal layouts. + if ($layout = $app->input->get('layout')) + { + $this->context .= '.' . $layout; + } + $title = $this->getUserStateFromRequest($this->context . '.filter.title', 'filter_title'); + $this->setState('filter.title', $title); + + $type = $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type'); + $this->setState('filter.type', $type); + + $location = $this->getUserStateFromRequest($this->context . '.filter.location', 'filter_location'); + $this->setState('filter.location', $location); + + $admin_view = $this->getUserStateFromRequest($this->context . '.filter.admin_view', 'filter_admin_view'); + $this->setState('filter.admin_view', $admin_view); + + $site_view = $this->getUserStateFromRequest($this->context . '.filter.site_view', 'filter_site_view'); + $this->setState('filter.site_view', $site_view); + + $sorting = $this->getUserStateFromRequest($this->context . '.filter.sorting', 'filter_sorting', 0, 'int'); + $this->setState('filter.sorting', $sorting); + + $access = $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', 0, 'int'); + $this->setState('filter.access', $access); + + $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $published = $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', ''); + $this->setState('filter.published', $published); + + $created_by = $this->getUserStateFromRequest($this->context . '.filter.created_by', 'filter_created_by', ''); + $this->setState('filter.created_by', $created_by); + + $created = $this->getUserStateFromRequest($this->context . '.filter.created', 'filter_created'); + $this->setState('filter.created', $created); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get an array of data items. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getItems() + { + // check in items + $this->checkInNow(); + + // load parent items + $items = parent::getItems(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('help_document.access', 'com_supportgroups.help_document.' . (int) $item->id) && $user->authorise('help_document.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + // decode groups + $groupsArray = json_decode($item->groups, true); + if (SupportgroupsHelper::checkArray($groupsArray)) + { + $groupsNames = ''; + $counter = 0; + foreach ($groupsArray as $groups) + { + if ($counter == 0) + { + $groupsNames .= SupportgroupsHelper::getGroupName($groups); + } + else + { + $groupsNames .= ', '.SupportgroupsHelper::getGroupName($groups); + } + $counter++; + } + $item->groups = $groupsNames; + } + } + } + + // set selection value to a translatable value + if (SupportgroupsHelper::checkArray($items)) + { + foreach ($items as $nr => &$item) + { + // convert type + $item->type = $this->selectionTranslation($item->type, 'type'); + // convert location + $item->location = $this->selectionTranslation($item->location, 'location'); + } + } + + + // return items + return $items; + } + + /** + * Method to convert selection values to translatable string. + * + * @return translatable string + */ + public function selectionTranslation($value,$name) + { + // Array of type language strings + if ($name == 'type') + { + $typeArray = array( + 0 => 'COM_SUPPORTGROUPS_HELP_DOCUMENT_SELECT_AN_OPTION', + 1 => 'COM_SUPPORTGROUPS_HELP_DOCUMENT_JOOMLA_ARTICLE', + 2 => 'COM_SUPPORTGROUPS_HELP_DOCUMENT_TEXT', + 3 => 'COM_SUPPORTGROUPS_HELP_DOCUMENT_URL' + ); + // Now check if value is found in this array + if (isset($typeArray[$value]) && SupportgroupsHelper::checkString($typeArray[$value])) + { + return $typeArray[$value]; + } + } + // Array of location language strings + if ($name == 'location') + { + $locationArray = array( + 1 => 'COM_SUPPORTGROUPS_HELP_DOCUMENT_ADMIN', + 2 => 'COM_SUPPORTGROUPS_HELP_DOCUMENT_SITE' + ); + // Now check if value is found in this array + if (isset($locationArray[$value]) && SupportgroupsHelper::checkString($locationArray[$value])) + { + return $locationArray[$value]; + } + } + return $value; + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + // Get the user object. + $user = JFactory::getUser(); + // Create a new query object. + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + + // Select some fields + $query->select('a.*'); + + // From the supportgroups_item table + $query->from($db->quoteName('#__supportgroups_help_document', 'a')); + + // Filter by published state + $published = $this->getState('filter.published'); + if (is_numeric($published)) + { + $query->where('a.published = ' . (int) $published); + } + elseif ($published === '') + { + $query->where('(a.published = 0 OR a.published = 1)'); + } + + // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + // Filter by access level. + if ($access = $this->getState('filter.access')) + { + $query->where('a.access = ' . (int) $access); + } + // Implement View Level Access + if (!$user->authorise('core.options', 'com_supportgroups')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + // Filter by search. + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where('a.id = ' . (int) substr($search, 3)); + } + else + { + $search = $db->quote('%' . $db->escape($search, true) . '%'); + $query->where('(a.title LIKE '.$search.' OR a.type LIKE '.$search.' OR a.location LIKE '.$search.' OR a.admin_view LIKE '.$search.' OR a.site_view LIKE '.$search.')'); + } + } + + // Filter by Type. + if ($type = $this->getState('filter.type')) + { + $query->where('a.type = ' . $db->quote($db->escape($type, true))); + } + // Filter by Location. + if ($location = $this->getState('filter.location')) + { + $query->where('a.location = ' . $db->quote($db->escape($location, true))); + } + // Filter by Admin_view. + if ($admin_view = $this->getState('filter.admin_view')) + { + $query->where('a.admin_view = ' . $db->quote($db->escape($admin_view, true))); + } + // Filter by Site_view. + if ($site_view = $this->getState('filter.site_view')) + { + $query->where('a.site_view = ' . $db->quote($db->escape($site_view, true))); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'a.id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + if ($orderCol != '') + { + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + } + + return $query; + } + + /** + * Method to get list export data. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getExportData($pks) + { + // setup the query + if (SupportgroupsHelper::checkArray($pks)) + { + // Get the user object. + $user = JFactory::getUser(); + // Create a new query object. + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + + // Select some fields + $query->select('a.*'); + + // From the supportgroups_help_document table + $query->from($db->quoteName('#__supportgroups_help_document', 'a')); + $query->where('a.id IN (' . implode(',',$pks) . ')'); + // Implement View Level Access + if (!$user->authorise('core.options', 'com_supportgroups')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + + // Order the results by ordering + $query->order('a.ordering ASC'); + + // Load the items + $db->setQuery($query); + $db->execute(); + if ($db->getNumRows()) + { + $items = $db->loadObjectList(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('help_document.access', 'com_supportgroups.help_document.' . (int) $item->id) && $user->authorise('help_document.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + // unset the values we don't want exported. + unset($item->asset_id); + unset($item->checked_out); + unset($item->checked_out_time); + } + } + // Add headers to items array. + $headers = $this->getExImPortHeaders(); + if (SupportgroupsHelper::checkObject($headers)) + { + array_unshift($items,$headers); + } + return $items; + } + } + return false; + } + + /** + * Method to get header. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getExImPortHeaders() + { + // Get a db connection. + $db = JFactory::getDbo(); + // get the columns + $columns = $db->getTableColumns("#__supportgroups_help_document"); + if (SupportgroupsHelper::checkArray($columns)) + { + // remove the headers you don't import/export. + unset($columns['asset_id']); + unset($columns['checked_out']); + unset($columns['checked_out_time']); + $headers = new stdClass(); + foreach ($columns as $column => $type) + { + $headers->{$column} = $column; + } + return $headers; + } + return false; + } + + /** + * Method to get a store id based on model configuration state. + * + * @return string A store id. + * + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.id'); + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.published'); + $id .= ':' . $this->getState('filter.ordering'); + $id .= ':' . $this->getState('filter.created_by'); + $id .= ':' . $this->getState('filter.modified_by'); + $id .= ':' . $this->getState('filter.title'); + $id .= ':' . $this->getState('filter.type'); + $id .= ':' . $this->getState('filter.location'); + $id .= ':' . $this->getState('filter.admin_view'); + $id .= ':' . $this->getState('filter.site_view'); + + return parent::getStoreId($id); + } + + /** + * Build an SQL query to checkin all items left checked out longer then a set time. + * + * @return a bool + * + */ + protected function checkInNow() + { + // Get set check in time + $time = JComponentHelper::getParams('com_supportgroups')->get('check_in'); + + if ($time) + { + + // Get a db connection. + $db = JFactory::getDbo(); + // reset query + $query = $db->getQuery(true); + $query->select('*'); + $query->from($db->quoteName('#__supportgroups_help_document')); + $db->setQuery($query); + $db->execute(); + if ($db->getNumRows()) + { + // Get Yesterdays date + $date = JFactory::getDate()->modify($time)->toSql(); + // reset query + $query = $db->getQuery(true); + + // Fields to update. + $fields = array( + $db->quoteName('checked_out_time') . '=\'0000-00-00 00:00:00\'', + $db->quoteName('checked_out') . '=0' + ); + + // Conditions for which records should be updated. + $conditions = array( + $db->quoteName('checked_out') . '!=0', + $db->quoteName('checked_out_time') . '<\''.$date.'\'' + ); + + // Check table + $query->update($db->quoteName('#__supportgroups_help_document'))->set($fields)->where($conditions); + + $db->setQuery($query); + + $db->execute(); + } + } + + return false; + } +} diff --git a/admin/models/location.php b/admin/models/location.php index 5b33a15..ed35ded 100644 --- a/admin/models/location.php +++ b/admin/models/location.php @@ -100,9 +100,98 @@ class SupportgroupsModelLocation extends JModelAdmin $item->tags = new JHelperTags; $item->tags->getTagIds($item->id, 'com_supportgroups.location'); } - } + } + $this->locationvvvw = $item->id; return $item; + } + + /** + * Method to get list data. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getVvwsupport_groups() + { + // Get the user object. + $user = JFactory::getUser(); + // Create a new query object. + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + + // Select some fields + $query->select('a.*'); + + // From the supportgroups_support_group table + $query->from($db->quoteName('#__supportgroups_support_group', 'a')); + + // From the supportgroups_location table. + $query->select($db->quoteName('g.name','location_name')); + $query->join('LEFT', $db->quoteName('#__supportgroups_location', 'g') . ' ON (' . $db->quoteName('a.location') . ' = ' . $db->quoteName('g.id') . ')'); + + // From the supportgroups_clinic table. + $query->select($db->quoteName('h.name','clinic_name')); + $query->join('LEFT', $db->quoteName('#__supportgroups_clinic', 'h') . ' ON (' . $db->quoteName('a.clinic') . ' = ' . $db->quoteName('h.id') . ')'); + + // Filter by locationvvvw global. + $locationvvvw = $this->locationvvvw; + if (is_numeric($locationvvvw )) + { + $query->where('a.location = ' . (int) $locationvvvw ); + } + elseif (is_string($locationvvvw)) + { + $query->where('a.location = ' . $db->quote($locationvvvw)); + } + else + { + $query->where('a.location = -5'); + } + + // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + // Filter by access level. + if ($access = $this->getState('filter.access')) + { + $query->where('a.access = ' . (int) $access); + } + // Implement View Level Access + if (!$user->authorise('core.options', 'com_supportgroups')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + + // Order the results by ordering + $query->order('a.ordering ASC'); + + // Load the items + $db->setQuery($query); + $db->execute(); + if ($db->getNumRows()) + { + $items = $db->loadObjectList(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('support_group.access', 'com_supportgroups.support_group.' . (int) $item->id) && $user->authorise('support_group.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + } + } + return $items; + } + return false; } /** @@ -141,8 +230,8 @@ class SupportgroupsModelLocation extends JModelAdmin // Check for existing item. // Modify the form based on Edit State access controls. - if ($id != 0 && (!$user->authorise('core.edit.state', 'com_supportgroups.location.' . (int) $id)) - || ($id == 0 && !$user->authorise('core.edit.state', 'com_supportgroups'))) + if ($id != 0 && (!$user->authorise('location.edit.state', 'com_supportgroups.location.' . (int) $id)) + || ($id == 0 && !$user->authorise('location.edit.state', 'com_supportgroups'))) { // Disable fields for display. $form->setFieldAttribute('ordering', 'disabled', 'true'); @@ -158,7 +247,8 @@ class SupportgroupsModelLocation extends JModelAdmin $form->setValue('created_by', null, $user->id); } // Modify the form based on Edit Creaded By access controls. - if (!$user->authorise('core.edit.created_by', 'com_supportgroups')) + if ($id != 0 && (!$user->authorise('location.edit.created_by', 'com_supportgroups.location.' . (int) $id)) + || ($id == 0 && !$user->authorise('location.edit.created_by', 'com_supportgroups'))) { // Disable fields for display. $form->setFieldAttribute('created_by', 'disabled', 'true'); @@ -168,7 +258,8 @@ class SupportgroupsModelLocation extends JModelAdmin $form->setFieldAttribute('created_by', 'filter', 'unset'); } // Modify the form based on Edit Creaded Date access controls. - if (!$user->authorise('core.edit.created', 'com_supportgroups')) + if ($id != 0 && (!$user->authorise('location.edit.created', 'com_supportgroups.location.' . (int) $id)) + || ($id == 0 && !$user->authorise('location.edit.created', 'com_supportgroups'))) { // Disable fields for display. $form->setFieldAttribute('created', 'disabled', 'true'); @@ -254,7 +345,7 @@ class SupportgroupsModelLocation extends JModelAdmin $user = JFactory::getUser(); // The record has been set. Check the record permissions. - return $user->authorise('core.delete', 'com_supportgroups.location.' . (int) $record->id); + return $user->authorise('location.delete', 'com_supportgroups.location.' . (int) $record->id); } return false; } @@ -276,14 +367,14 @@ class SupportgroupsModelLocation extends JModelAdmin if ($recordId) { // The record has been set. Check the record permissions. - $permission = $user->authorise('core.edit.state', 'com_supportgroups.location.' . (int) $recordId); + $permission = $user->authorise('location.edit.state', 'com_supportgroups.location.' . (int) $recordId); if (!$permission && !is_null($permission)) { return false; } } // In the absense of better information, revert to the component permissions. - return parent::canEditState($record); + return $user->authorise('location.edit.state', 'com_supportgroups'); } /** @@ -298,8 +389,9 @@ class SupportgroupsModelLocation extends JModelAdmin protected function allowEdit($data = array(), $key = 'id') { // Check specific edit permission then general edit permission. + $user = JFactory::getUser(); - return JFactory::getUser()->authorise('core.edit', 'com_supportgroups.location.'. ((int) isset($data[$key]) ? $data[$key] : 0)) or parent::allowEdit($data, $key); + return $user->authorise('location.edit', 'com_supportgroups.location.'. ((int) isset($data[$key]) ? $data[$key] : 0)) or $user->authorise('location.edit', 'com_supportgroups'); } /** @@ -531,7 +623,7 @@ class SupportgroupsModelLocation extends JModelAdmin $this->canDo = SupportgroupsHelper::getActions('location'); } - if (!$this->canDo->get('core.create') || !$this->canDo->get('core.batch')) + if (!$this->canDo->get('location.create') && !$this->canDo->get('location.batch')) { return false; } @@ -546,7 +638,7 @@ class SupportgroupsModelLocation extends JModelAdmin { $values['published'] = 0; } - elseif (isset($values['published']) && !$this->canDo->get('core.edit.state')) + elseif (isset($values['published']) && !$this->canDo->get('location.edit.state')) { $values['published'] = 0; } @@ -563,7 +655,7 @@ class SupportgroupsModelLocation extends JModelAdmin // only allow copy if user may edit this item. - if (!$this->user->authorise('core.edit', $contexts[$pk])) + if (!$this->user->authorise('location.edit', $contexts[$pk])) { @@ -680,14 +772,14 @@ class SupportgroupsModelLocation extends JModelAdmin $this->canDo = SupportgroupsHelper::getActions('location'); } - if (!$this->canDo->get('core.edit') && !$this->canDo->get('core.batch')) + if (!$this->canDo->get('location.edit') && !$this->canDo->get('location.batch')) { $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); return false; } // make sure published only updates if user has the permission. - if (isset($values['published']) && !$this->canDo->get('core.edit.state')) + if (isset($values['published']) && !$this->canDo->get('location.edit.state')) { unset($values['published']); } @@ -697,7 +789,7 @@ class SupportgroupsModelLocation extends JModelAdmin // Parent exists so we proceed foreach ($pks as $pk) { - if (!$this->user->authorise('core.edit', $contexts[$pk])) + if (!$this->user->authorise('location.edit', $contexts[$pk])) { $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); diff --git a/admin/models/locations.php b/admin/models/locations.php index 367adab..36aa57a 100644 --- a/admin/models/locations.php +++ b/admin/models/locations.php @@ -105,7 +105,24 @@ class SupportgroupsModelLocations extends JModelList $this->checkInNow(); // load parent items - $items = parent::getItems(); + $items = parent::getItems(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('location.access', 'com_supportgroups.location.' . (int) $item->id) && $user->authorise('location.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + } + } // return items return $items; @@ -233,8 +250,17 @@ class SupportgroupsModelLocations extends JModelList // set values to display correctly. if (SupportgroupsHelper::checkArray($items)) { + // get user object. + $user = JFactory::getUser(); foreach ($items as $nr => &$item) { + $access = ($user->authorise('location.access', 'com_supportgroups.location.' . (int) $item->id) && $user->authorise('location.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + // unset the values we don't want exported. unset($item->asset_id); unset($item->checked_out); diff --git a/admin/models/payment.php b/admin/models/payment.php new file mode 100644 index 0000000..bc123e2 --- /dev/null +++ b/admin/models/payment.php @@ -0,0 +1,888 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +use Joomla\Registry\Registry; + +// import Joomla modelform library +jimport('joomla.application.component.modeladmin'); + +/** + * Supportgroups Payment Model + */ +class SupportgroupsModelPayment extends JModelAdmin +{ + /** + * @var string The prefix to use with controller messages. + * @since 1.6 + */ + protected $text_prefix = 'COM_SUPPORTGROUPS'; + + /** + * The type alias for this content type. + * + * @var string + * @since 3.2 + */ + public $typeAlias = 'com_supportgroups.payment'; + + /** + * Returns a Table object, always creating it + * + * @param type $type The table type to instantiate + * @param string $prefix A prefix for the table class name. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return JTable A database object + * + * @since 1.6 + */ + public function getTable($type = 'payment', $prefix = 'SupportgroupsTable', $config = array()) + { + return JTable::getInstance($type, $prefix, $config); + } + + /** + * Method to get a single record. + * + * @param integer $pk The id of the primary key. + * + * @return mixed Object on success, false on failure. + * + * @since 1.6 + */ + public function getItem($pk = null) + { + if ($item = parent::getItem($pk)) + { + if (!empty($item->params)) + { + // Convert the params field to an array. + $registry = new Registry; + $registry->loadString($item->params); + $item->params = $registry->toArray(); + } + + if (!empty($item->metadata)) + { + // Convert the metadata field to an array. + $registry = new Registry; + $registry->loadString($item->metadata); + $item->metadata = $registry->toArray(); + } + + if (!empty($item->id)) + { + $item->tags = new JHelperTags; + $item->tags->getTagIds($item->id, 'com_supportgroups.payment'); + } + } + + return $item; + } + + /** + * Method to get the record form. + * + * @param array $data Data for the form. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return mixed A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getForm($data = array(), $loadData = true) + { // Get the form. + $form = $this->loadForm('com_supportgroups.payment', 'payment', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + $jinput = JFactory::getApplication()->input; + + // The front end calls this model and uses a_id to avoid id clashes so we need to check for that first. + if ($jinput->get('a_id')) + { + $id = $jinput->get('a_id', 0, 'INT'); + } + // The back end uses id so we use that the rest of the time and set it to 0 by default. + else + { + $id = $jinput->get('id', 0, 'INT'); + } + + $user = JFactory::getUser(); + + // Check for existing item. + // Modify the form based on Edit State access controls. + if ($id != 0 && (!$user->authorise('payment.edit.state', 'com_supportgroups.payment.' . (int) $id)) + || ($id == 0 && !$user->authorise('payment.edit.state', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('ordering', 'disabled', 'true'); + $form->setFieldAttribute('published', 'disabled', 'true'); + // Disable fields while saving. + $form->setFieldAttribute('ordering', 'filter', 'unset'); + $form->setFieldAttribute('published', 'filter', 'unset'); + } + // If this is a new item insure the greated by is set. + if (0 == $id) + { + // Set the created_by to this user + $form->setValue('created_by', null, $user->id); + } + // Modify the form based on Edit Creaded By access controls. + if ($id != 0 && (!$user->authorise('payment.edit.created_by', 'com_supportgroups.payment.' . (int) $id)) + || ($id == 0 && !$user->authorise('payment.edit.created_by', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('created_by', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('created_by', 'readonly', 'true'); + // Disable fields while saving. + $form->setFieldAttribute('created_by', 'filter', 'unset'); + } + // Modify the form based on Edit Creaded Date access controls. + if ($id != 0 && (!$user->authorise('payment.edit.created', 'com_supportgroups.payment.' . (int) $id)) + || ($id == 0 && !$user->authorise('payment.edit.created', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('created', 'disabled', 'true'); + // Disable fields while saving. + $form->setFieldAttribute('created', 'filter', 'unset'); + } + // Modify the form based on Edit Support Group access controls. + if ($id != 0 && (!$user->authorise('payment.edit.support_group', 'com_supportgroups.payment.' . (int) $id)) + || ($id == 0 && !$user->authorise('payment.edit.support_group', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('support_group', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('support_group', 'readonly', 'true'); + if (!$form->getValue('support_group')) + { + // Disable fields while saving. + $form->setFieldAttribute('support_group', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('support_group', 'required', 'false'); + } + } + // Modify the form based on Edit Year access controls. + if ($id != 0 && (!$user->authorise('payment.edit.year', 'com_supportgroups.payment.' . (int) $id)) + || ($id == 0 && !$user->authorise('payment.edit.year', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('year', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('year', 'readonly', 'true'); + if (!$form->getValue('year')) + { + // Disable fields while saving. + $form->setFieldAttribute('year', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('year', 'required', 'false'); + } + } + // Modify the form based on Edit Amount access controls. + if ($id != 0 && (!$user->authorise('payment.edit.amount', 'com_supportgroups.payment.' . (int) $id)) + || ($id == 0 && !$user->authorise('payment.edit.amount', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('amount', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('amount', 'readonly', 'true'); + if (!$form->getValue('amount')) + { + // Disable fields while saving. + $form->setFieldAttribute('amount', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('amount', 'required', 'false'); + } + } + // Only load these values if no id is found + if (0 == $id) + { + // Set redirected field name + $redirectedField = $jinput->get('ref', null, 'STRING'); + // Set redirected field value + $redirectedValue = $jinput->get('refid', 0, 'INT'); + if (0 != $redirectedValue && $redirectedField) + { + // Now set the local-redirected field default value + $form->setValue($redirectedField, null, $redirectedValue); + } + } + + return $form; + } + + /** + * Method to get the script that have to be included on the form + * + * @return string script files + */ + public function getScript() + { + return 'administrator/components/com_supportgroups/models/forms/payment.js'; + } + + /** + * Method to test whether a record can be deleted. + * + * @param object $record A record object. + * + * @return boolean True if allowed to delete the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canDelete($record) + { + if (!empty($record->id)) + { + if ($record->published != -2) + { + return; + } + + $user = JFactory::getUser(); + // The record has been set. Check the record permissions. + return $user->authorise('payment.delete', 'com_supportgroups.payment.' . (int) $record->id); + } + return false; + } + + /** + * Method to test whether a record can have its state edited. + * + * @param object $record A record object. + * + * @return boolean True if allowed to change the state of the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canEditState($record) + { + $user = JFactory::getUser(); + $recordId = (!empty($record->id)) ? $record->id : 0; + + if ($recordId) + { + // The record has been set. Check the record permissions. + $permission = $user->authorise('payment.edit.state', 'com_supportgroups.payment.' . (int) $recordId); + if (!$permission && !is_null($permission)) + { + return false; + } + } + // In the absense of better information, revert to the component permissions. + return $user->authorise('payment.edit.state', 'com_supportgroups'); + } + + /** + * Method override to check if you can edit an existing record. + * + * @param array $data An array of input data. + * @param string $key The name of the key for the primary key. + * + * @return boolean + * @since 2.5 + */ + protected function allowEdit($data = array(), $key = 'id') + { + // Check specific edit permission then general edit permission. + $user = JFactory::getUser(); + + return $user->authorise('payment.edit', 'com_supportgroups.payment.'. ((int) isset($data[$key]) ? $data[$key] : 0)) or $user->authorise('payment.edit', 'com_supportgroups'); + } + + /** + * Prepare and sanitise the table data prior to saving. + * + * @param JTable $table A JTable object. + * + * @return void + * + * @since 1.6 + */ + protected function prepareTable($table) + { + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + if (isset($table->name)) + { + $table->name = htmlspecialchars_decode($table->name, ENT_QUOTES); + } + + if (isset($table->alias) && empty($table->alias)) + { + $table->generateAlias(); + } + + if (empty($table->id)) + { + $table->created = $date->toSql(); + // set the user + if ($table->created_by == 0 || empty($table->created_by)) + { + $table->created_by = $user->id; + } + // Set ordering to the last item if not set + if (empty($table->ordering)) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('MAX(ordering)') + ->from($db->quoteName('#__supportgroups_payment')); + $db->setQuery($query); + $max = $db->loadResult(); + + $table->ordering = $max + 1; + } + } + else + { + $table->modified = $date->toSql(); + $table->modified_by = $user->id; + } + + if (!empty($table->id)) + { + // Increment the items version number. + $table->version++; + } + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_supportgroups.edit.payment.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + return $data; + } + + /** + * Method to get the unique fields of this table. + * + * @return mixed An array of field names, boolean false if none is set. + * + * @since 3.0 + */ + protected function getUniqeFields() + { + return false; + } + + /** + * Method to delete one or more records. + * + * @param array &$pks An array of record primary keys. + * + * @return boolean True if successful, false if an error occurs. + * + * @since 12.2 + */ + public function delete(&$pks) + { + if (!parent::delete($pks)) + { + return false; + } + + return true; + } + + /** + * Method to perform batch operations on an item or a set of items. + * + * @param array $commands An array of commands to perform. + * @param array $pks An array of item ids. + * @param array $contexts An array of item contexts. + * + * @return boolean Returns true on success, false on failure. + * + * @since 12.2 + */ + public function batch($commands, $pks, $contexts) + { + // Sanitize ids. + $pks = array_unique($pks); + JArrayHelper::toInteger($pks); + + // Remove any values of zero. + if (array_search(0, $pks, true)) + { + unset($pks[array_search(0, $pks, true)]); + } + + if (empty($pks)) + { + $this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED')); + return false; + } + + $done = false; + + // Set some needed variables. + $this->user = JFactory::getUser(); + $this->table = $this->getTable(); + $this->tableClassName = get_class($this->table); + $this->contentType = new JUcmType; + $this->type = $this->contentType->getTypeByTable($this->tableClassName); + $this->canDo = SupportgroupsHelper::getActions('payment'); + $this->batchSet = true; + + if (!$this->canDo->get('core.batch')) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION')); + return false; + } + + if ($this->type == false) + { + $type = new JUcmType; + $this->type = $type->getTypeByAlias($this->typeAlias); + } + + $this->tagsObserver = $this->table->getObserverOfClass('JTableObserverTags'); + + if (!empty($commands['move_copy'])) + { + $cmd = JArrayHelper::getValue($commands, 'move_copy', 'c'); + + if ($cmd == 'c') + { + $result = $this->batchCopy($commands, $pks, $contexts); + + if (is_array($result)) + { + foreach ($result as $old => $new) + { + $contexts[$new] = $contexts[$old]; + } + $pks = array_values($result); + } + else + { + return false; + } + } + elseif ($cmd == 'm' && !$this->batchMove($commands, $pks, $contexts)) + { + return false; + } + + $done = true; + } + + if (!$done) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION')); + + return false; + } + + // Clear the cache + $this->cleanCache(); + + return true; + } + + /** + * Batch copy items to a new category or current. + * + * @param integer $values The new values. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return mixed An array of new IDs on success, boolean false on failure. + * + * @since 12.2 + */ + protected function batchCopy($values, $pks, $contexts) + { + if (empty($this->batchSet)) + { + // Set some needed variables. + $this->user = JFactory::getUser(); + $this->table = $this->getTable(); + $this->tableClassName = get_class($this->table); + $this->contentType = new JUcmType; + $this->type = $this->contentType->getTypeByTable($this->tableClassName); + $this->canDo = SupportgroupsHelper::getActions('payment'); + } + + if (!$this->canDo->get('payment.create') && !$this->canDo->get('payment.batch')) + { + return false; + } + + // get list of uniqe fields + $uniqeFields = $this->getUniqeFields(); + // remove move_copy from array + unset($values['move_copy']); + + // make sure published is set + if (!isset($values['published'])) + { + $values['published'] = 0; + } + elseif (isset($values['published']) && !$this->canDo->get('payment.edit.state')) + { + $values['published'] = 0; + } + + $newIds = array(); + + // Parent exists so let's proceed + while (!empty($pks)) + { + // Pop the first ID off the stack + $pk = array_shift($pks); + + $this->table->reset(); + + // only allow copy if user may edit this item. + + if (!$this->user->authorise('payment.edit', $contexts[$pk])) + + { + + // Not fatal error + + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + + continue; + + } + + // Check that the row actually exists + if (!$this->table->load($pk)) + { + if ($error = $this->table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + else + { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + $this->table->support_group = $this->generateUniqe('support_group',$this->table->support_group); + + // insert all set values + if (SupportgroupsHelper::checkArray($values)) + { + foreach ($values as $key => $value) + { + if (strlen($value) > 0 && isset($this->table->$key)) + { + $this->table->$key = $value; + } + } + } + + // update all uniqe fields + if (SupportgroupsHelper::checkArray($uniqeFields)) + { + foreach ($uniqeFields as $uniqeField) + { + $this->table->$uniqeField = $this->generateUniqe($uniqeField,$this->table->$uniqeField); + } + } + + // Reset the ID because we are making a copy + $this->table->id = 0; + + // TODO: Deal with ordering? + // $this->table->ordering = 1; + + // Check the row. + if (!$this->table->check()) + { + $this->setError($this->table->getError()); + + return false; + } + + if (!empty($this->type)) + { + $this->createTagsHelper($this->tagsObserver, $this->type, $pk, $this->typeAlias, $this->table); + } + + // Store the row. + if (!$this->table->store()) + { + $this->setError($this->table->getError()); + + return false; + } + + // Get the new item ID + $newId = $this->table->get('id'); + + // Add the new ID to the array + $newIds[$pk] = $newId; + } + + // Clean the cache + $this->cleanCache(); + + return $newIds; + } + + /** + * Batch move items to a new category + * + * @param integer $value The new category ID. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return boolean True if successful, false otherwise and internal error is set. + * + * @since 12.2 + */ + protected function batchMove($values, $pks, $contexts) + { + if (empty($this->batchSet)) + { + // Set some needed variables. + $this->user = JFactory::getUser(); + $this->table = $this->getTable(); + $this->tableClassName = get_class($this->table); + $this->contentType = new JUcmType; + $this->type = $this->contentType->getTypeByTable($this->tableClassName); + $this->canDo = SupportgroupsHelper::getActions('payment'); + } + + if (!$this->canDo->get('payment.edit') && !$this->canDo->get('payment.batch')) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + return false; + } + + // make sure published only updates if user has the permission. + if (isset($values['published']) && !$this->canDo->get('payment.edit.state')) + { + unset($values['published']); + } + // remove move_copy from array + unset($values['move_copy']); + + // Parent exists so we proceed + foreach ($pks as $pk) + { + if (!$this->user->authorise('payment.edit', $contexts[$pk])) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + + return false; + } + + // Check that the row actually exists + if (!$this->table->load($pk)) + { + if ($error = $this->table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + else + { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + // insert all set values. + if (SupportgroupsHelper::checkArray($values)) + { + foreach ($values as $key => $value) + { + // Do special action for access. + if ('access' == $key && strlen($value) > 0) + { + $this->table->$key = $value; + } + elseif (strlen($value) > 0 && isset($this->table->$key)) + { + $this->table->$key = $value; + } + } + } + + + // Check the row. + if (!$this->table->check()) + { + $this->setError($this->table->getError()); + + return false; + } + + if (!empty($this->type)) + { + $this->createTagsHelper($this->tagsObserver, $this->type, $pk, $this->typeAlias, $this->table); + } + + // Store the row. + if (!$this->table->store()) + { + $this->setError($this->table->getError()); + + return false; + } + } + + // Clean the cache + $this->cleanCache(); + + return true; + } + + /** + * Method to save the form data. + * + * @param array $data The form data. + * + * @return boolean True on success. + * + * @since 1.6 + */ + public function save($data) + { + $input = JFactory::getApplication()->input; + $filter = JFilterInput::getInstance(); + + // set the metadata to the Item Data + if (isset($data['metadata']) && isset($data['metadata']['author'])) + { + $data['metadata']['author'] = $filter->clean($data['metadata']['author'], 'TRIM'); + + $metadata = new JRegistry; + $metadata->loadArray($data['metadata']); + $data['metadata'] = (string) $metadata; + } + + // Set the Params Items to data + if (isset($data['params']) && is_array($data['params'])) + { + $params = new JRegistry; + $params->loadArray($data['params']); + $data['params'] = (string) $params; + } + + // Alter the uniqe field for save as copy + if ($input->get('task') == 'save2copy') + { + // Automatic handling of other uniqe fields + $uniqeFields = $this->getUniqeFields(); + if (SupportgroupsHelper::checkArray($uniqeFields)) + { + foreach ($uniqeFields as $uniqeField) + { + $data[$uniqeField] = $this->generateUniqe($uniqeField,$data[$uniqeField]); + } + } + } + + if (parent::save($data)) + { + return true; + } + return false; + } + + /** + * Method to generate a uniqe value. + * + * @param string $field name. + * @param string $value data. + * + * @return string New value. + * + * @since 3.0 + */ + protected function generateUniqe($field,$value) + { + + // set field value uniqe + $table = $this->getTable(); + + while ($table->load(array($field => $value))) + { + $value = JString::increment($value); + } + + return $value; + } + + /** + * Method to change the title & alias. + * + * @param string $title The title. + * + * @return array Contains the modified title and alias. + * + */ + protected function _generateNewTitle($title) + { + + // Alter the title + $table = $this->getTable(); + + while ($table->load(array('title' => $title))) + { + $title = JString::increment($title); + } + + return $title; + } +} diff --git a/admin/models/payments.php b/admin/models/payments.php new file mode 100644 index 0000000..3f322aa --- /dev/null +++ b/admin/models/payments.php @@ -0,0 +1,466 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import the Joomla modellist library +jimport('joomla.application.component.modellist'); + +/** + * Payments Model + */ +class SupportgroupsModelPayments extends JModelList +{ + public function __construct($config = array()) + { + if (empty($config['filter_fields'])) + { + $config['filter_fields'] = array( + 'a.id','id', + 'a.published','published', + 'a.ordering','ordering', + 'a.created_by','created_by', + 'a.modified_by','modified_by', + 'a.support_group','support_group', + 'a.year','year', + 'a.amount','amount' + ); + } + + parent::__construct($config); + } + + /** + * Method to auto-populate the model state. + * + * @return void + */ + protected function populateState($ordering = null, $direction = null) + { + $app = JFactory::getApplication(); + + // Adjust the context to support modal layouts. + if ($layout = $app->input->get('layout')) + { + $this->context .= '.' . $layout; + } + $support_group = $this->getUserStateFromRequest($this->context . '.filter.support_group', 'filter_support_group'); + $this->setState('filter.support_group', $support_group); + + $year = $this->getUserStateFromRequest($this->context . '.filter.year', 'filter_year'); + $this->setState('filter.year', $year); + + $amount = $this->getUserStateFromRequest($this->context . '.filter.amount', 'filter_amount'); + $this->setState('filter.amount', $amount); + + $sorting = $this->getUserStateFromRequest($this->context . '.filter.sorting', 'filter_sorting', 0, 'int'); + $this->setState('filter.sorting', $sorting); + + $access = $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', 0, 'int'); + $this->setState('filter.access', $access); + + $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $published = $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', ''); + $this->setState('filter.published', $published); + + $created_by = $this->getUserStateFromRequest($this->context . '.filter.created_by', 'filter_created_by', ''); + $this->setState('filter.created_by', $created_by); + + $created = $this->getUserStateFromRequest($this->context . '.filter.created', 'filter_created'); + $this->setState('filter.created', $created); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get an array of data items. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getItems() + { + // check in items + $this->checkInNow(); + + // load parent items + $items = parent::getItems(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('payment.access', 'com_supportgroups.payment.' . (int) $item->id) && $user->authorise('payment.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + } + } + + // Try Convert the Amount to the Currency value + if (SupportgroupsHelper::checkArray($items)) + { + foreach ($items as $nr => &$item) + { + // convert to currency here + $item->amount = SupportgroupsHelper::setCurrency($item->amount, $item->support_group); + } + } + + // set selection value to a translatable value + if (SupportgroupsHelper::checkArray($items)) + { + foreach ($items as $nr => &$item) + { + // convert year + $item->year = $this->selectionTranslation($item->year, 'year'); + } + } + + + // return items + return $items; + } + + /** + * Method to convert selection values to translatable string. + * + * @return translatable string + */ + public function selectionTranslation($value,$name) + { + // Array of year language strings + if ($name == 'year') + { + $yearArray = array( + 0 => 'COM_SUPPORTGROUPS_PAYMENT_SELECT_A_YEAR', + 2010 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TEN', + 2011 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_ELEVEN', + 2012 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWELVE', + 2013 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_THIRTEEN', + 2014 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_FOURTEEN', + 2015 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_FIFTEEN', + 2016 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_SIXTEEN', + 2017 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_SEVENTEEN', + 2018 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_EIGHTEEN', + 2019 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_NINETEEN', + 2020 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY', + 2021 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_ONE', + 2022 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_TWO', + 2023 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_THREE', + 2024 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_FOUR', + 2025 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_FIVE', + 2026 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_SIX', + 2027 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_SEVEN', + 2028 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_EIGHT', + 2029 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_NINE', + 2030 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_THIRTY' + ); + // Now check if value is found in this array + if (isset($yearArray[$value]) && SupportgroupsHelper::checkString($yearArray[$value])) + { + return $yearArray[$value]; + } + } + return $value; + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + // Get the user object. + $user = JFactory::getUser(); + // Create a new query object. + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + + // Select some fields + $query->select('a.*'); + + // From the supportgroups_item table + $query->from($db->quoteName('#__supportgroups_payment', 'a')); + + // From the supportgroups_support_group table. + $query->select($db->quoteName('g.name','support_group_name')); + $query->join('LEFT', $db->quoteName('#__supportgroups_support_group', 'g') . ' ON (' . $db->quoteName('a.support_group') . ' = ' . $db->quoteName('g.id') . ')'); + + // Filter by published state + $published = $this->getState('filter.published'); + if (is_numeric($published)) + { + $query->where('a.published = ' . (int) $published); + } + elseif ($published === '') + { + $query->where('(a.published = 0 OR a.published = 1)'); + } + + // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + // Filter by access level. + if ($access = $this->getState('filter.access')) + { + $query->where('a.access = ' . (int) $access); + } + // Implement View Level Access + if (!$user->authorise('core.options', 'com_supportgroups')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + // Filter by search. + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where('a.id = ' . (int) substr($search, 3)); + } + else + { + $search = $db->quote('%' . $db->escape($search, true) . '%'); + $query->where('(a.support_group LIKE '.$search.' OR g.name LIKE '.$search.' OR a.year LIKE '.$search.' OR a.amount LIKE '.$search.')'); + } + } + + // Filter by support_group. + if ($support_group = $this->getState('filter.support_group')) + { + $query->where('a.support_group = ' . $db->quote($db->escape($support_group, true))); + } + // Filter by Year. + if ($year = $this->getState('filter.year')) + { + $query->where('a.year = ' . $db->quote($db->escape($year, true))); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'a.id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + if ($orderCol != '') + { + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + } + + return $query; + } + + /** + * Method to get list export data. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getExportData($pks) + { + // setup the query + if (SupportgroupsHelper::checkArray($pks)) + { + // Get the user object. + $user = JFactory::getUser(); + // Create a new query object. + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + + // Select some fields + $query->select('a.*'); + + // From the supportgroups_payment table + $query->from($db->quoteName('#__supportgroups_payment', 'a')); + $query->where('a.id IN (' . implode(',',$pks) . ')'); + // Implement View Level Access + if (!$user->authorise('core.options', 'com_supportgroups')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + + // Order the results by ordering + $query->order('a.ordering ASC'); + + // Load the items + $db->setQuery($query); + $db->execute(); + if ($db->getNumRows()) + { + $items = $db->loadObjectList(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('payment.access', 'com_supportgroups.payment.' . (int) $item->id) && $user->authorise('payment.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + // unset the values we don't want exported. + unset($item->asset_id); + unset($item->checked_out); + unset($item->checked_out_time); + } + } + // Add headers to items array. + $headers = $this->getExImPortHeaders(); + if (SupportgroupsHelper::checkObject($headers)) + { + array_unshift($items,$headers); + } + + // Try Convert the Amount to the Currency value + if (SupportgroupsHelper::checkArray($items)) + { + foreach ($items as $nr => &$item) + { + // convert to currency here + $item->amount = SupportgroupsHelper::setCurrency($item->amount, $item->support_group); + } + } + return $items; + } + } + return false; + } + + /** + * Method to get header. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getExImPortHeaders() + { + // Get a db connection. + $db = JFactory::getDbo(); + // get the columns + $columns = $db->getTableColumns("#__supportgroups_payment"); + if (SupportgroupsHelper::checkArray($columns)) + { + // remove the headers you don't import/export. + unset($columns['asset_id']); + unset($columns['checked_out']); + unset($columns['checked_out_time']); + $headers = new stdClass(); + foreach ($columns as $column => $type) + { + $headers->{$column} = $column; + } + return $headers; + } + return false; + } + + /** + * Method to get a store id based on model configuration state. + * + * @return string A store id. + * + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.id'); + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.published'); + $id .= ':' . $this->getState('filter.ordering'); + $id .= ':' . $this->getState('filter.created_by'); + $id .= ':' . $this->getState('filter.modified_by'); + $id .= ':' . $this->getState('filter.support_group'); + $id .= ':' . $this->getState('filter.year'); + $id .= ':' . $this->getState('filter.amount'); + + return parent::getStoreId($id); + } + + /** + * Build an SQL query to checkin all items left checked out longer then a set time. + * + * @return a bool + * + */ + protected function checkInNow() + { + // Get set check in time + $time = JComponentHelper::getParams('com_supportgroups')->get('check_in'); + + if ($time) + { + + // Get a db connection. + $db = JFactory::getDbo(); + // reset query + $query = $db->getQuery(true); + $query->select('*'); + $query->from($db->quoteName('#__supportgroups_payment')); + $db->setQuery($query); + $db->execute(); + if ($db->getNumRows()) + { + // Get Yesterdays date + $date = JFactory::getDate()->modify($time)->toSql(); + // reset query + $query = $db->getQuery(true); + + // Fields to update. + $fields = array( + $db->quoteName('checked_out_time') . '=\'0000-00-00 00:00:00\'', + $db->quoteName('checked_out') . '=0' + ); + + // Conditions for which records should be updated. + $conditions = array( + $db->quoteName('checked_out') . '!=0', + $db->quoteName('checked_out_time') . '<\''.$date.'\'' + ); + + // Check table + $query->update($db->quoteName('#__supportgroups_payment'))->set($fields)->where($conditions); + + $db->setQuery($query); + + $db->execute(); + } + } + + return false; + } +} diff --git a/admin/models/region.php b/admin/models/region.php index 38ec27e..e80060c 100644 --- a/admin/models/region.php +++ b/admin/models/region.php @@ -100,9 +100,94 @@ class SupportgroupsModelRegion extends JModelAdmin $item->tags = new JHelperTags; $item->tags->getTagIds($item->id, 'com_supportgroups.region'); } - } + } + $this->regionvvvx = $item->id; return $item; + } + + /** + * Method to get list data. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getVvxlocations() + { + // Get the user object. + $user = JFactory::getUser(); + // Create a new query object. + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + + // Select some fields + $query->select('a.*'); + + // From the supportgroups_location table + $query->from($db->quoteName('#__supportgroups_location', 'a')); + + // From the supportgroups_region table. + $query->select($db->quoteName('g.name','region_name')); + $query->join('LEFT', $db->quoteName('#__supportgroups_region', 'g') . ' ON (' . $db->quoteName('a.region') . ' = ' . $db->quoteName('g.id') . ')'); + + // Filter by regionvvvx global. + $regionvvvx = $this->regionvvvx; + if (is_numeric($regionvvvx )) + { + $query->where('a.region = ' . (int) $regionvvvx ); + } + elseif (is_string($regionvvvx)) + { + $query->where('a.region = ' . $db->quote($regionvvvx)); + } + else + { + $query->where('a.region = -5'); + } + + // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + // Filter by access level. + if ($access = $this->getState('filter.access')) + { + $query->where('a.access = ' . (int) $access); + } + // Implement View Level Access + if (!$user->authorise('core.options', 'com_supportgroups')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + + // Order the results by ordering + $query->order('a.ordering ASC'); + + // Load the items + $db->setQuery($query); + $db->execute(); + if ($db->getNumRows()) + { + $items = $db->loadObjectList(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('location.access', 'com_supportgroups.location.' . (int) $item->id) && $user->authorise('location.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + } + } + return $items; + } + return false; } /** @@ -141,8 +226,8 @@ class SupportgroupsModelRegion extends JModelAdmin // Check for existing item. // Modify the form based on Edit State access controls. - if ($id != 0 && (!$user->authorise('core.edit.state', 'com_supportgroups.region.' . (int) $id)) - || ($id == 0 && !$user->authorise('core.edit.state', 'com_supportgroups'))) + if ($id != 0 && (!$user->authorise('region.edit.state', 'com_supportgroups.region.' . (int) $id)) + || ($id == 0 && !$user->authorise('region.edit.state', 'com_supportgroups'))) { // Disable fields for display. $form->setFieldAttribute('ordering', 'disabled', 'true'); @@ -158,7 +243,8 @@ class SupportgroupsModelRegion extends JModelAdmin $form->setValue('created_by', null, $user->id); } // Modify the form based on Edit Creaded By access controls. - if (!$user->authorise('core.edit.created_by', 'com_supportgroups')) + if ($id != 0 && (!$user->authorise('region.edit.created_by', 'com_supportgroups.region.' . (int) $id)) + || ($id == 0 && !$user->authorise('region.edit.created_by', 'com_supportgroups'))) { // Disable fields for display. $form->setFieldAttribute('created_by', 'disabled', 'true'); @@ -168,7 +254,8 @@ class SupportgroupsModelRegion extends JModelAdmin $form->setFieldAttribute('created_by', 'filter', 'unset'); } // Modify the form based on Edit Creaded Date access controls. - if (!$user->authorise('core.edit.created', 'com_supportgroups')) + if ($id != 0 && (!$user->authorise('region.edit.created', 'com_supportgroups.region.' . (int) $id)) + || ($id == 0 && !$user->authorise('region.edit.created', 'com_supportgroups'))) { // Disable fields for display. $form->setFieldAttribute('created', 'disabled', 'true'); @@ -254,7 +341,7 @@ class SupportgroupsModelRegion extends JModelAdmin $user = JFactory::getUser(); // The record has been set. Check the record permissions. - return $user->authorise('core.delete', 'com_supportgroups.region.' . (int) $record->id); + return $user->authorise('region.delete', 'com_supportgroups.region.' . (int) $record->id); } return false; } @@ -276,14 +363,14 @@ class SupportgroupsModelRegion extends JModelAdmin if ($recordId) { // The record has been set. Check the record permissions. - $permission = $user->authorise('core.edit.state', 'com_supportgroups.region.' . (int) $recordId); + $permission = $user->authorise('region.edit.state', 'com_supportgroups.region.' . (int) $recordId); if (!$permission && !is_null($permission)) { return false; } } // In the absense of better information, revert to the component permissions. - return parent::canEditState($record); + return $user->authorise('region.edit.state', 'com_supportgroups'); } /** @@ -298,8 +385,9 @@ class SupportgroupsModelRegion extends JModelAdmin protected function allowEdit($data = array(), $key = 'id') { // Check specific edit permission then general edit permission. + $user = JFactory::getUser(); - return JFactory::getUser()->authorise('core.edit', 'com_supportgroups.region.'. ((int) isset($data[$key]) ? $data[$key] : 0)) or parent::allowEdit($data, $key); + return $user->authorise('region.edit', 'com_supportgroups.region.'. ((int) isset($data[$key]) ? $data[$key] : 0)) or $user->authorise('region.edit', 'com_supportgroups'); } /** @@ -531,7 +619,7 @@ class SupportgroupsModelRegion extends JModelAdmin $this->canDo = SupportgroupsHelper::getActions('region'); } - if (!$this->canDo->get('core.create') || !$this->canDo->get('core.batch')) + if (!$this->canDo->get('region.create') && !$this->canDo->get('region.batch')) { return false; } @@ -546,7 +634,7 @@ class SupportgroupsModelRegion extends JModelAdmin { $values['published'] = 0; } - elseif (isset($values['published']) && !$this->canDo->get('core.edit.state')) + elseif (isset($values['published']) && !$this->canDo->get('region.edit.state')) { $values['published'] = 0; } @@ -563,7 +651,7 @@ class SupportgroupsModelRegion extends JModelAdmin // only allow copy if user may edit this item. - if (!$this->user->authorise('core.edit', $contexts[$pk])) + if (!$this->user->authorise('region.edit', $contexts[$pk])) { @@ -680,14 +768,14 @@ class SupportgroupsModelRegion extends JModelAdmin $this->canDo = SupportgroupsHelper::getActions('region'); } - if (!$this->canDo->get('core.edit') && !$this->canDo->get('core.batch')) + if (!$this->canDo->get('region.edit') && !$this->canDo->get('region.batch')) { $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); return false; } // make sure published only updates if user has the permission. - if (isset($values['published']) && !$this->canDo->get('core.edit.state')) + if (isset($values['published']) && !$this->canDo->get('region.edit.state')) { unset($values['published']); } @@ -697,7 +785,7 @@ class SupportgroupsModelRegion extends JModelAdmin // Parent exists so we proceed foreach ($pks as $pk) { - if (!$this->user->authorise('core.edit', $contexts[$pk])) + if (!$this->user->authorise('region.edit', $contexts[$pk])) { $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); diff --git a/admin/models/regions.php b/admin/models/regions.php index 53f0d43..e1e19f0 100644 --- a/admin/models/regions.php +++ b/admin/models/regions.php @@ -105,7 +105,24 @@ class SupportgroupsModelRegions extends JModelList $this->checkInNow(); // load parent items - $items = parent::getItems(); + $items = parent::getItems(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('region.access', 'com_supportgroups.region.' . (int) $item->id) && $user->authorise('region.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + } + } // return items return $items; @@ -233,8 +250,17 @@ class SupportgroupsModelRegions extends JModelList // set values to display correctly. if (SupportgroupsHelper::checkArray($items)) { + // get user object. + $user = JFactory::getUser(); foreach ($items as $nr => &$item) { + $access = ($user->authorise('region.access', 'com_supportgroups.region.' . (int) $item->id) && $user->authorise('region.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + // unset the values we don't want exported. unset($item->asset_id); unset($item->checked_out); diff --git a/admin/models/support_group.php b/admin/models/support_group.php index e3bfd5a..6c237ef 100644 --- a/admin/models/support_group.php +++ b/admin/models/support_group.php @@ -100,9 +100,158 @@ class SupportgroupsModelSupport_group extends JModelAdmin $item->tags = new JHelperTags; $item->tags->getTagIds($item->id, 'com_supportgroups.support_group'); } - } + } + $this->support_groupvvvv = $item->id; return $item; + } + + /** + * Method to get list data. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getVvvpayments() + { + // Get the user object. + $user = JFactory::getUser(); + // Create a new query object. + $db = JFactory::getDBO(); + $query = $db->getQuery(true); + + // Select some fields + $query->select('a.*'); + + // From the supportgroups_payment table + $query->from($db->quoteName('#__supportgroups_payment', 'a')); + + // From the supportgroups_support_group table. + $query->select($db->quoteName('g.name','support_group_name')); + $query->join('LEFT', $db->quoteName('#__supportgroups_support_group', 'g') . ' ON (' . $db->quoteName('a.support_group') . ' = ' . $db->quoteName('g.id') . ')'); + + // Filter by support_groupvvvv global. + $support_groupvvvv = $this->support_groupvvvv; + if (is_numeric($support_groupvvvv )) + { + $query->where('a.support_group = ' . (int) $support_groupvvvv ); + } + elseif (is_string($support_groupvvvv)) + { + $query->where('a.support_group = ' . $db->quote($support_groupvvvv)); + } + else + { + $query->where('a.support_group = -5'); + } + + // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + // Filter by access level. + if ($access = $this->getState('filter.access')) + { + $query->where('a.access = ' . (int) $access); + } + // Implement View Level Access + if (!$user->authorise('core.options', 'com_supportgroups')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + + // Order the results by ordering + $query->order('a.ordering ASC'); + + // Load the items + $db->setQuery($query); + $db->execute(); + if ($db->getNumRows()) + { + $items = $db->loadObjectList(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('payment.access', 'com_supportgroups.payment.' . (int) $item->id) && $user->authorise('payment.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + } + } + + // Try Convert the Amount to the Currency value + if (SupportgroupsHelper::checkArray($items)) + { + foreach ($items as $nr => &$item) + { + // convert to currency here + $item->amount = SupportgroupsHelper::setCurrency($item->amount, $item->support_group); + } + } + + // set selection value to a translatable value + if (SupportgroupsHelper::checkArray($items)) + { + foreach ($items as $nr => &$item) + { + // convert year + $item->year = $this->selectionTranslationVvvpayments($item->year, 'year'); + } + } + + return $items; + } + return false; + } + + /** + * Method to convert selection values to translatable string. + * + * @return translatable string + */ + public function selectionTranslationVvvpayments($value,$name) + { + // Array of year language strings + if ($name == 'year') + { + $yearArray = array( + 0 => 'COM_SUPPORTGROUPS_PAYMENT_SELECT_A_YEAR', + 2010 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TEN', + 2011 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_ELEVEN', + 2012 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWELVE', + 2013 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_THIRTEEN', + 2014 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_FOURTEEN', + 2015 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_FIFTEEN', + 2016 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_SIXTEEN', + 2017 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_SEVENTEEN', + 2018 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_EIGHTEEN', + 2019 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_NINETEEN', + 2020 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY', + 2021 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_ONE', + 2022 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_TWO', + 2023 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_THREE', + 2024 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_FOUR', + 2025 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_FIVE', + 2026 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_SIX', + 2027 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_SEVEN', + 2028 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_EIGHT', + 2029 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_TWENTY_NINE', + 2030 => 'COM_SUPPORTGROUPS_PAYMENT_TWO_THOUSAND_AND_THIRTY' + ); + // Now check if value is found in this array + if (isset($yearArray[$value]) && SupportgroupsHelper::checkString($yearArray[$value])) + { + return $yearArray[$value]; + } + } + return $value; } /** @@ -141,8 +290,8 @@ class SupportgroupsModelSupport_group extends JModelAdmin // Check for existing item. // Modify the form based on Edit State access controls. - if ($id != 0 && (!$user->authorise('core.edit.state', 'com_supportgroups.support_group.' . (int) $id)) - || ($id == 0 && !$user->authorise('core.edit.state', 'com_supportgroups'))) + if ($id != 0 && (!$user->authorise('support_group.edit.state', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.state', 'com_supportgroups'))) { // Disable fields for display. $form->setFieldAttribute('ordering', 'disabled', 'true'); @@ -158,7 +307,8 @@ class SupportgroupsModelSupport_group extends JModelAdmin $form->setValue('created_by', null, $user->id); } // Modify the form based on Edit Creaded By access controls. - if (!$user->authorise('core.edit.created_by', 'com_supportgroups')) + if ($id != 0 && (!$user->authorise('support_group.edit.created_by', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.created_by', 'com_supportgroups'))) { // Disable fields for display. $form->setFieldAttribute('created_by', 'disabled', 'true'); @@ -168,7 +318,8 @@ class SupportgroupsModelSupport_group extends JModelAdmin $form->setFieldAttribute('created_by', 'filter', 'unset'); } // Modify the form based on Edit Creaded Date access controls. - if (!$user->authorise('core.edit.created', 'com_supportgroups')) + if ($id != 0 && (!$user->authorise('support_group.edit.created', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.created', 'com_supportgroups'))) { // Disable fields for display. $form->setFieldAttribute('created', 'disabled', 'true'); @@ -191,6 +342,134 @@ class SupportgroupsModelSupport_group extends JModelAdmin $form->setFieldAttribute('name', 'required', 'false'); } } + // Modify the form based on Edit Phone access controls. + if ($id != 0 && (!$user->authorise('support_group.edit.phone', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.phone', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('phone', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('phone', 'readonly', 'true'); + if (!$form->getValue('phone')) + { + // Disable fields while saving. + $form->setFieldAttribute('phone', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('phone', 'required', 'false'); + } + } + // Modify the form based on Edit Location access controls. + if ($id != 0 && (!$user->authorise('support_group.edit.location', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.location', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('location', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('location', 'readonly', 'true'); + if (!$form->getValue('location')) + { + // Disable fields while saving. + $form->setFieldAttribute('location', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('location', 'required', 'false'); + } + } + // Modify the form based on Edit Clinic access controls. + if ($id != 0 && (!$user->authorise('support_group.edit.clinic', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.clinic', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('clinic', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('clinic', 'readonly', 'true'); + if (!$form->getValue('clinic')) + { + // Disable fields while saving. + $form->setFieldAttribute('clinic', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('clinic', 'required', 'false'); + } + } + // Modify the form based on Edit Male access controls. + if ($id != 0 && (!$user->authorise('support_group.edit.male', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.male', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('male', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('male', 'readonly', 'true'); + if (!$form->getValue('male')) + { + // Disable fields while saving. + $form->setFieldAttribute('male', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('male', 'required', 'false'); + } + } + // Modify the form based on Edit Female access controls. + if ($id != 0 && (!$user->authorise('support_group.edit.female', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.female', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('female', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('female', 'readonly', 'true'); + if (!$form->getValue('female')) + { + // Disable fields while saving. + $form->setFieldAttribute('female', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('female', 'required', 'false'); + } + } + // Modify the form based on Edit Female Art access controls. + if ($id != 0 && (!$user->authorise('support_group.edit.female_art', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.female_art', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('female_art', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('female_art', 'readonly', 'true'); + if (!$form->getValue('female_art')) + { + // Disable fields while saving. + $form->setFieldAttribute('female_art', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('female_art', 'required', 'false'); + } + } + // Modify the form based on Edit Male Art access controls. + if ($id != 0 && (!$user->authorise('support_group.edit.male_art', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.male_art', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('male_art', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('male_art', 'readonly', 'true'); + if (!$form->getValue('male_art')) + { + // Disable fields while saving. + $form->setFieldAttribute('male_art', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('male_art', 'required', 'false'); + } + } + // Modify the form based on Edit Male Children access controls. + if ($id != 0 && (!$user->authorise('support_group.edit.male_children', 'com_supportgroups.support_group.' . (int) $id)) + || ($id == 0 && !$user->authorise('support_group.edit.male_children', 'com_supportgroups'))) + { + // Disable fields for display. + $form->setFieldAttribute('male_children', 'disabled', 'true'); + // Disable fields for display. + $form->setFieldAttribute('male_children', 'readonly', 'true'); + if (!$form->getValue('male_children')) + { + // Disable fields while saving. + $form->setFieldAttribute('male_children', 'filter', 'unset'); + // Disable fields while saving. + $form->setFieldAttribute('male_children', 'required', 'false'); + } + } // Only load these values if no id is found if (0 == $id) { @@ -238,7 +517,7 @@ class SupportgroupsModelSupport_group extends JModelAdmin $user = JFactory::getUser(); // The record has been set. Check the record permissions. - return $user->authorise('core.delete', 'com_supportgroups.support_group.' . (int) $record->id); + return $user->authorise('support_group.delete', 'com_supportgroups.support_group.' . (int) $record->id); } return false; } @@ -260,14 +539,14 @@ class SupportgroupsModelSupport_group extends JModelAdmin if ($recordId) { // The record has been set. Check the record permissions. - $permission = $user->authorise('core.edit.state', 'com_supportgroups.support_group.' . (int) $recordId); + $permission = $user->authorise('support_group.edit.state', 'com_supportgroups.support_group.' . (int) $recordId); if (!$permission && !is_null($permission)) { return false; } } // In the absense of better information, revert to the component permissions. - return parent::canEditState($record); + return $user->authorise('support_group.edit.state', 'com_supportgroups'); } /** @@ -282,8 +561,9 @@ class SupportgroupsModelSupport_group extends JModelAdmin protected function allowEdit($data = array(), $key = 'id') { // Check specific edit permission then general edit permission. + $user = JFactory::getUser(); - return JFactory::getUser()->authorise('core.edit', 'com_supportgroups.support_group.'. ((int) isset($data[$key]) ? $data[$key] : 0)) or parent::allowEdit($data, $key); + return $user->authorise('support_group.edit', 'com_supportgroups.support_group.'. ((int) isset($data[$key]) ? $data[$key] : 0)) or $user->authorise('support_group.edit', 'com_supportgroups'); } /** @@ -515,7 +795,7 @@ class SupportgroupsModelSupport_group extends JModelAdmin $this->canDo = SupportgroupsHelper::getActions('support_group'); } - if (!$this->canDo->get('core.create') || !$this->canDo->get('core.batch')) + if (!$this->canDo->get('support_group.create') && !$this->canDo->get('support_group.batch')) { return false; } @@ -530,7 +810,7 @@ class SupportgroupsModelSupport_group extends JModelAdmin { $values['published'] = 0; } - elseif (isset($values['published']) && !$this->canDo->get('core.edit.state')) + elseif (isset($values['published']) && !$this->canDo->get('support_group.edit.state')) { $values['published'] = 0; } @@ -547,7 +827,7 @@ class SupportgroupsModelSupport_group extends JModelAdmin // only allow copy if user may edit this item. - if (!$this->user->authorise('core.edit', $contexts[$pk])) + if (!$this->user->authorise('support_group.edit', $contexts[$pk])) { @@ -664,14 +944,14 @@ class SupportgroupsModelSupport_group extends JModelAdmin $this->canDo = SupportgroupsHelper::getActions('support_group'); } - if (!$this->canDo->get('core.edit') && !$this->canDo->get('core.batch')) + if (!$this->canDo->get('support_group.edit') && !$this->canDo->get('support_group.batch')) { $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); return false; } // make sure published only updates if user has the permission. - if (isset($values['published']) && !$this->canDo->get('core.edit.state')) + if (isset($values['published']) && !$this->canDo->get('support_group.edit.state')) { unset($values['published']); } @@ -681,7 +961,7 @@ class SupportgroupsModelSupport_group extends JModelAdmin // Parent exists so we proceed foreach ($pks as $pk) { - if (!$this->user->authorise('core.edit', $contexts[$pk])) + if (!$this->user->authorise('support_group.edit', $contexts[$pk])) { $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); diff --git a/admin/models/support_groups.php b/admin/models/support_groups.php index cf55bf3..b7a4285 100644 --- a/admin/models/support_groups.php +++ b/admin/models/support_groups.php @@ -44,7 +44,12 @@ class SupportgroupsModelSupport_groups extends JModelList 'a.ordering','ordering', 'a.created_by','created_by', 'a.modified_by','modified_by', - 'a.name','name' + 'a.name','name', + 'a.phone','phone', + 'a.location','location', + 'a.clinic','clinic', + 'a.male','male', + 'a.female','female' ); } @@ -66,7 +71,22 @@ class SupportgroupsModelSupport_groups extends JModelList $this->context .= '.' . $layout; } $name = $this->getUserStateFromRequest($this->context . '.filter.name', 'filter_name'); - $this->setState('filter.name', $name); + $this->setState('filter.name', $name); + + $phone = $this->getUserStateFromRequest($this->context . '.filter.phone', 'filter_phone'); + $this->setState('filter.phone', $phone); + + $location = $this->getUserStateFromRequest($this->context . '.filter.location', 'filter_location'); + $this->setState('filter.location', $location); + + $clinic = $this->getUserStateFromRequest($this->context . '.filter.clinic', 'filter_clinic'); + $this->setState('filter.clinic', $clinic); + + $male = $this->getUserStateFromRequest($this->context . '.filter.male', 'filter_male'); + $this->setState('filter.male', $male); + + $female = $this->getUserStateFromRequest($this->context . '.filter.female', 'filter_female'); + $this->setState('filter.female', $female); $sorting = $this->getUserStateFromRequest($this->context . '.filter.sorting', 'filter_sorting', 0, 'int'); $this->setState('filter.sorting', $sorting); @@ -101,7 +121,24 @@ class SupportgroupsModelSupport_groups extends JModelList $this->checkInNow(); // load parent items - $items = parent::getItems(); + $items = parent::getItems(); + + // set values to display correctly. + if (SupportgroupsHelper::checkArray($items)) + { + // get user object. + $user = JFactory::getUser(); + foreach ($items as $nr => &$item) + { + $access = ($user->authorise('support_group.access', 'com_supportgroups.support_group.' . (int) $item->id) && $user->authorise('support_group.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + + } + } // return items return $items; @@ -126,6 +163,14 @@ class SupportgroupsModelSupport_groups extends JModelList // From the supportgroups_item table $query->from($db->quoteName('#__supportgroups_support_group', 'a')); + // From the supportgroups_location table. + $query->select($db->quoteName('g.name','location_name')); + $query->join('LEFT', $db->quoteName('#__supportgroups_location', 'g') . ' ON (' . $db->quoteName('a.location') . ' = ' . $db->quoteName('g.id') . ')'); + + // From the supportgroups_clinic table. + $query->select($db->quoteName('h.name','clinic_name')); + $query->join('LEFT', $db->quoteName('#__supportgroups_clinic', 'h') . ' ON (' . $db->quoteName('a.clinic') . ' = ' . $db->quoteName('h.id') . ')'); + // Filter by published state $published = $this->getState('filter.published'); if (is_numeric($published)) @@ -162,10 +207,20 @@ class SupportgroupsModelSupport_groups extends JModelList else { $search = $db->quote('%' . $db->escape($search, true) . '%'); - $query->where('(a.name LIKE '.$search.')'); + $query->where('(a.name LIKE '.$search.' OR a.phone LIKE '.$search.' OR a.location LIKE '.$search.' OR g.name LIKE '.$search.' OR a.clinic LIKE '.$search.' OR h.name LIKE '.$search.')'); } } + // Filter by location. + if ($location = $this->getState('filter.location')) + { + $query->where('a.location = ' . $db->quote($db->escape($location, true))); + } + // Filter by clinic. + if ($clinic = $this->getState('filter.clinic')) + { + $query->where('a.clinic = ' . $db->quote($db->escape($clinic, true))); + } // Add the list ordering clause. $orderCol = $this->state->get('list.ordering', 'a.id'); @@ -220,8 +275,17 @@ class SupportgroupsModelSupport_groups extends JModelList // set values to display correctly. if (SupportgroupsHelper::checkArray($items)) { + // get user object. + $user = JFactory::getUser(); foreach ($items as $nr => &$item) { + $access = ($user->authorise('support_group.access', 'com_supportgroups.support_group.' . (int) $item->id) && $user->authorise('support_group.access', 'com_supportgroups')); + if (!$access) + { + unset($items[$nr]); + continue; + } + // unset the values we don't want exported. unset($item->asset_id); unset($item->checked_out); @@ -282,7 +346,12 @@ class SupportgroupsModelSupport_groups extends JModelList $id .= ':' . $this->getState('filter.ordering'); $id .= ':' . $this->getState('filter.created_by'); $id .= ':' . $this->getState('filter.modified_by'); - $id .= ':' . $this->getState('filter.name'); + $id .= ':' . $this->getState('filter.name'); + $id .= ':' . $this->getState('filter.phone'); + $id .= ':' . $this->getState('filter.location'); + $id .= ':' . $this->getState('filter.clinic'); + $id .= ':' . $this->getState('filter.male'); + $id .= ':' . $this->getState('filter.female'); return parent::getStoreId($id); } diff --git a/admin/models/supportgroups.php b/admin/models/supportgroups.php index 8737ed0..60a23e1 100644 --- a/admin/models/supportgroups.php +++ b/admin/models/supportgroups.php @@ -43,29 +43,52 @@ class SupportgroupsModelSupportgroups extends JModelList $icons = array(); // view groups array $viewGroups = array( - 'main' => array('png.support_group.add', 'png.support_groups', 'png.location.add', 'png.locations', 'png.region.add', 'png.regions', 'png.currencies', 'png.countries') + 'main' => array('png.support_group.add', 'png.support_groups', 'png.payment.add', 'png.payments', 'png.clinics', 'png.locations', 'png.regions', 'png.countries', 'png.currencies', 'png.help_documents') ); // view access array $viewAccess = array( + 'support_group.create' => 'support_group.create', + 'support_groups.access' => 'support_group.access', + 'support_group.access' => 'support_group.access', 'support_groups.submenu' => 'support_group.submenu', 'support_groups.dashboard_list' => 'support_group.dashboard_list', 'support_group.dashboard_add' => 'support_group.dashboard_add', + 'payment.create' => 'payment.create', + 'payments.access' => 'payment.access', + 'payment.access' => 'payment.access', + 'payments.submenu' => 'payment.submenu', + 'payments.dashboard_list' => 'payment.dashboard_list', + 'payment.dashboard_add' => 'payment.dashboard_add', + 'clinic.create' => 'clinic.create', + 'clinics.access' => 'clinic.access', + 'clinic.access' => 'clinic.access', + 'clinics.submenu' => 'clinic.submenu', + 'clinics.dashboard_list' => 'clinic.dashboard_list', + 'location.create' => 'location.create', + 'locations.access' => 'location.access', + 'location.access' => 'location.access', 'locations.submenu' => 'location.submenu', 'locations.dashboard_list' => 'location.dashboard_list', - 'location.dashboard_add' => 'location.dashboard_add', + 'region.create' => 'region.create', + 'regions.access' => 'region.access', + 'region.access' => 'region.access', 'regions.submenu' => 'region.submenu', 'regions.dashboard_list' => 'region.dashboard_list', - 'region.dashboard_add' => 'region.dashboard_add', + 'country.create' => 'country.create', + 'countries.access' => 'country.access', + 'country.access' => 'country.access', + 'countries.submenu' => 'country.submenu', + 'countries.dashboard_list' => 'country.dashboard_list', 'currency.create' => 'currency.create', 'currencies.access' => 'currency.access', 'currency.access' => 'currency.access', 'currencies.submenu' => 'currency.submenu', 'currencies.dashboard_list' => 'currency.dashboard_list', - 'country.create' => 'country.create', - 'countries.access' => 'country.access', - 'country.access' => 'country.access', - 'countries.submenu' => 'country.submenu', - 'countries.dashboard_list' => 'country.dashboard_list'); + 'help_document.create' => 'help_document.create', + 'help_documents.access' => 'help_document.access', + 'help_document.access' => 'help_document.access', + 'help_documents.submenu' => 'help_document.submenu', + 'help_documents.dashboard_list' => 'help_document.dashboard_list'); foreach($viewGroups as $group => $views) { $i = 0; diff --git a/admin/sql/install.mysql.utf8.sql b/admin/sql/install.mysql.utf8.sql index c061d5c..02aee11 100644 --- a/admin/sql/install.mysql.utf8.sql +++ b/admin/sql/install.mysql.utf8.sql @@ -1,7 +1,83 @@ CREATE TABLE IF NOT EXISTS `#__supportgroups_support_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `asset_id` INT(255) UNSIGNED NOT NULL DEFAULT '0', + `area` TEXT NOT NULL DEFAULT '', + `clinic` INT(11) NOT NULL DEFAULT '0', + `female` INT(11) NOT NULL DEFAULT '0', + `female_art` INT(11) NOT NULL DEFAULT '0', + `female_children` INT(11) NOT NULL DEFAULT '0', + `location` INT(11) NOT NULL DEFAULT '0', + `male` INT(11) NOT NULL DEFAULT '0', + `male_art` INT(11) NOT NULL DEFAULT '0', + `male_children` INT(11) NOT NULL DEFAULT '0', `name` VARCHAR(255) NOT NULL DEFAULT '', + `phone` VARCHAR(64) NOT NULL DEFAULT '', + `params` TEXT NOT NULL DEFAULT '', + `published` tinyint(1) NOT NULL DEFAULT '1', + `created_by` int(11) NOT NULL DEFAULT '0', + `modified_by` int(11) NOT NULL DEFAULT '0', + `created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `checked_out` int(11) NOT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `version` int(11) NOT NULL DEFAULT '1', + `hits` int(11) NOT NULL DEFAULT '0', + `access` int(11) DEFAULT NULL, + `ordering` int(11) NOT NULL DEFAULT '0', + `metakey` TEXT NOT NULL DEFAULT '', + `metadesc` TEXT NOT NULL DEFAULT '', + `metadata` TEXT NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `idx_access` (`access`), + KEY `idx_checkout` (`checked_out`), + KEY `idx_createdby` (`created_by`), + KEY `idx_modifiedby` (`modified_by`), + KEY `idx_state` (`published`), + KEY `idx_name` (`name`), + KEY `idx_location` (`location`), + KEY `idx_clinic` (`clinic`), + KEY `idx_male` (`male`), + KEY `idx_female` (`female`), + KEY `idx_female_art` (`female_art`), + KEY `idx_male_art` (`male_art`), + KEY `idx_female_children` (`female_children`), + KEY `idx_male_children` (`male_children`) +) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__supportgroups_payment` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `asset_id` INT(255) UNSIGNED NOT NULL DEFAULT '0', + `amount` VARCHAR(100) NOT NULL DEFAULT '0', + `support_group` INT(11) NOT NULL DEFAULT '0', + `year` INT(11) NOT NULL DEFAULT '0', + `params` TEXT NOT NULL DEFAULT '', + `published` tinyint(1) NOT NULL DEFAULT '1', + `created_by` int(11) NOT NULL DEFAULT '0', + `modified_by` int(11) NOT NULL DEFAULT '0', + `created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `checked_out` int(11) NOT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `version` int(11) NOT NULL DEFAULT '1', + `hits` int(11) NOT NULL DEFAULT '0', + `access` int(11) DEFAULT NULL, + `ordering` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_access` (`access`), + KEY `idx_checkout` (`checked_out`), + KEY `idx_createdby` (`created_by`), + KEY `idx_modifiedby` (`modified_by`), + KEY `idx_state` (`published`), + KEY `idx_support_group` (`support_group`), + KEY `idx_year` (`year`) +) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__supportgroups_clinic` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `asset_id` INT(255) UNSIGNED NOT NULL DEFAULT '0', + `area` TEXT NOT NULL DEFAULT '', + `name` VARCHAR(255) NOT NULL DEFAULT '', + `phone` VARCHAR(64) NOT NULL DEFAULT '', `params` TEXT NOT NULL DEFAULT '', `published` tinyint(1) NOT NULL DEFAULT '1', `created_by` int(11) NOT NULL DEFAULT '0', @@ -87,6 +163,44 @@ CREATE TABLE IF NOT EXISTS `#__supportgroups_region` ( KEY `idx_country` (`country`) ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `#__supportgroups_country` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `asset_id` INT(255) UNSIGNED NOT NULL DEFAULT '0', + `alias` CHAR(64) NOT NULL DEFAULT '', + `codethree` CHAR(7) NOT NULL DEFAULT '', + `codetwo` CHAR(7) NOT NULL DEFAULT '', + `currency` CHAR(7) NOT NULL DEFAULT '', + `name` VARCHAR(255) NOT NULL DEFAULT '', + `worldzone` VARCHAR(255) NOT NULL DEFAULT '', + `params` TEXT NOT NULL DEFAULT '', + `published` tinyint(1) NOT NULL DEFAULT '1', + `created_by` int(11) NOT NULL DEFAULT '0', + `modified_by` int(11) NOT NULL DEFAULT '0', + `created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `checked_out` int(11) NOT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `version` int(11) NOT NULL DEFAULT '1', + `hits` int(11) NOT NULL DEFAULT '0', + `access` int(11) DEFAULT NULL, + `ordering` int(11) NOT NULL DEFAULT '0', + `metakey` TEXT NOT NULL DEFAULT '', + `metadesc` TEXT NOT NULL DEFAULT '', + `metadata` TEXT NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `idx_access` (`access`), + KEY `idx_checkout` (`checked_out`), + KEY `idx_createdby` (`created_by`), + KEY `idx_modifiedby` (`modified_by`), + KEY `idx_state` (`published`), + KEY `idx_name` (`name`), + KEY `idx_currency` (`currency`), + KEY `idx_worldzone` (`worldzone`), + KEY `idx_codethree` (`codethree`), + KEY `idx_codetwo` (`codetwo`), + KEY `idx_alias` (`alias`) +) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; + CREATE TABLE IF NOT EXISTS `#__supportgroups_currency` ( `id` int(11) NOT NULL AUTO_INCREMENT, `asset_id` INT(255) UNSIGNED NOT NULL DEFAULT '0', @@ -127,15 +241,21 @@ CREATE TABLE IF NOT EXISTS `#__supportgroups_currency` ( KEY `idx_alias` (`alias`) ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; -CREATE TABLE IF NOT EXISTS `#__supportgroups_country` ( +CREATE TABLE IF NOT EXISTS `#__supportgroups_help_document` ( `id` int(11) NOT NULL AUTO_INCREMENT, `asset_id` INT(255) UNSIGNED NOT NULL DEFAULT '0', + `admin_view` CHAR(255) NOT NULL DEFAULT '', `alias` CHAR(64) NOT NULL DEFAULT '', - `codethree` CHAR(7) NOT NULL DEFAULT '', - `codetwo` CHAR(7) NOT NULL DEFAULT '', - `currency` CHAR(7) NOT NULL DEFAULT '', - `name` VARCHAR(255) NOT NULL DEFAULT '', - `worldzone` VARCHAR(255) NOT NULL DEFAULT '', + `article` TINYINT(1) NOT NULL DEFAULT '0', + `content` TEXT NOT NULL DEFAULT '', + `groups` TEXT NOT NULL DEFAULT '', + `location` TINYINT(1) NOT NULL DEFAULT '0', + `not_required` INT(1) NOT NULL DEFAULT '0', + `site_view` CHAR(255) NOT NULL DEFAULT '', + `target` TINYINT(1) NOT NULL DEFAULT '0', + `title` CHAR(64) NOT NULL DEFAULT '', + `type` TINYINT(1) NOT NULL DEFAULT '0', + `url` VARCHAR(255) NOT NULL DEFAULT '', `params` TEXT NOT NULL DEFAULT '', `published` tinyint(1) NOT NULL DEFAULT '1', `created_by` int(11) NOT NULL DEFAULT '0', @@ -148,195 +268,22 @@ CREATE TABLE IF NOT EXISTS `#__supportgroups_country` ( `hits` int(11) NOT NULL DEFAULT '0', `access` int(11) DEFAULT NULL, `ordering` int(11) NOT NULL DEFAULT '0', - `metakey` TEXT NOT NULL DEFAULT '', - `metadesc` TEXT NOT NULL DEFAULT '', - `metadata` TEXT NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `idx_access` (`access`), KEY `idx_checkout` (`checked_out`), KEY `idx_createdby` (`created_by`), KEY `idx_modifiedby` (`modified_by`), KEY `idx_state` (`published`), - KEY `idx_name` (`name`), - KEY `idx_currency` (`currency`), - KEY `idx_worldzone` (`worldzone`), - KEY `idx_codethree` (`codethree`), - KEY `idx_codetwo` (`codetwo`), - KEY `idx_alias` (`alias`) + KEY `idx_title` (`title`), + KEY `idx_type` (`type`), + KEY `idx_location` (`location`), + KEY `idx_target` (`target`), + KEY `idx_alias` (`alias`), + KEY `idx_article` (`article`) ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; --- --- Dumping data for table `#__supportgroups_currency` --- - -INSERT INTO `#__supportgroups_currency` (`id`, `alias`, `codethree`, `decimalplace`, `decimalsymbol`, `name`, `negativestyle`, `numericcode`, `positivestyle`, `symbol`, `thousands`, `params`, `published`, `created_by`, `modified_by`, `created`, `modified`, `checked_out`, `checked_out_time`, `version`, `hits`, `access`, `ordering`) VALUES -(1, '', 'AED', 2, ',', 'United Arab Emirates dirham', '{sign}{number} {symbol}', 784, '{number} {symbol}', 'د.إ', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 23), -(2, '', 'AFN', 2, ',', 'Afghan afghani', '{sign}{number} {symbol}', 971, '{number} {symbol}', '؋', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 24), -(3, '', 'ALL', 2, ',', 'Albanian lek', '{sign}{number} {symbol}', 8, '{number} {symbol}', 'Lek', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 25), -(4, '', 'AMD', 2, ',', 'Armenian dram', '{sign}{number} {symbol}', 51, '{number} {symbol}', 'դր.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 26), -(5, '', 'ANG', 2, ',', 'Netherlands Antillean gulden', '{sign}{number} {symbol}', 532, '{number} {symbol}', 'ƒ', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 27), -(6, '', 'AOA', 2, ',', 'Angolan kwanza', '{sign}{number} {symbol}', 973, '{number} {symbol}', 'Kz', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 28), -(7, '', 'ARS', 2, ',', 'Argentine peso', '{sign}{number} {symbol}', 32, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 29), -(8, '', 'AUD', 2, '.', 'Australian dollar', '{sign}{symbol} {number}', 36, '{symbol} {number}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 5), -(9, '', 'AWG', 2, ',', 'Aruban florin', '{sign}{number} {symbol}', 533, '{number} {symbol}', 'ƒ', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 30), -(10, '', 'AZN', 2, ',', 'Azerbaijani manat', '{sign}{number} {symbol}', 934, '{number} {symbol}', 'ман', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 31), -(11, '', 'BAM', 2, ',', 'Bosnia and Herzegovina convert', '{sign}{number} {symbol}', 977, '{number} {symbol}', 'KM', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 32), -(12, '', 'BBD', 2, ',', 'Barbadian dollar', '{sign}{number} {symbol}', 52, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 33), -(13, '', 'BDT', 2, ',', 'Bangladeshi taka', '{sign}{number} {symbol}', 50, '{number} {symbol}', '৳', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 34), -(14, '', 'BGN', 2, ',', 'Bulgarian lev', '{sign}{number} {symbol}', 975, '{number} {symbol}', 'лв', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 35), -(15, '', 'BHD', 2, ',', 'Bahraini dinar', '{sign}{number} {symbol}', 48, '{number} {symbol}', 'ب.د', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 36), -(16, '', 'BIF', '', '', 'Burundian franc', '{sign}{number} {symbol}', 108, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 37), -(17, '', 'BMD', 2, ',', 'Bermudian dollar', '{sign}{number} {symbol}', 60, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 38), -(18, '', 'BND', 2, ',', 'Brunei dollar', '{sign}{number} {symbol}', 96, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 39), -(19, '', 'BOB', 2, ',', 'Bolivian boliviano', '{sign}{number} {symbol}', 68, '{number} {symbol}', '$b', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 40), -(20, '', 'BOV', 2, ',', 'Mvdol', '{sign}{number} {symbol}', 984, '{number} {symbol}', 'BOV', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 41), -(21, '', 'BRL', 2, '.', 'Brazilian real', '{symbol} {sign}{number}', 986, '{symbol} {number}', 'R$', ',', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 17), -(22, '', 'BSD', 2, ',', 'Bahamian dollar', '{sign}{number} {symbol}', 44, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 42), -(23, '', 'BTN', 2, ',', 'Bhutanese ngultrum', '{sign}{number} {symbol}', 64, '{number} {symbol}', 'BTN', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 43), -(24, '', 'BWP', 2, ',', 'Botswana pula', '{sign}{number} {symbol}', 72, '{number} {symbol}', 'P', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 44), -(25, '', 'BYR', '', '', 'Belarusian ruble', '{sign}{number} {symbol}', 974, '{number} {symbol}', 'p.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 45), -(26, '', 'BZD', 2, ',', 'Belize dollar', '{sign}{number} {symbol}', 84, '{number} {symbol}', 'BZ$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 46), -(27, '', 'CAD', 2, '.', 'Canadian dollar', '{symbol}{sign}{number}', 124, '{symbol}{number}', '$', ',', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 7), -(28, '', 'CDF', 2, ',', 'Congolese franc', '{sign}{number} {symbol}', 976, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 47), -(29, '', 'CHE', 2, ',', 'WIR Euro', '{sign}{number} {symbol}', 947, '{number} {symbol}', '€', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 48), -(30, '', 'CHF', 2, ',', 'Swiss franc', '{sign}{number} {symbol}', 756, '{number} {symbol}', 'CHF', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 6), -(31, '', 'CHW', 2, ',', 'WIR Franc', '{sign}{number} {symbol}', 948, '{number} {symbol}', 'CHW', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 49), -(32, '', 'CLF', '', ',', 'Unidad de Fomento', '{sign}{number} {symbol}', 990, '{number} {symbol}', 'CLF', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 50), -(33, '', 'CLP', 2, ',', 'Chilean peso', '{sign}{number} {symbol}', 152, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 51), -(34, '', 'CNY', 2, ',', 'Chinese renminbi yuan', '{sign}{number} {symbol}', 156, '{number} {symbol}', '元', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 9), -(35, '', 'COP', 2, ',', 'Colombian peso', '{sign}{number} {symbol}', 170, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 52), -(36, '', 'COU', 2, ',', 'Unidad de Valor Real', '{sign}{number} {symbol}', 970, '{number} {symbol}', 'COU', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 53), -(37, '', 'CRC', 2, ',', 'Costa Rican colón', '{sign}{number} {symbol}', 188, '{number} {symbol}', '₡', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 54), -(38, '', 'CZK', 2, ',', 'Czech koruna', '{sign}{number} {symbol}', 203, '{number} {symbol}', 'Kč', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 57), -(39, '', 'CUP', 2, ',', 'Cuban peso', '{sign}{number} {symbol}', 192, '{number} {symbol}', '₱', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 55), -(40, '', 'CVE', '', '', 'Cape Verdean escudo', '{sign}{number} {symbol}', 132, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 56), -(41, '', 'DJF', '', '', 'Djiboutian franc', '{sign}{number} {symbol}', 262, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 58), -(42, '', 'DKK', 2, '.', 'Danish krone', '{symbol}{sign}{number}', 208, '{symbol}{number}', 'kr', ',', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 19), -(43, '', 'DOP', 2, ',', 'Dominican peso', '{sign}{number} {symbol}', 214, '{number} {symbol}', 'RD$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 59), -(44, '', 'DZD', 2, ',', 'Algerian dinar', '{sign}{number} {symbol}', 12, '{number} {symbol}', 'د.ج', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 60), -(45, '', 'EGP', 2, ',', 'Egyptian pound', '{sign}{number} {symbol}', 818, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 61), -(46, '', 'ERN', 2, ',', 'Eritrean nakfa', '{sign}{number} {symbol}', 232, '{number} {symbol}', 'Nfk', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 62), -(47, '', 'ETB', 2, ',', 'Ethiopian birr', '{sign}{number} {symbol}', 230, '{number} {symbol}', 'ETB', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 63), -(48, '', 'EUR', 2, ',', 'Euro', '{sign}{number} {symbol}', 978, '{number} {symbol}', '€', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 2), -(49, '', 'FJD', 2, ',', 'Fijian dollar', '{sign}{number} {symbol}', 242, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 64), -(50, '', 'FKP', 2, ',', 'Falkland pound', '{sign}{number} {symbol}', 238, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 65), -(51, '', 'GBP', 2, '.', 'British pound', '{symbol}{sign}{number}', 826, '{symbol}{number}', '£', ',', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 4), -(52, '', 'GEL', 2, ',', 'Georgian lari', '{sign}{number} {symbol}', 981, '{number} {symbol}', 'ლ', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 66), -(53, '', 'GHS', 2, ',', 'Ghanaian cedi', '{sign}{number} {symbol}', 936, '{number} {symbol}', '₵', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 67), -(54, '', 'GIP', 2, ',', 'Gibraltar pound', '{sign}{number} {symbol}', 292, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 68), -(55, '', 'GMD', 2, ',', 'Gambian dalasi', '{sign}{number} {symbol}', 270, '{number} {symbol}', 'D', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 69), -(56, '', 'GNF', '', '', 'Guinean franc', '{sign}{number} {symbol}', 324, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 70), -(57, '', 'GTQ', 2, ',', 'Guatemalan quetzal', '{sign}{number} {symbol}', 320, '{number} {symbol}', 'Q', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 71), -(58, '', 'GYD', 2, ',', 'Guyanese dollar', '{sign}{number} {symbol}', 328, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 72), -(59, '', 'HKD', 2, ',', 'Hong Kong dollar', '{sign}{number} {symbol}', 344, '{number} {symbol}', '元', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 13), -(60, '', 'HNL', 2, ',', 'Honduran lempira', '{sign}{number} {symbol}', 340, '{number} {symbol}', 'L', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 73), -(61, '', 'HRK', 2, ',', 'Croatian kuna', '{sign}{number} {symbol}', 191, '{number} {symbol}', 'kn', '.', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 74), -(62, '', 'HTG', 2, ',', 'Haitian gourde', '{sign}{number} {symbol}', 332, '{number} {symbol}', 'G', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 75), -(63, '', 'HUF', 2, ',', 'Hungarian forint', '{sign}{number} {symbol}', 348, '{number} {symbol}', 'Ft', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 76), -(64, '', 'IDR', '', '', 'Indonesian rupiah', '{symbol}{sign}{number}', 360, '{symbol}{number}', 'Rp', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 77), -(65, '', 'ILS', 2, ',', 'Israeli new sheqel', '{sign}{number} {symbol}', 376, '{number} {symbol}', '₪', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 20), -(66, '', 'INR', 2, ',', 'Indian rupee', '{sign}{number} {symbol}', 356, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 16), -(67, '', 'IQD', '', '', 'Iraqi dinar', '{sign}{number} {symbol}', 368, '{number} {symbol}', 'ع.د', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 78), -(68, '', 'IRR', 2, ',', 'Iranian rial', '{sign}{number}{symb0l}', 364, '{number} {symbol}', '﷼', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 79), -(69, '', 'ISK', 2, ',', 'Icelandic króna', '{sign}{number} {symbol}', 352, '{number} {symbol}', 'kr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 80), -(70, '', 'JMD', 2, ',', 'Jamaican dollar', '{sign}{number} {symbol}', 388, '{number} {symbol}', 'J$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 81), -(71, '', 'JOD', 2, ',', 'Jordanian dinar', '{sign}{number} {symbol}', 400, '{number} {symbol}', 'د.ا', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 82), -(72, '', 'JPY', 2, ',', 'Japanese yen', '{sign}{number} {symbol}', 392, '{number} {symbol}', '¥', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 3), -(73, '', 'KES', 2, ',', 'Kenyan shilling', '{sign}{number} {symbol}', 404, '{number} {symbol}', 'Sh', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 83), -(74, '', 'KGS', 2, ',', 'Kyrgyzstani som', '{sign}{number} {symbol}', 417, '{number} {symbol}', 'лв', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 84), -(75, '', 'KHR', 2, ',', 'Cambodian riel', '{sign}{number} {symbol}', 116, '{number} {symbol}', '៛', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 85), -(76, '', 'KMF', '', '', 'Comorian franc', '{sign}{number} {symbol}', 174, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 86), -(77, '', 'KPW', '', '', 'North Korean won', '{sign}{number} {symbol}', 408, '{number} {symbol}', '₩', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 87), -(78, '', 'KRW', '', '', 'South Korean won', '{sign}{number} {symbol}', 410, '{number} {symbol}', '₩', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 21), -(79, '', 'KWD', 2, ',', 'Kuwaiti dinar', '{sign}{number} {symbol}', 414, '{number} {symbol}', 'د.ك', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 88), -(80, '', 'KYD', 2, ',', 'Cayman Islands dollar', '{sign}{number} {symbol}', 136, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 89), -(81, '', 'KZT', 2, ',', 'Kazakhstani tenge', '{sign}{number} {symbol}', 398, '{number} {symbol}', 'лв', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 90), -(82, '', 'LAK', '', '', 'Lao kip', '{sign}{number} {symbol}', 418, '{number} {symbol}', '₭', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 91), -(83, '', 'LBP', '', '', 'Lebanese pound', '{sign}{number} {symbol}', 422, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 92), -(84, '', 'LKR', 2, ',', 'Sri Lankan rupee', '{sign}{number} {symbol}', 144, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 93), -(85, '', 'LRD', 2, ',', 'Liberian dollar', '{sign}{number} {symbol}', 430, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 94), -(86, '', 'LSL', 2, ',', 'Lesotho loti', '{sign}{number} {symbol}', 426, '{number} {symbol}', 'L', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 95), -(87, '', 'LTL', 2, ',', 'Lithuanian litas', '{sign}{number} {symbol}', 440, '{number} {symbol}', 'Lt', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 96), -(88, '', 'LVL', 2, ',', 'Latvian lats', '{sign}{number} {symbol}', 428, '{number} {symbol}', 'Ls', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 97), -(89, '', 'LYD', 3, ',', 'Libyan dinar', '{sign}{number} {symbol}', 434, '{number} {symbol}', 'ل.د', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 98), -(90, '', 'MAD', 2, ',', 'Moroccan dirham', '{sign}{number} {symbol}', 504, '{number} {symbol}', 'د.م.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 99), -(91, '', 'MDL', 2, ',', 'Moldovan leu', '{sign}{number} {symbol}', 498, '{number} {symbol}', 'L', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 100), -(92, '', 'MGA', 2, ',', 'Malagasy ariary', '{sign}{number} {symbol}', 969, '{number} {symbol}', 'MGA', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 101), -(93, '', 'MKD', 2, ',', 'Macedonian denar', '{sign}{number} {symbol}', 807, '{number} {symbol}', 'ден', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 102), -(94, '', 'MMK', 2, ',', 'Myanmar kyat', '{symbol} {sign}{number}', 104, '{number} {symbol}', 'K', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 103), -(95, '', 'MNT', 2, ',', 'Mongolian tögrög', '{sign}{number} {symbol}', 496, '{number} {symbol}', '₮', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 104), -(96, '', 'MOP', 1, ',', 'Macanese pataca', '{symbol}{sign}{number}', 446, '{symbol}{number}', 'P', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 105), -(97, '', 'MRO', 2, ',', 'Mauritanian ouguiya', '{sign}{number} {symbol}', 478, '{number} {symbol}', 'UM', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 106), -(98, '', 'MUR', 2, ',', 'Mauritian rupee', '{sign}{number} {symbol}', 480, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 107), -(99, '', 'MVR', 2, ',', 'Maldivian rufiyaa', '{sign}{number} {symbol}', 462, '{number} {symbol}', 'ރ.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 108), -(100, '', 'MWK', 2, ',', 'Malawian kwacha', '{sign}{number} {symbol}', 454, '{number} {symbol}', 'MK', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 109), -(101, '', 'MXN', 2, ',', 'Mexican peso', '{sign}{number} {symbol}', 484, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 8), -(102, '', 'MXV', 2, ',', 'Mexican Unid', '{sign}{number} {symbol}', 979, '{number} {symbol}', 'MXV', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 110), -(103, '', 'MYR', 2, ',', 'Malaysian ringgit', '{sign}{number} {symbol}', 458, '{number} {symbol}', 'RM', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 111), -(104, '', 'MZN', 2, ',', 'Mozambican metical', '{sign}{number} {symbol}', 943, '{number} {symbol}', 'MT', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 112), -(105, '', 'NAD', 2, ',', 'Namibian dollar', '{symbol} {sign}{number}', 516, '{symbol} {number}', 'N$', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 113), -(106, '', 'NGN', 2, ',', 'Nigerian naira', '{sign}{number} {symbol}', 566, '{number} {symbol}', '₦', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 114), -(107, '', 'NIO', 2, ',', 'Nicaraguan córdoba', '{sign}{number} {symbol}', 558, '{number} {symbol}', 'C$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 115), -(108, '', 'NOK', 2, ',', 'Norwegian krone', '{symbol}{sign}{number}', 578, '{symbol}{number}', 'kr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 18), -(109, '', 'NPR', 2, ',', 'Nepalese rupee', '{sign}{number} {symbol}', 524, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 116), -(110, '', 'NZD', 2, ',', 'New Zealand dollar', '{symbol}{sign}{number}', 554, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 10), -(111, '', 'OMR', 3, '.', 'Omani rial', '{sign}{number} {symbol}', 512, '{number} {symbol}', '﷼', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 117), -(112, '', 'PAB', 2, ',', 'Panamanian balboa', '{sign}{number} {symbol}', 590, '{number} {symbol}', 'B/.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 118), -(113, '', 'PEN', 2, ',', 'Peruvian nuevo sol', '{sign}{number} {symbol}', 604, '{number} {symbol}', 'S/.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 119), -(114, '', 'PGK', 2, ',', 'Papua New Guinean kina', '{sign}{number} {symbol}', 598, '{number} {symbol}', 'K', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 120), -(115, '', 'PHP', 2, ',', 'Philippine peso', '{sign}{number} {symbol}', 608, '{number} {symbol}', '₱', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 121), -(116, '', 'PKR', 2, ',', 'Pakistani rupee', '{sign}{number} {symbol}', 586, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 122), -(117, '', 'PLN', 2, ',', 'Polish Złoty', '{sign}{number} {symbol}', 985, '{number} {symbol}', 'zł', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 123), -(118, '', 'PYG', '', '', 'Paraguayan guaraní', '{symbol} {sign}{number}', 600, '{symbol} {number}', '₲', '.', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 124), -(119, '', 'QAR', 2, ',', 'Qatari riyal', '{sign}{number} {symbol}', 634, '{number} {symbol}', '﷼', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 125), -(120, '', 'RON', 2, ',', 'Romanian leu', '{sign}{number} {symbol}', 946, '{number} {symbol}', 'lei', '.', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 126), -(121, '', 'RWF', 2, ',', 'Rwandan franc', '{sign}{number} {symbol}', 646, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 128), -(122, '', 'SAR', 2, ',', 'Saudi riyal', '{sign}{number} {symbol}', 682, '{number} {symbol}', '﷼', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 129), -(123, '', 'SBD', 2, ',', 'Solomon Islands dollar', '{sign}{number} {symbol}', 90, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 130), -(124, '', 'SCR', 2, ',', 'Seychellois rupee', '{sign}{number} {symbol}', 690, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 131), -(125, '', 'SDG', 2, ',', 'Sudanese pound', '{sign}{number} {symbol}', 938, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 132), -(126, '', 'SEK', 2, ',', 'Swedish krona', '{sign}{number} {symbol}', 752, '{number} {symbol}', 'kr', '.', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 11), -(127, '', 'SGD', 2, ',', 'Singapore dollar', '{sign}{number} {symbol}', 702, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 14), -(128, '', 'SHP', 2, ',', 'Saint Helenian pound', '{sign}{number} {symbol}', 654, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 133), -(129, '', 'SLL', 2, ',', 'Sierra Leonean leone', '{sign}{number} {symbol}', 694, '{number} {symbol}', 'Le', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 134), -(130, '', 'SOS', 2, ',', 'Somali shilling', '{sign}{number} {symbol}', 706, '{number} {symbol}', 'S', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 135), -(131, '', 'SRD', 2, ',', 'Surinamese dollar', '{sign}{number} {symbol}', 968, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 136), -(132, '', 'STD', '', '', 'São Tomé and Príncipe dobra', '{sign}{number} {symbol}', 678, '{number} {symbol}', 'Db', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 137), -(133, '', 'RUB', 2, ',', 'Russian ruble', '{sign}{number} {symbol}', 643, '{number} {symbol}', 'руб', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 12), -(134, '', 'SVC', 2, ',', 'Salvadoran colón', '{sign}{number} {symbol}', 222, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 138), -(135, '', 'SYP', 2, ',', 'Syrian pound', '{sign}{number} {symbol}', 760, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 139), -(136, '', 'SZL', 2, ',', 'Swazi lilangeni', '{sign}{number} {symbol}', 748, '{number} {symbol}', 'L', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 140), -(137, '', 'THB', 2, ',', 'Thai baht', '{sign}{number} {symbol}', 764, '{number} {symbol}', '฿', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 141), -(138, '', 'TJS', 2, ',', 'Tajikistani somoni', '{sign}{number} {symbol}', 972, '{number} {symbol}', 'ЅМ', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 142), -(139, '', 'TND', 3, ',', 'Tunisian dinar', '{sign}{number} {symbol}', 788, '{number} {symbol}', 'د.ت', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 143), -(140, '', 'TOP', 2, ',', 'Tongan paʻanga', '{sign}{number} {symbol}', 776, '{number} {symbol}', 'T$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 144), -(141, '', 'TRY', 2, ',', 'Turkish new lira', '{sign}{number} {symbol}', 949, '{number} {symbol}', 'YTL', '.', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 15), -(142, '', 'TTD', 2, ',', 'Trinidad and Tobago dollar', '{sign}{number} {symbol}', 780, '{number} {symbol}', 'TT$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 145), -(143, '', 'TWD', 2, ',', 'New Taiwan dollar', '{sign}{number} {symbol}', 901, '{number} {symbol}', 'NT$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 146), -(144, '', 'TZS', 2, ',', 'Tanzanian shilling', '{sign}{number} {symbol}', 834, '{number} {symbol}', 'Sh', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 147), -(145, '', 'UAH', 2, ',', 'Ukrainian hryvnia', '{sign}{number} {symbol}', 980, '{number} {symbol}', '₴', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 148), -(146, '', 'UGX', 2, ',', 'Ugandan shilling', '{sign}{number} {symbol}', 800, '{number} {symbol}', 'Sh', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 149), -(147, '', 'USD', 2, '.', 'United States dollar', '{symbol}{sign}{number}', 840, '{symbol}{number}', '$', ',', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 1), -(148, '', 'UYI', 2, ',', 'Uruguay Peso', '{sign}{number} {symbol}', 940, '{number} {symbol}', 'UYI', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 150), -(149, '', 'UYU', '', '', 'Uruguayan peso', '{symbol}{sign}{number}', 858, '{symbol} {number}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 151), -(150, '', 'UZS', 2, ',', 'Uzbekistani som', '{sign}{number} {symbol}', 860, '{number} {symbol}', 'лв', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 152), -(151, '', 'VEF', 2, ',', 'Venezuelan bolívar', '{sign}{number} {symbol}', 937, '{number} {symbol}', 'Bs', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 153), -(152, '', 'VND', '', '', 'Vietnamese Dong', '{sign}{number} {symbol}', 704, '{number} {symbol}', '₫', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 154), -(153, '', 'VUV', 2, ',', 'Vanuatu vatu', '{sign}{number} {symbol}', 548, '{number} {symbol}', 'Vt', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 155), -(154, '', 'WST', 2, ',', 'Samoan tala', '{sign}{number} {symbol}', 882, '{number} {symbol}', 'T', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 156), -(155, '', 'XAF', '', '', 'Central African CFA franc', '{sign}{number} {symbol}', 950, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 157), -(156, '', 'XCD', 2, ',', 'East Caribbean dollar', '{sign}{number} {symbol}', 951, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 158), -(157, '', 'XOF', 2, ',', 'West African CFA franc', '{sign}{number} {symbol}', 952, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 159), -(158, '', 'XPF', 2, ',', 'CFP franc', '{sign}{number} {symbol}', 953, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 160), -(159, '', 'YER', 2, ',', 'Yemeni rial', '{sign}{number} {symbol}', 886, '{number} {symbol}', '﷼', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 161), -(160, '', 'RSD', 2, ',', 'Serbian dinar', '{sign}{number} {symbol}', 941, '{number} {symbol}', 'Дин.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 127), -(161, 'south-african-rand', 'ZAR', 2, ',', 'South African rand', '{symbol} {sign}{number}', 710, '{symbol} {number}', 'R', '', '', 1, '', 845, '0000-00-00 00:00:00', '2015-08-30 22:07:36', '', '0000-00-00 00:00:00', 2, '', 5, 22), -(162, '', 'ZMK', 2, ',', 'Zambian kwacha', '{sign}{number} {symbol}', 894, '{number} {symbol}', 'ZK', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 162), -(163, '', 'ZWD', 2, ',', 'Zimbabwean dollar', '{sign}{number} {symbol}', 932, '{number} {symbol}', 'Z$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 163), -(164, '', 'ZZZ', 2, ',', 'Reserved', '', '', '', 'O', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 164); - -- -- Dumping data for table `#__supportgroups_country` -- @@ -587,4 +534,174 @@ INSERT INTO `#__supportgroups_country` (`id`, `asset_id`, `alias`, `codethree`, (243, '', '', 'SRB', 'RS', 'SRB', 'Serbia', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', ''), (244, '', '', 'MAF', 'MF', 'EUR', 'Sint Maarten (French Antilles)', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', ''), (245, '', '', 'SXM', 'SX', 'ANG', 'Sint Maarten (Netherlands Antilles)', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', ''), -(246, '', '', 'ZZZ', 'ZZ', 'ZZZ', 'Reserved', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', ''); \ No newline at end of file +(246, '', '', 'ZZZ', 'ZZ', 'ZZZ', 'Reserved', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', ''); + +-- +-- Dumping data for table `#__supportgroups_currency` +-- + +INSERT INTO `#__supportgroups_currency` (`id`, `alias`, `codethree`, `decimalplace`, `decimalsymbol`, `name`, `negativestyle`, `numericcode`, `positivestyle`, `symbol`, `thousands`, `params`, `published`, `created_by`, `modified_by`, `created`, `modified`, `checked_out`, `checked_out_time`, `version`, `hits`, `access`, `ordering`) VALUES +(1, '', 'AED', 2, ',', 'United Arab Emirates dirham', '{sign}{number} {symbol}', 784, '{number} {symbol}', 'د.إ', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 23), +(2, '', 'AFN', 2, ',', 'Afghan afghani', '{sign}{number} {symbol}', 971, '{number} {symbol}', '؋', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 24), +(3, '', 'ALL', 2, ',', 'Albanian lek', '{sign}{number} {symbol}', 8, '{number} {symbol}', 'Lek', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 25), +(4, '', 'AMD', 2, ',', 'Armenian dram', '{sign}{number} {symbol}', 51, '{number} {symbol}', 'դր.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 26), +(5, '', 'ANG', 2, ',', 'Netherlands Antillean gulden', '{sign}{number} {symbol}', 532, '{number} {symbol}', 'ƒ', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 27), +(6, '', 'AOA', 2, ',', 'Angolan kwanza', '{sign}{number} {symbol}', 973, '{number} {symbol}', 'Kz', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 28), +(7, '', 'ARS', 2, ',', 'Argentine peso', '{sign}{number} {symbol}', 32, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 29), +(8, '', 'AUD', 2, '.', 'Australian dollar', '{sign}{symbol} {number}', 36, '{symbol} {number}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 5), +(9, '', 'AWG', 2, ',', 'Aruban florin', '{sign}{number} {symbol}', 533, '{number} {symbol}', 'ƒ', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 30), +(10, '', 'AZN', 2, ',', 'Azerbaijani manat', '{sign}{number} {symbol}', 934, '{number} {symbol}', 'ман', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 31), +(11, '', 'BAM', 2, ',', 'Bosnia and Herzegovina convert', '{sign}{number} {symbol}', 977, '{number} {symbol}', 'KM', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 32), +(12, '', 'BBD', 2, ',', 'Barbadian dollar', '{sign}{number} {symbol}', 52, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 33), +(13, '', 'BDT', 2, ',', 'Bangladeshi taka', '{sign}{number} {symbol}', 50, '{number} {symbol}', '৳', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 34), +(14, '', 'BGN', 2, ',', 'Bulgarian lev', '{sign}{number} {symbol}', 975, '{number} {symbol}', 'лв', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 35), +(15, '', 'BHD', 2, ',', 'Bahraini dinar', '{sign}{number} {symbol}', 48, '{number} {symbol}', 'ب.د', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 36), +(16, '', 'BIF', '', '', 'Burundian franc', '{sign}{number} {symbol}', 108, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 37), +(17, '', 'BMD', 2, ',', 'Bermudian dollar', '{sign}{number} {symbol}', 60, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 38), +(18, '', 'BND', 2, ',', 'Brunei dollar', '{sign}{number} {symbol}', 96, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 39), +(19, '', 'BOB', 2, ',', 'Bolivian boliviano', '{sign}{number} {symbol}', 68, '{number} {symbol}', '$b', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 40), +(20, '', 'BOV', 2, ',', 'Mvdol', '{sign}{number} {symbol}', 984, '{number} {symbol}', 'BOV', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 41), +(21, '', 'BRL', 2, '.', 'Brazilian real', '{symbol} {sign}{number}', 986, '{symbol} {number}', 'R$', ',', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 17), +(22, '', 'BSD', 2, ',', 'Bahamian dollar', '{sign}{number} {symbol}', 44, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 42), +(23, '', 'BTN', 2, ',', 'Bhutanese ngultrum', '{sign}{number} {symbol}', 64, '{number} {symbol}', 'BTN', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 43), +(24, '', 'BWP', 2, ',', 'Botswana pula', '{sign}{number} {symbol}', 72, '{number} {symbol}', 'P', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 44), +(25, '', 'BYR', '', '', 'Belarusian ruble', '{sign}{number} {symbol}', 974, '{number} {symbol}', 'p.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 45), +(26, '', 'BZD', 2, ',', 'Belize dollar', '{sign}{number} {symbol}', 84, '{number} {symbol}', 'BZ$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 46), +(27, '', 'CAD', 2, '.', 'Canadian dollar', '{symbol}{sign}{number}', 124, '{symbol}{number}', '$', ',', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 7), +(28, '', 'CDF', 2, ',', 'Congolese franc', '{sign}{number} {symbol}', 976, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 47), +(29, '', 'CHE', 2, ',', 'WIR Euro', '{sign}{number} {symbol}', 947, '{number} {symbol}', '€', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 48), +(30, '', 'CHF', 2, ',', 'Swiss franc', '{sign}{number} {symbol}', 756, '{number} {symbol}', 'CHF', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 6), +(31, '', 'CHW', 2, ',', 'WIR Franc', '{sign}{number} {symbol}', 948, '{number} {symbol}', 'CHW', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 49), +(32, '', 'CLF', '', ',', 'Unidad de Fomento', '{sign}{number} {symbol}', 990, '{number} {symbol}', 'CLF', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 50), +(33, '', 'CLP', 2, ',', 'Chilean peso', '{sign}{number} {symbol}', 152, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 51), +(34, '', 'CNY', 2, ',', 'Chinese renminbi yuan', '{sign}{number} {symbol}', 156, '{number} {symbol}', '元', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 9), +(35, '', 'COP', 2, ',', 'Colombian peso', '{sign}{number} {symbol}', 170, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 52), +(36, '', 'COU', 2, ',', 'Unidad de Valor Real', '{sign}{number} {symbol}', 970, '{number} {symbol}', 'COU', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 53), +(37, '', 'CRC', 2, ',', 'Costa Rican colón', '{sign}{number} {symbol}', 188, '{number} {symbol}', '₡', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 54), +(38, '', 'CZK', 2, ',', 'Czech koruna', '{sign}{number} {symbol}', 203, '{number} {symbol}', 'Kč', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 57), +(39, '', 'CUP', 2, ',', 'Cuban peso', '{sign}{number} {symbol}', 192, '{number} {symbol}', '₱', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 55), +(40, '', 'CVE', '', '', 'Cape Verdean escudo', '{sign}{number} {symbol}', 132, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 56), +(41, '', 'DJF', '', '', 'Djiboutian franc', '{sign}{number} {symbol}', 262, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 58), +(42, '', 'DKK', 2, '.', 'Danish krone', '{symbol}{sign}{number}', 208, '{symbol}{number}', 'kr', ',', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 19), +(43, '', 'DOP', 2, ',', 'Dominican peso', '{sign}{number} {symbol}', 214, '{number} {symbol}', 'RD$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 59), +(44, '', 'DZD', 2, ',', 'Algerian dinar', '{sign}{number} {symbol}', 12, '{number} {symbol}', 'د.ج', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 60), +(45, '', 'EGP', 2, ',', 'Egyptian pound', '{sign}{number} {symbol}', 818, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 61), +(46, '', 'ERN', 2, ',', 'Eritrean nakfa', '{sign}{number} {symbol}', 232, '{number} {symbol}', 'Nfk', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 62), +(47, '', 'ETB', 2, ',', 'Ethiopian birr', '{sign}{number} {symbol}', 230, '{number} {symbol}', 'ETB', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 63), +(48, '', 'EUR', 2, ',', 'Euro', '{sign}{number} {symbol}', 978, '{number} {symbol}', '€', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 2), +(49, '', 'FJD', 2, ',', 'Fijian dollar', '{sign}{number} {symbol}', 242, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 64), +(50, '', 'FKP', 2, ',', 'Falkland pound', '{sign}{number} {symbol}', 238, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 65), +(51, '', 'GBP', 2, '.', 'British pound', '{symbol}{sign}{number}', 826, '{symbol}{number}', '£', ',', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 4), +(52, '', 'GEL', 2, ',', 'Georgian lari', '{sign}{number} {symbol}', 981, '{number} {symbol}', 'ლ', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 66), +(53, '', 'GHS', 2, ',', 'Ghanaian cedi', '{sign}{number} {symbol}', 936, '{number} {symbol}', '₵', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 67), +(54, '', 'GIP', 2, ',', 'Gibraltar pound', '{sign}{number} {symbol}', 292, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 68), +(55, '', 'GMD', 2, ',', 'Gambian dalasi', '{sign}{number} {symbol}', 270, '{number} {symbol}', 'D', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 69), +(56, '', 'GNF', '', '', 'Guinean franc', '{sign}{number} {symbol}', 324, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 70), +(57, '', 'GTQ', 2, ',', 'Guatemalan quetzal', '{sign}{number} {symbol}', 320, '{number} {symbol}', 'Q', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 71), +(58, '', 'GYD', 2, ',', 'Guyanese dollar', '{sign}{number} {symbol}', 328, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 72), +(59, '', 'HKD', 2, ',', 'Hong Kong dollar', '{sign}{number} {symbol}', 344, '{number} {symbol}', '元', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 13), +(60, '', 'HNL', 2, ',', 'Honduran lempira', '{sign}{number} {symbol}', 340, '{number} {symbol}', 'L', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 73), +(61, '', 'HRK', 2, ',', 'Croatian kuna', '{sign}{number} {symbol}', 191, '{number} {symbol}', 'kn', '.', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 74), +(62, '', 'HTG', 2, ',', 'Haitian gourde', '{sign}{number} {symbol}', 332, '{number} {symbol}', 'G', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 75), +(63, '', 'HUF', 2, ',', 'Hungarian forint', '{sign}{number} {symbol}', 348, '{number} {symbol}', 'Ft', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 76), +(64, '', 'IDR', '', '', 'Indonesian rupiah', '{symbol}{sign}{number}', 360, '{symbol}{number}', 'Rp', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 77), +(65, '', 'ILS', 2, ',', 'Israeli new sheqel', '{sign}{number} {symbol}', 376, '{number} {symbol}', '₪', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 20), +(66, '', 'INR', 2, ',', 'Indian rupee', '{sign}{number} {symbol}', 356, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 16), +(67, '', 'IQD', '', '', 'Iraqi dinar', '{sign}{number} {symbol}', 368, '{number} {symbol}', 'ع.د', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 78), +(68, '', 'IRR', 2, ',', 'Iranian rial', '{sign}{number}{symb0l}', 364, '{number} {symbol}', '﷼', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 79), +(69, '', 'ISK', 2, ',', 'Icelandic króna', '{sign}{number} {symbol}', 352, '{number} {symbol}', 'kr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 80), +(70, '', 'JMD', 2, ',', 'Jamaican dollar', '{sign}{number} {symbol}', 388, '{number} {symbol}', 'J$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 81), +(71, '', 'JOD', 2, ',', 'Jordanian dinar', '{sign}{number} {symbol}', 400, '{number} {symbol}', 'د.ا', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 82), +(72, '', 'JPY', 2, ',', 'Japanese yen', '{sign}{number} {symbol}', 392, '{number} {symbol}', '¥', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 3), +(73, '', 'KES', 2, ',', 'Kenyan shilling', '{sign}{number} {symbol}', 404, '{number} {symbol}', 'Sh', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 83), +(74, '', 'KGS', 2, ',', 'Kyrgyzstani som', '{sign}{number} {symbol}', 417, '{number} {symbol}', 'лв', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 84), +(75, '', 'KHR', 2, ',', 'Cambodian riel', '{sign}{number} {symbol}', 116, '{number} {symbol}', '៛', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 85), +(76, '', 'KMF', '', '', 'Comorian franc', '{sign}{number} {symbol}', 174, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 86), +(77, '', 'KPW', '', '', 'North Korean won', '{sign}{number} {symbol}', 408, '{number} {symbol}', '₩', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 87), +(78, '', 'KRW', '', '', 'South Korean won', '{sign}{number} {symbol}', 410, '{number} {symbol}', '₩', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 21), +(79, '', 'KWD', 2, ',', 'Kuwaiti dinar', '{sign}{number} {symbol}', 414, '{number} {symbol}', 'د.ك', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 88), +(80, '', 'KYD', 2, ',', 'Cayman Islands dollar', '{sign}{number} {symbol}', 136, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 89), +(81, '', 'KZT', 2, ',', 'Kazakhstani tenge', '{sign}{number} {symbol}', 398, '{number} {symbol}', 'лв', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 90), +(82, '', 'LAK', '', '', 'Lao kip', '{sign}{number} {symbol}', 418, '{number} {symbol}', '₭', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 91), +(83, '', 'LBP', '', '', 'Lebanese pound', '{sign}{number} {symbol}', 422, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 92), +(84, '', 'LKR', 2, ',', 'Sri Lankan rupee', '{sign}{number} {symbol}', 144, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 93), +(85, '', 'LRD', 2, ',', 'Liberian dollar', '{sign}{number} {symbol}', 430, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 94), +(86, '', 'LSL', 2, ',', 'Lesotho loti', '{sign}{number} {symbol}', 426, '{number} {symbol}', 'L', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 95), +(87, '', 'LTL', 2, ',', 'Lithuanian litas', '{sign}{number} {symbol}', 440, '{number} {symbol}', 'Lt', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 96), +(88, '', 'LVL', 2, ',', 'Latvian lats', '{sign}{number} {symbol}', 428, '{number} {symbol}', 'Ls', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 97), +(89, '', 'LYD', 3, ',', 'Libyan dinar', '{sign}{number} {symbol}', 434, '{number} {symbol}', 'ل.د', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 98), +(90, '', 'MAD', 2, ',', 'Moroccan dirham', '{sign}{number} {symbol}', 504, '{number} {symbol}', 'د.م.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 99), +(91, '', 'MDL', 2, ',', 'Moldovan leu', '{sign}{number} {symbol}', 498, '{number} {symbol}', 'L', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 100), +(92, '', 'MGA', 2, ',', 'Malagasy ariary', '{sign}{number} {symbol}', 969, '{number} {symbol}', 'MGA', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 101), +(93, '', 'MKD', 2, ',', 'Macedonian denar', '{sign}{number} {symbol}', 807, '{number} {symbol}', 'ден', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 102), +(94, '', 'MMK', 2, ',', 'Myanmar kyat', '{symbol} {sign}{number}', 104, '{number} {symbol}', 'K', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 103), +(95, '', 'MNT', 2, ',', 'Mongolian tögrög', '{sign}{number} {symbol}', 496, '{number} {symbol}', '₮', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 104), +(96, '', 'MOP', 1, ',', 'Macanese pataca', '{symbol}{sign}{number}', 446, '{symbol}{number}', 'P', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 105), +(97, '', 'MRO', 2, ',', 'Mauritanian ouguiya', '{sign}{number} {symbol}', 478, '{number} {symbol}', 'UM', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 106), +(98, '', 'MUR', 2, ',', 'Mauritian rupee', '{sign}{number} {symbol}', 480, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 107), +(99, '', 'MVR', 2, ',', 'Maldivian rufiyaa', '{sign}{number} {symbol}', 462, '{number} {symbol}', 'ރ.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 108), +(100, '', 'MWK', 2, ',', 'Malawian kwacha', '{sign}{number} {symbol}', 454, '{number} {symbol}', 'MK', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 109), +(101, '', 'MXN', 2, ',', 'Mexican peso', '{sign}{number} {symbol}', 484, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 8), +(102, '', 'MXV', 2, ',', 'Mexican Unid', '{sign}{number} {symbol}', 979, '{number} {symbol}', 'MXV', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 110), +(103, '', 'MYR', 2, ',', 'Malaysian ringgit', '{sign}{number} {symbol}', 458, '{number} {symbol}', 'RM', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 111), +(104, '', 'MZN', 2, ',', 'Mozambican metical', '{sign}{number} {symbol}', 943, '{number} {symbol}', 'MT', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 112), +(105, '', 'NAD', 2, ',', 'Namibian dollar', '{symbol} {sign}{number}', 516, '{symbol} {number}', 'N$', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 113), +(106, '', 'NGN', 2, ',', 'Nigerian naira', '{sign}{number} {symbol}', 566, '{number} {symbol}', '₦', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 114), +(107, '', 'NIO', 2, ',', 'Nicaraguan córdoba', '{sign}{number} {symbol}', 558, '{number} {symbol}', 'C$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 115), +(108, '', 'NOK', 2, ',', 'Norwegian krone', '{symbol}{sign}{number}', 578, '{symbol}{number}', 'kr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 18), +(109, '', 'NPR', 2, ',', 'Nepalese rupee', '{sign}{number} {symbol}', 524, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 116), +(110, '', 'NZD', 2, ',', 'New Zealand dollar', '{symbol}{sign}{number}', 554, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 10), +(111, '', 'OMR', 3, '.', 'Omani rial', '{sign}{number} {symbol}', 512, '{number} {symbol}', '﷼', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 117), +(112, '', 'PAB', 2, ',', 'Panamanian balboa', '{sign}{number} {symbol}', 590, '{number} {symbol}', 'B/.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 118), +(113, '', 'PEN', 2, ',', 'Peruvian nuevo sol', '{sign}{number} {symbol}', 604, '{number} {symbol}', 'S/.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 119), +(114, '', 'PGK', 2, ',', 'Papua New Guinean kina', '{sign}{number} {symbol}', 598, '{number} {symbol}', 'K', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 120), +(115, '', 'PHP', 2, ',', 'Philippine peso', '{sign}{number} {symbol}', 608, '{number} {symbol}', '₱', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 121), +(116, '', 'PKR', 2, ',', 'Pakistani rupee', '{sign}{number} {symbol}', 586, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 122), +(117, '', 'PLN', 2, ',', 'Polish Złoty', '{sign}{number} {symbol}', 985, '{number} {symbol}', 'zł', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 123), +(118, '', 'PYG', '', '', 'Paraguayan guaraní', '{symbol} {sign}{number}', 600, '{symbol} {number}', '₲', '.', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 124), +(119, '', 'QAR', 2, ',', 'Qatari riyal', '{sign}{number} {symbol}', 634, '{number} {symbol}', '﷼', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 125), +(120, '', 'RON', 2, ',', 'Romanian leu', '{sign}{number} {symbol}', 946, '{number} {symbol}', 'lei', '.', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 126), +(121, '', 'RWF', 2, ',', 'Rwandan franc', '{sign}{number} {symbol}', 646, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 128), +(122, '', 'SAR', 2, ',', 'Saudi riyal', '{sign}{number} {symbol}', 682, '{number} {symbol}', '﷼', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 129), +(123, '', 'SBD', 2, ',', 'Solomon Islands dollar', '{sign}{number} {symbol}', 90, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 130), +(124, '', 'SCR', 2, ',', 'Seychellois rupee', '{sign}{number} {symbol}', 690, '{number} {symbol}', '₨', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 131), +(125, '', 'SDG', 2, ',', 'Sudanese pound', '{sign}{number} {symbol}', 938, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 132), +(126, '', 'SEK', 2, ',', 'Swedish krona', '{sign}{number} {symbol}', 752, '{number} {symbol}', 'kr', '.', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 11), +(127, '', 'SGD', 2, ',', 'Singapore dollar', '{sign}{number} {symbol}', 702, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 14), +(128, '', 'SHP', 2, ',', 'Saint Helenian pound', '{sign}{number} {symbol}', 654, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 133), +(129, '', 'SLL', 2, ',', 'Sierra Leonean leone', '{sign}{number} {symbol}', 694, '{number} {symbol}', 'Le', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 134), +(130, '', 'SOS', 2, ',', 'Somali shilling', '{sign}{number} {symbol}', 706, '{number} {symbol}', 'S', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 135), +(131, '', 'SRD', 2, ',', 'Surinamese dollar', '{sign}{number} {symbol}', 968, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 136), +(132, '', 'STD', '', '', 'São Tomé and Príncipe dobra', '{sign}{number} {symbol}', 678, '{number} {symbol}', 'Db', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 137), +(133, '', 'RUB', 2, ',', 'Russian ruble', '{sign}{number} {symbol}', 643, '{number} {symbol}', 'руб', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 12), +(134, '', 'SVC', 2, ',', 'Salvadoran colón', '{sign}{number} {symbol}', 222, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 138), +(135, '', 'SYP', 2, ',', 'Syrian pound', '{sign}{number} {symbol}', 760, '{number} {symbol}', '£', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 139), +(136, '', 'SZL', 2, ',', 'Swazi lilangeni', '{sign}{number} {symbol}', 748, '{number} {symbol}', 'L', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 140), +(137, '', 'THB', 2, ',', 'Thai baht', '{sign}{number} {symbol}', 764, '{number} {symbol}', '฿', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 141), +(138, '', 'TJS', 2, ',', 'Tajikistani somoni', '{sign}{number} {symbol}', 972, '{number} {symbol}', 'ЅМ', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 142), +(139, '', 'TND', 3, ',', 'Tunisian dinar', '{sign}{number} {symbol}', 788, '{number} {symbol}', 'د.ت', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 143), +(140, '', 'TOP', 2, ',', 'Tongan paʻanga', '{sign}{number} {symbol}', 776, '{number} {symbol}', 'T$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 144), +(141, '', 'TRY', 2, ',', 'Turkish new lira', '{sign}{number} {symbol}', 949, '{number} {symbol}', 'YTL', '.', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 15), +(142, '', 'TTD', 2, ',', 'Trinidad and Tobago dollar', '{sign}{number} {symbol}', 780, '{number} {symbol}', 'TT$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 145), +(143, '', 'TWD', 2, ',', 'New Taiwan dollar', '{sign}{number} {symbol}', 901, '{number} {symbol}', 'NT$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 146), +(144, '', 'TZS', 2, ',', 'Tanzanian shilling', '{sign}{number} {symbol}', 834, '{number} {symbol}', 'Sh', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 147), +(145, '', 'UAH', 2, ',', 'Ukrainian hryvnia', '{sign}{number} {symbol}', 980, '{number} {symbol}', '₴', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 148), +(146, '', 'UGX', 2, ',', 'Ugandan shilling', '{sign}{number} {symbol}', 800, '{number} {symbol}', 'Sh', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 149), +(147, '', 'USD', 2, '.', 'United States dollar', '{symbol}{sign}{number}', 840, '{symbol}{number}', '$', ',', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 1), +(148, '', 'UYI', 2, ',', 'Uruguay Peso', '{sign}{number} {symbol}', 940, '{number} {symbol}', 'UYI', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 150), +(149, '', 'UYU', '', '', 'Uruguayan peso', '{symbol}{sign}{number}', 858, '{symbol} {number}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 151), +(150, '', 'UZS', 2, ',', 'Uzbekistani som', '{sign}{number} {symbol}', 860, '{number} {symbol}', 'лв', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 152), +(151, '', 'VEF', 2, ',', 'Venezuelan bolívar', '{sign}{number} {symbol}', 937, '{number} {symbol}', 'Bs', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 153), +(152, '', 'VND', '', '', 'Vietnamese Dong', '{sign}{number} {symbol}', 704, '{number} {symbol}', '₫', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 154), +(153, '', 'VUV', 2, ',', 'Vanuatu vatu', '{sign}{number} {symbol}', 548, '{number} {symbol}', 'Vt', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 155), +(154, '', 'WST', 2, ',', 'Samoan tala', '{sign}{number} {symbol}', 882, '{number} {symbol}', 'T', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 156), +(155, '', 'XAF', '', '', 'Central African CFA franc', '{sign}{number} {symbol}', 950, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 157), +(156, '', 'XCD', 2, ',', 'East Caribbean dollar', '{sign}{number} {symbol}', 951, '{number} {symbol}', '$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 158), +(157, '', 'XOF', 2, ',', 'West African CFA franc', '{sign}{number} {symbol}', 952, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 159), +(158, '', 'XPF', 2, ',', 'CFP franc', '{sign}{number} {symbol}', 953, '{number} {symbol}', 'Fr', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 160), +(159, '', 'YER', 2, ',', 'Yemeni rial', '{sign}{number} {symbol}', 886, '{number} {symbol}', '﷼', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 161), +(160, '', 'RSD', 2, ',', 'Serbian dinar', '{sign}{number} {symbol}', 941, '{number} {symbol}', 'Дин.', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 127), +(161, 'south-african-rand', 'ZAR', 2, ',', 'South African rand', '{symbol} {sign}{number}', 710, '{symbol} {number}', 'R', '', '', 1, '', 845, '0000-00-00 00:00:00', '2015-08-30 22:07:36', '', '0000-00-00 00:00:00', 2, '', 5, 22), +(162, '', 'ZMK', 2, ',', 'Zambian kwacha', '{sign}{number} {symbol}', 894, '{number} {symbol}', 'ZK', '', '', 1, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 162), +(163, '', 'ZWD', 2, ',', 'Zimbabwean dollar', '{sign}{number} {symbol}', 932, '{number} {symbol}', 'Z$', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 163), +(164, '', 'ZZZ', 2, ',', 'Reserved', '', '', '', 'O', '', '', 2, '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 1, '', '', 164); \ No newline at end of file diff --git a/admin/sql/uninstall.mysql.utf8.sql b/admin/sql/uninstall.mysql.utf8.sql index cb295c5..0c2aa88 100644 --- a/admin/sql/uninstall.mysql.utf8.sql +++ b/admin/sql/uninstall.mysql.utf8.sql @@ -1,5 +1,8 @@ DROP TABLE IF EXISTS `#__supportgroups_support_group`; +DROP TABLE IF EXISTS `#__supportgroups_payment`; +DROP TABLE IF EXISTS `#__supportgroups_clinic`; DROP TABLE IF EXISTS `#__supportgroups_location`; DROP TABLE IF EXISTS `#__supportgroups_region`; -DROP TABLE IF EXISTS `#__supportgroups_currency`; DROP TABLE IF EXISTS `#__supportgroups_country`; +DROP TABLE IF EXISTS `#__supportgroups_currency`; +DROP TABLE IF EXISTS `#__supportgroups_help_document`; diff --git a/admin/tables/clinic.php b/admin/tables/clinic.php new file mode 100644 index 0000000..2729e62 --- /dev/null +++ b/admin/tables/clinic.php @@ -0,0 +1,351 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +use Joomla\Registry\Registry; + +// import Joomla table library +jimport('joomla.database.table'); + +/** + * Clinics Table class + */ +class SupportgroupsTableClinic extends JTable +{ + /** + * Ensure the params and metadata in json encoded in the bind method + * + * @var array + * @since 3.3 + */ + protected $_jsonEncode = array('params', 'metadata'); + + /** + * Constructor + * + * @param object Database connector object + */ + function __construct(&$db) + { + parent::__construct('#__supportgroups_clinic', 'id', $db); + + // Adding History Options + JTableObserverContenthistory::createObserver($this, array('typeAlias' => 'com_supportgroups.clinic')); + } + + public function bind($array, $ignore = '') + { + + if (isset($array['params']) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = (string) $registry; + } + + if (isset($array['metadata']) && is_array($array['metadata'])) + { + $registry = new JRegistry; + $registry->loadArray($array['metadata']); + $array['metadata'] = (string) $registry; + } + + // Bind the rules. + if (isset($array['rules']) && is_array($array['rules'])) + { + $rules = new JAccessRules($array['rules']); + $this->setRules($rules); + } + return parent::bind($array, $ignore); + } + + /** + * Overload the store method for the Clinic table. + * + * @param boolean Toggle whether null values should be updated. + * @return boolean True on success, false on failure. + * @since 1.6 + */ + public function store($updateNulls = false) + { + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + if ($this->id) + { + // Existing item + $this->modified = $date->toSql(); + $this->modified_by = $user->get('id'); + } + else + { + // New clinic. A clinic created and created_by field can be set by the user, + // so we don't touch either of these if they are set. + if (!(int) $this->created) + { + $this->created = $date->toSql(); + } + if (empty($this->created_by)) + { + $this->created_by = $user->get('id'); + } + } + + if (isset($this->alias)) + { + // Verify that the alias is unique + $table = JTable::getInstance('clinic', 'SupportgroupsTable'); + + if ($table->load(array('alias' => $this->alias)) && ($table->id != $this->id || $this->id == 0)) + { + $this->setError(JText::_('COM_SUPPORTGROUPS_CLINIC_ERROR_UNIQUE_ALIAS')); + return false; + } + } + + if (isset($this->url)) + { + // Convert IDN urls to punycode + $this->url = JStringPunycode::urlToPunycode($this->url); + } + if (isset($this->website)) + { + // Convert IDN urls to punycode + $this->website = JStringPunycode::urlToPunycode($this->website); + } + + return parent::store($updateNulls); + } + + /** + * Overloaded check method to ensure data integrity. + * + * @return boolean True on success. + */ + public function check() + { + if (isset($this->alias)) + { + // Generate a valid alias + $this->generateAlias(); + + $table = JTable::getInstance('clinic', 'supportgroupsTable'); + + while ($table->load(array('alias' => $this->alias)) && ($table->id != $this->id || $this->id == 0)) + { + $this->alias = JString::increment($this->alias, 'dash'); + } + } + + /* + * Clean up keywords -- eliminate extra spaces between phrases + * and cr (\r) and lf (\n) characters from string. + * Only process if not empty. + */ + if (!empty($this->metakey)) + { + // Array of characters to remove. + $bad_characters = array("\n", "\r", "\"", "<", ">"); + + // Remove bad characters. + $after_clean = JString::str_ireplace($bad_characters, "", $this->metakey); + + // Create array using commas as delimiter. + $keys = explode(',', $after_clean); + $clean_keys = array(); + + foreach ($keys as $key) + { + // Ignore blank keywords. + if (trim($key)) + { + $clean_keys[] = trim($key); + } + } + + // Put array back together delimited by ", " + $this->metakey = implode(", ", $clean_keys); + } + + // Clean up description -- eliminate quotes and <> brackets + if (!empty($this->metadesc)) + { + // Only process if not empty + $bad_characters = array("\"", "<", ">"); + $this->metadesc = JString::str_ireplace($bad_characters, "", $this->metadesc); + } + + // If we don't have any access rules set at this point just use an empty JAccessRules class + if (!$this->getRules()) + { + $rules = $this->getDefaultAssetValues('com_supportgroups.clinic.'.$this->id); + $this->setRules($rules); + } + + // Set ordering + if ($this->published < 0) + { + // Set ordering to 0 if state is archived or trashed + $this->ordering = 0; + } + + return true; + } + + /** + * Gets the default asset values for a component. + * + * @param $string $component The component asset name to search for + * + * @return JAccessRules The JAccessRules object for the asset + */ + protected function getDefaultAssetValues($component, $try = true) + { + // Need to find the asset id by the name of the component. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('id')) + ->from($db->quoteName('#__assets')) + ->where($db->quoteName('name') . ' = ' . $db->quote($component)); + $db->setQuery($query); + $db->execute(); + if ($db->loadRowList()) + { + // asset alread set so use saved rules + $assetId = (int) $db->loadResult(); + return JAccess::getAssetRules($assetId); + } + // try again + elseif ($try) + { + $try = explode('.',$component); + $result = $this->getDefaultAssetValues($try[0], false); + if ($result instanceof JAccessRules) + { + if (isset($try[1])) + { + $_result = (string) $result; + $_result = json_decode($_result); + foreach ($_result as $name => &$rule) + { + $v = explode('.', $name); + if ($try[1] !== $v[0]) + { + // remove since it is not part of this view + unset($_result->$name); + } + else + { + // clear the value since we inherit + $rule = array(); + } + } + // check if there are any view values remaining + if (count($_result)) + { + $_result = json_encode($_result); + $_result = array($_result); + // Instantiate and return the JAccessRules object for the asset rules. + $rules = new JAccessRules; + $rules->mergeCollection($_result); + + return $rules; + } + } + return $result; + } + } + return JAccess::getAssetRules(0); + } + + /** + * Method to compute the default name of the asset. + * The default name is in the form 'table_name.id' + * where id is the value of the primary key of the table. + * + * @return string + * @since 2.5 + */ + protected function _getAssetName() + { + $k = $this->_tbl_key; + return 'com_supportgroups.clinic.'.(int) $this->$k; + } + + /** + * Method to return the title to use for the asset table. + * + * @return string + * @since 2.5 + */ + protected function _getAssetTitle() + { + if (isset($this->title)) + { + return $this->title; + } + return ''; + } + + /** + * Get the parent asset id for the record + * + * @return int + * @since 2.5 + */ + protected function _getAssetParentId(JTable $table = NULL, $id = NULL) + { + $asset = JTable::getInstance('Asset'); + $asset->loadByName('com_supportgroups'); + + return $asset->id; + } + + /** + * Generate a valid alias from title / date. + * Remains public to be able to check for duplicated alias before saving + * + * @return string + */ + public function generateAlias() + { + if (empty($this->alias)) + { + $this->alias = $this->name; + } + + $this->alias = JApplication::stringURLSafe($this->alias); + + if (trim(str_replace('-', '', $this->alias)) == '') + { + $this->alias = JFactory::getDate()->format("Y-m-d-H-i-s"); + } + + return $this->alias; + } + +} diff --git a/admin/tables/help_document.php b/admin/tables/help_document.php new file mode 100644 index 0000000..648353d --- /dev/null +++ b/admin/tables/help_document.php @@ -0,0 +1,351 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +use Joomla\Registry\Registry; + +// import Joomla table library +jimport('joomla.database.table'); + +/** + * Help_documents Table class + */ +class SupportgroupsTableHelp_document extends JTable +{ + /** + * Ensure the params and metadata in json encoded in the bind method + * + * @var array + * @since 3.3 + */ + protected $_jsonEncode = array('params', 'metadata'); + + /** + * Constructor + * + * @param object Database connector object + */ + function __construct(&$db) + { + parent::__construct('#__supportgroups_help_document', 'id', $db); + + // Adding History Options + JTableObserverContenthistory::createObserver($this, array('typeAlias' => 'com_supportgroups.help_document')); + } + + public function bind($array, $ignore = '') + { + + if (isset($array['params']) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = (string) $registry; + } + + if (isset($array['metadata']) && is_array($array['metadata'])) + { + $registry = new JRegistry; + $registry->loadArray($array['metadata']); + $array['metadata'] = (string) $registry; + } + + // Bind the rules. + if (isset($array['rules']) && is_array($array['rules'])) + { + $rules = new JAccessRules($array['rules']); + $this->setRules($rules); + } + return parent::bind($array, $ignore); + } + + /** + * Overload the store method for the Help_document table. + * + * @param boolean Toggle whether null values should be updated. + * @return boolean True on success, false on failure. + * @since 1.6 + */ + public function store($updateNulls = false) + { + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + if ($this->id) + { + // Existing item + $this->modified = $date->toSql(); + $this->modified_by = $user->get('id'); + } + else + { + // New help_document. A help_document created and created_by field can be set by the user, + // so we don't touch either of these if they are set. + if (!(int) $this->created) + { + $this->created = $date->toSql(); + } + if (empty($this->created_by)) + { + $this->created_by = $user->get('id'); + } + } + + if (isset($this->alias)) + { + // Verify that the alias is unique + $table = JTable::getInstance('help_document', 'SupportgroupsTable'); + + if ($table->load(array('alias' => $this->alias)) && ($table->id != $this->id || $this->id == 0)) + { + $this->setError(JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_ERROR_UNIQUE_ALIAS')); + return false; + } + } + + if (isset($this->url)) + { + // Convert IDN urls to punycode + $this->url = JStringPunycode::urlToPunycode($this->url); + } + if (isset($this->website)) + { + // Convert IDN urls to punycode + $this->website = JStringPunycode::urlToPunycode($this->website); + } + + return parent::store($updateNulls); + } + + /** + * Overloaded check method to ensure data integrity. + * + * @return boolean True on success. + */ + public function check() + { + if (isset($this->alias)) + { + // Generate a valid alias + $this->generateAlias(); + + $table = JTable::getInstance('help_document', 'supportgroupsTable'); + + while ($table->load(array('alias' => $this->alias)) && ($table->id != $this->id || $this->id == 0)) + { + $this->alias = JString::increment($this->alias, 'dash'); + } + } + + /* + * Clean up keywords -- eliminate extra spaces between phrases + * and cr (\r) and lf (\n) characters from string. + * Only process if not empty. + */ + if (!empty($this->metakey)) + { + // Array of characters to remove. + $bad_characters = array("\n", "\r", "\"", "<", ">"); + + // Remove bad characters. + $after_clean = JString::str_ireplace($bad_characters, "", $this->metakey); + + // Create array using commas as delimiter. + $keys = explode(',', $after_clean); + $clean_keys = array(); + + foreach ($keys as $key) + { + // Ignore blank keywords. + if (trim($key)) + { + $clean_keys[] = trim($key); + } + } + + // Put array back together delimited by ", " + $this->metakey = implode(", ", $clean_keys); + } + + // Clean up description -- eliminate quotes and <> brackets + if (!empty($this->metadesc)) + { + // Only process if not empty + $bad_characters = array("\"", "<", ">"); + $this->metadesc = JString::str_ireplace($bad_characters, "", $this->metadesc); + } + + // If we don't have any access rules set at this point just use an empty JAccessRules class + if (!$this->getRules()) + { + $rules = $this->getDefaultAssetValues('com_supportgroups.help_document.'.$this->id); + $this->setRules($rules); + } + + // Set ordering + if ($this->published < 0) + { + // Set ordering to 0 if state is archived or trashed + $this->ordering = 0; + } + + return true; + } + + /** + * Gets the default asset values for a component. + * + * @param $string $component The component asset name to search for + * + * @return JAccessRules The JAccessRules object for the asset + */ + protected function getDefaultAssetValues($component, $try = true) + { + // Need to find the asset id by the name of the component. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('id')) + ->from($db->quoteName('#__assets')) + ->where($db->quoteName('name') . ' = ' . $db->quote($component)); + $db->setQuery($query); + $db->execute(); + if ($db->loadRowList()) + { + // asset alread set so use saved rules + $assetId = (int) $db->loadResult(); + return JAccess::getAssetRules($assetId); + } + // try again + elseif ($try) + { + $try = explode('.',$component); + $result = $this->getDefaultAssetValues($try[0], false); + if ($result instanceof JAccessRules) + { + if (isset($try[1])) + { + $_result = (string) $result; + $_result = json_decode($_result); + foreach ($_result as $name => &$rule) + { + $v = explode('.', $name); + if ($try[1] !== $v[0]) + { + // remove since it is not part of this view + unset($_result->$name); + } + else + { + // clear the value since we inherit + $rule = array(); + } + } + // check if there are any view values remaining + if (count($_result)) + { + $_result = json_encode($_result); + $_result = array($_result); + // Instantiate and return the JAccessRules object for the asset rules. + $rules = new JAccessRules; + $rules->mergeCollection($_result); + + return $rules; + } + } + return $result; + } + } + return JAccess::getAssetRules(0); + } + + /** + * Method to compute the default name of the asset. + * The default name is in the form 'table_name.id' + * where id is the value of the primary key of the table. + * + * @return string + * @since 2.5 + */ + protected function _getAssetName() + { + $k = $this->_tbl_key; + return 'com_supportgroups.help_document.'.(int) $this->$k; + } + + /** + * Method to return the title to use for the asset table. + * + * @return string + * @since 2.5 + */ + protected function _getAssetTitle() + { + if (isset($this->title)) + { + return $this->title; + } + return ''; + } + + /** + * Get the parent asset id for the record + * + * @return int + * @since 2.5 + */ + protected function _getAssetParentId(JTable $table = NULL, $id = NULL) + { + $asset = JTable::getInstance('Asset'); + $asset->loadByName('com_supportgroups'); + + return $asset->id; + } + + /** + * Generate a valid alias from title / date. + * Remains public to be able to check for duplicated alias before saving + * + * @return string + */ + public function generateAlias() + { + if (empty($this->alias)) + { + $this->alias = $this->name; + } + + $this->alias = JApplication::stringURLSafe($this->alias); + + if (trim(str_replace('-', '', $this->alias)) == '') + { + $this->alias = JFactory::getDate()->format("Y-m-d-H-i-s"); + } + + return $this->alias; + } + +} diff --git a/admin/tables/payment.php b/admin/tables/payment.php new file mode 100644 index 0000000..d816df6 --- /dev/null +++ b/admin/tables/payment.php @@ -0,0 +1,351 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +use Joomla\Registry\Registry; + +// import Joomla table library +jimport('joomla.database.table'); + +/** + * Payments Table class + */ +class SupportgroupsTablePayment extends JTable +{ + /** + * Ensure the params and metadata in json encoded in the bind method + * + * @var array + * @since 3.3 + */ + protected $_jsonEncode = array('params', 'metadata'); + + /** + * Constructor + * + * @param object Database connector object + */ + function __construct(&$db) + { + parent::__construct('#__supportgroups_payment', 'id', $db); + + // Adding History Options + JTableObserverContenthistory::createObserver($this, array('typeAlias' => 'com_supportgroups.payment')); + } + + public function bind($array, $ignore = '') + { + + if (isset($array['params']) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = (string) $registry; + } + + if (isset($array['metadata']) && is_array($array['metadata'])) + { + $registry = new JRegistry; + $registry->loadArray($array['metadata']); + $array['metadata'] = (string) $registry; + } + + // Bind the rules. + if (isset($array['rules']) && is_array($array['rules'])) + { + $rules = new JAccessRules($array['rules']); + $this->setRules($rules); + } + return parent::bind($array, $ignore); + } + + /** + * Overload the store method for the Payment table. + * + * @param boolean Toggle whether null values should be updated. + * @return boolean True on success, false on failure. + * @since 1.6 + */ + public function store($updateNulls = false) + { + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + if ($this->id) + { + // Existing item + $this->modified = $date->toSql(); + $this->modified_by = $user->get('id'); + } + else + { + // New payment. A payment created and created_by field can be set by the user, + // so we don't touch either of these if they are set. + if (!(int) $this->created) + { + $this->created = $date->toSql(); + } + if (empty($this->created_by)) + { + $this->created_by = $user->get('id'); + } + } + + if (isset($this->alias)) + { + // Verify that the alias is unique + $table = JTable::getInstance('payment', 'SupportgroupsTable'); + + if ($table->load(array('alias' => $this->alias)) && ($table->id != $this->id || $this->id == 0)) + { + $this->setError(JText::_('COM_SUPPORTGROUPS_PAYMENT_ERROR_UNIQUE_ALIAS')); + return false; + } + } + + if (isset($this->url)) + { + // Convert IDN urls to punycode + $this->url = JStringPunycode::urlToPunycode($this->url); + } + if (isset($this->website)) + { + // Convert IDN urls to punycode + $this->website = JStringPunycode::urlToPunycode($this->website); + } + + return parent::store($updateNulls); + } + + /** + * Overloaded check method to ensure data integrity. + * + * @return boolean True on success. + */ + public function check() + { + if (isset($this->alias)) + { + // Generate a valid alias + $this->generateAlias(); + + $table = JTable::getInstance('payment', 'supportgroupsTable'); + + while ($table->load(array('alias' => $this->alias)) && ($table->id != $this->id || $this->id == 0)) + { + $this->alias = JString::increment($this->alias, 'dash'); + } + } + + /* + * Clean up keywords -- eliminate extra spaces between phrases + * and cr (\r) and lf (\n) characters from string. + * Only process if not empty. + */ + if (!empty($this->metakey)) + { + // Array of characters to remove. + $bad_characters = array("\n", "\r", "\"", "<", ">"); + + // Remove bad characters. + $after_clean = JString::str_ireplace($bad_characters, "", $this->metakey); + + // Create array using commas as delimiter. + $keys = explode(',', $after_clean); + $clean_keys = array(); + + foreach ($keys as $key) + { + // Ignore blank keywords. + if (trim($key)) + { + $clean_keys[] = trim($key); + } + } + + // Put array back together delimited by ", " + $this->metakey = implode(", ", $clean_keys); + } + + // Clean up description -- eliminate quotes and <> brackets + if (!empty($this->metadesc)) + { + // Only process if not empty + $bad_characters = array("\"", "<", ">"); + $this->metadesc = JString::str_ireplace($bad_characters, "", $this->metadesc); + } + + // If we don't have any access rules set at this point just use an empty JAccessRules class + if (!$this->getRules()) + { + $rules = $this->getDefaultAssetValues('com_supportgroups.payment.'.$this->id); + $this->setRules($rules); + } + + // Set ordering + if ($this->published < 0) + { + // Set ordering to 0 if state is archived or trashed + $this->ordering = 0; + } + + return true; + } + + /** + * Gets the default asset values for a component. + * + * @param $string $component The component asset name to search for + * + * @return JAccessRules The JAccessRules object for the asset + */ + protected function getDefaultAssetValues($component, $try = true) + { + // Need to find the asset id by the name of the component. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('id')) + ->from($db->quoteName('#__assets')) + ->where($db->quoteName('name') . ' = ' . $db->quote($component)); + $db->setQuery($query); + $db->execute(); + if ($db->loadRowList()) + { + // asset alread set so use saved rules + $assetId = (int) $db->loadResult(); + return JAccess::getAssetRules($assetId); + } + // try again + elseif ($try) + { + $try = explode('.',$component); + $result = $this->getDefaultAssetValues($try[0], false); + if ($result instanceof JAccessRules) + { + if (isset($try[1])) + { + $_result = (string) $result; + $_result = json_decode($_result); + foreach ($_result as $name => &$rule) + { + $v = explode('.', $name); + if ($try[1] !== $v[0]) + { + // remove since it is not part of this view + unset($_result->$name); + } + else + { + // clear the value since we inherit + $rule = array(); + } + } + // check if there are any view values remaining + if (count($_result)) + { + $_result = json_encode($_result); + $_result = array($_result); + // Instantiate and return the JAccessRules object for the asset rules. + $rules = new JAccessRules; + $rules->mergeCollection($_result); + + return $rules; + } + } + return $result; + } + } + return JAccess::getAssetRules(0); + } + + /** + * Method to compute the default name of the asset. + * The default name is in the form 'table_name.id' + * where id is the value of the primary key of the table. + * + * @return string + * @since 2.5 + */ + protected function _getAssetName() + { + $k = $this->_tbl_key; + return 'com_supportgroups.payment.'.(int) $this->$k; + } + + /** + * Method to return the title to use for the asset table. + * + * @return string + * @since 2.5 + */ + protected function _getAssetTitle() + { + if (isset($this->title)) + { + return $this->title; + } + return ''; + } + + /** + * Get the parent asset id for the record + * + * @return int + * @since 2.5 + */ + protected function _getAssetParentId(JTable $table = NULL, $id = NULL) + { + $asset = JTable::getInstance('Asset'); + $asset->loadByName('com_supportgroups'); + + return $asset->id; + } + + /** + * Generate a valid alias from title / date. + * Remains public to be able to check for duplicated alias before saving + * + * @return string + */ + public function generateAlias() + { + if (empty($this->alias)) + { + $this->alias = $this->name; + } + + $this->alias = JApplication::stringURLSafe($this->alias); + + if (trim(str_replace('-', '', $this->alias)) == '') + { + $this->alias = JFactory::getDate()->format("Y-m-d-H-i-s"); + } + + return $this->alias; + } + +} diff --git a/admin/views/clinic/submitbutton.js b/admin/views/clinic/submitbutton.js new file mode 100644 index 0000000..9bcccff --- /dev/null +++ b/admin/views/clinic/submitbutton.js @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage submitbutton.js + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +Joomla.submitbutton = function(task) +{ + if (task == ''){ + return false; + } else { + var isValid=true; + var action = task.split('.'); + if (action[1] != 'cancel' && action[1] != 'close'){ + var forms = $$('form.form-validate'); + for (var i=0;i + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html'); +JHtml::_('behavior.tooltip'); +JHtml::_('behavior.formvalidation'); +JHtml::_('formbehavior.chosen', 'select'); +JHtml::_('behavior.keepalive'); +$componentParams = JComponentHelper::getParams('com_supportgroups'); +?> + +
+ +
+ + 'details')); ?> + + +
+
+
+
+ +
+
+ + + canDo->get('clinic.delete') || $this->canDo->get('clinic.edit.created_by') || $this->canDo->get('clinic.edit.state') || $this->canDo->get('clinic.edit.created')) : ?> + +
+
+ +
+
+ +
+
+ + + + canDo->get('core.admin')) : ?> + +
+
+
+
+ form->getFieldset('accesscontrol') as $field): ?> +
+ label; echo $field->input;?> +
+
+ +
+
+
+
+ + + + + +
+ + +
+
+ +
+ +
diff --git a/admin/views/clinic/tmpl/index.html b/admin/views/clinic/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/views/clinic/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/views/clinic/view.html.php b/admin/views/clinic/view.html.php new file mode 100644 index 0000000..5e0a94a --- /dev/null +++ b/admin/views/clinic/view.html.php @@ -0,0 +1,200 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla view library +jimport('joomla.application.component.view'); + +/** + * Clinic View class + */ +class SupportgroupsViewClinic extends JViewLegacy +{ + /** + * display method of View + * @return void + */ + public function display($tpl = null) + { + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
', $errors)); + return false; + } + + // Assign the variables + $this->form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->script = $this->get('Script'); + $this->state = $this->get('State'); + // get action permissions + $this->canDo = SupportgroupsHelper::getActions('clinic',$this->item); + // get input + $jinput = JFactory::getApplication()->input; + $this->ref = $jinput->get('ref', 0, 'word'); + $this->refid = $jinput->get('refid', 0, 'int'); + $this->referral = ''; + if ($this->refid) + { + // return to the item that refered to this item + $this->referral = '&ref='.(string)$this->ref.'&refid='.(int)$this->refid; + } + elseif($this->ref) + { + // return to the list view that refered to this item + $this->referral = '&ref='.(string)$this->ref; + } + + // Set the toolbar + $this->addToolBar(); + + // Display the template + parent::display($tpl); + + // Set the document + $this->setDocument(); + } + + + /** + * Setting the toolbar + */ + protected function addToolBar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + $user = JFactory::getUser(); + $userId = $user->id; + $isNew = $this->item->id == 0; + + JToolbarHelper::title( JText::_($isNew ? 'COM_SUPPORTGROUPS_CLINIC_NEW' : 'COM_SUPPORTGROUPS_CLINIC_EDIT'), 'pencil-2 article-add'); + // Built the actions for new and existing records. + if ($this->refid || $this->ref) + { + if ($this->canDo->get('clinic.create') && $isNew) + { + // We can create the record. + JToolBarHelper::save('clinic.save', 'JTOOLBAR_SAVE'); + } + elseif ($this->canDo->get('clinic.edit')) + { + // We can save the record. + JToolBarHelper::save('clinic.save', 'JTOOLBAR_SAVE'); + } + if ($isNew) + { + // Do not creat but cancel. + JToolBarHelper::cancel('clinic.cancel', 'JTOOLBAR_CANCEL'); + } + else + { + // We can close it. + JToolBarHelper::cancel('clinic.cancel', 'JTOOLBAR_CLOSE'); + } + } + else + { + if ($isNew) + { + // For new records, check the create permission. + if ($this->canDo->get('clinic.create')) + { + JToolBarHelper::apply('clinic.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save('clinic.save', 'JTOOLBAR_SAVE'); + JToolBarHelper::custom('clinic.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false); + }; + JToolBarHelper::cancel('clinic.cancel', 'JTOOLBAR_CANCEL'); + } + else + { + if ($this->canDo->get('clinic.edit')) + { + // We can save the new record + JToolBarHelper::apply('clinic.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save('clinic.save', 'JTOOLBAR_SAVE'); + // We can save this record, but check the create permission to see + // if we can return to make a new one. + if ($this->canDo->get('clinic.create')) + { + JToolBarHelper::custom('clinic.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false); + } + } + $canVersion = ($this->canDo->get('core.version') && $this->canDo->get('clinic.version')); + if ($this->state->params->get('save_history', 1) && $this->canDo->get('clinic.edit') && $canVersion) + { + JToolbarHelper::versions('com_supportgroups.clinic', $this->item->id); + } + if ($this->canDo->get('clinic.create')) + { + JToolBarHelper::custom('clinic.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false); + } + JToolBarHelper::cancel('clinic.cancel', 'JTOOLBAR_CLOSE'); + } + } + JToolbarHelper::divider(); + // set help url for this view if found + $help_url = SupportgroupsHelper::getHelpUrl('clinic'); + if (SupportgroupsHelper::checkString($help_url)) + { + JToolbarHelper::help('COM_SUPPORTGROUPS_HELP_MANAGER', false, $help_url); + } + } + + /** + * Escapes a value for output in a view script. + * + * @param mixed $var The output to escape. + * + * @return mixed The escaped value. + */ + public function escape($var) + { + if(strlen($var) > 30) + { + // use the helper htmlEscape method instead and shorten the string + return SupportgroupsHelper::htmlEscape($var, $this->_charset, true, 30); + } + // use the helper htmlEscape method instead. + return SupportgroupsHelper::htmlEscape($var, $this->_charset); + } + + /** + * Method to set up the document properties + * + * @return void + */ + protected function setDocument() + { + $isNew = ($this->item->id < 1); + $document = JFactory::getDocument(); + $document->setTitle(JText::_($isNew ? 'COM_SUPPORTGROUPS_CLINIC_NEW' : 'COM_SUPPORTGROUPS_CLINIC_EDIT')); + $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/clinic.css"); + $document->addScript(JURI::root() . $this->script); + $document->addScript(JURI::root() . "administrator/components/com_supportgroups/views/clinic/submitbutton.js"); + JText::script('view not acceptable. Error'); + } +} diff --git a/admin/views/clinics/index.html b/admin/views/clinics/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/views/clinics/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/views/clinics/tmpl/default.php b/admin/views/clinics/tmpl/default.php new file mode 100644 index 0000000..b87186f --- /dev/null +++ b/admin/views/clinics/tmpl/default.php @@ -0,0 +1,99 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// load tooltip behavior +JHtml::_('behavior.tooltip'); +JHtml::_('behavior.multiselect'); +JHtml::_('dropdown.init'); +JHtml::_('formbehavior.chosen', 'select'); + +if ($this->saveOrder) +{ + $saveOrderingUrl = 'index.php?option=com_supportgroups&task=clinics.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'clinicList', 'adminForm', strtolower($this->listDirn), $saveOrderingUrl); +} + +?> + +
+sidebar)): ?> +
+ sidebar; ?> +
+
+ +
+ +items)): ?> + loadTemplate('toolbar');?> +
+ +
+ + loadTemplate('toolbar');?> + + loadTemplate('head');?> + loadTemplate('foot');?> + loadTemplate('body');?> +
+ + canCreate && $this->canEdit) : ?> + JText::_('COM_SUPPORTGROUPS_CLINICS_BATCH_OPTIONS'), + 'footer' => $this->loadTemplate('batch_footer') + ), + $this->loadTemplate('batch_body') + ); ?> + + + + +
+ + + + \ No newline at end of file diff --git a/admin/views/clinics/tmpl/default_batch_body.php b/admin/views/clinics/tmpl/default_batch_body.php new file mode 100644 index 0000000..0bfc18d --- /dev/null +++ b/admin/views/clinics/tmpl/default_batch_body.php @@ -0,0 +1,32 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + +

+batchDisplay; ?> \ No newline at end of file diff --git a/admin/views/clinics/tmpl/default_batch_footer.php b/admin/views/clinics/tmpl/default_batch_footer.php new file mode 100644 index 0000000..3d1745a --- /dev/null +++ b/admin/views/clinics/tmpl/default_batch_footer.php @@ -0,0 +1,37 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + + + + \ No newline at end of file diff --git a/admin/views/clinics/tmpl/default_body.php b/admin/views/clinics/tmpl/default_body.php new file mode 100644 index 0000000..ee31a00 --- /dev/null +++ b/admin/views/clinics/tmpl/default_body.php @@ -0,0 +1,111 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +$edit = "index.php?option=com_supportgroups&view=clinics&task=clinic.edit"; + +?> +items as $i => $item): ?> + user->authorise('core.manage', 'com_checkin') || $item->checked_out == $this->user->id || $item->checked_out == 0; + $userChkOut = JFactory::getUser($item->checked_out); + $canDo = SupportgroupsHelper::getActions('clinic',$item,'clinics'); + ?> + + + get('clinic.edit.state')): ?> + saveOrder) + { + $iconClass = ' inactive'; + } + else + { + $iconClass = ' inactive tip-top" hasTooltip" title="' . JHtml::tooltipText('JORDERINGDISABLED'); + } + ?> + + + + saveOrder) : ?> + + + + ⋮ + + + + get('clinic.edit')): ?> + checked_out) : ?> + + id); ?> + + □ + + + id); ?> + + + □ + + + + get('clinic.edit')): ?> +
+ escape($item->name); ?> + checked_out): ?> + name, $item->checked_out_time, 'clinics.', $canCheckin); ?> + +
+ +
escape($item->name); ?>
+ + + + escape($item->phone); ?> + + + get('clinic.edit.state')) : ?> + checked_out) : ?> + + published, $i, 'clinics.', true, 'cb'); ?> + + published, $i, 'clinics.', false, 'cb'); ?> + + + published, $i, 'clinics.', true, 'cb'); ?> + + + published, $i, 'clinics.', false, 'cb'); ?> + + + + id; ?> + + + \ No newline at end of file diff --git a/admin/views/clinics/tmpl/default_foot.php b/admin/views/clinics/tmpl/default_foot.php new file mode 100644 index 0000000..a1195e8 --- /dev/null +++ b/admin/views/clinics/tmpl/default_foot.php @@ -0,0 +1,32 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + + pagination->getListFooter(); ?> + \ No newline at end of file diff --git a/admin/views/clinics/tmpl/default_head.php b/admin/views/clinics/tmpl/default_head.php new file mode 100644 index 0000000..bc41afe --- /dev/null +++ b/admin/views/clinics/tmpl/default_head.php @@ -0,0 +1,64 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + + canEdit&& $this->canState): ?> + +
', 'ordering', $this->listDirn, $this->listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?> + + + + + + + ▾ + + + ■ + + + + listDirn, $this->listOrder); ?> + + + listDirn, $this->listOrder); ?> + + canState): ?> + + listDirn, $this->listOrder); ?> + + + + + + + + listDirn, $this->listOrder); ?> + + \ No newline at end of file diff --git a/admin/views/clinics/tmpl/default_toolbar.php b/admin/views/clinics/tmpl/default_toolbar.php new file mode 100644 index 0000000..847c958 --- /dev/null +++ b/admin/views/clinics/tmpl/default_toolbar.php @@ -0,0 +1,59 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> +
+ +
+ + +
+
+ + pagination->getLimitBox(); ?> +
+
+ + +
+
+ + +
+
+
\ No newline at end of file diff --git a/admin/views/clinics/tmpl/index.html b/admin/views/clinics/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/views/clinics/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/views/clinics/view.html.php b/admin/views/clinics/view.html.php new file mode 100644 index 0000000..6602a8b --- /dev/null +++ b/admin/views/clinics/view.html.php @@ -0,0 +1,251 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla view library +jimport('joomla.application.component.view'); + +/** + * Supportgroups View class for the Clinics + */ +class SupportgroupsViewClinics extends JViewLegacy +{ + /** + * Clinics view display method + * @return void + */ + function display($tpl = null) + { + if ($this->getLayout() !== 'modal') + { + // Include helper submenu + SupportgroupsHelper::addSubmenu('clinics'); + } + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
', $errors)); + return false; + } + + // Assign data to the view + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->user = JFactory::getUser(); + $this->listOrder = $this->escape($this->state->get('list.ordering')); + $this->listDirn = $this->escape($this->state->get('list.direction')); + $this->saveOrder = $this->listOrder == 'ordering'; + // get global action permissions + $this->canDo = SupportgroupsHelper::getActions('clinic'); + $this->canEdit = $this->canDo->get('clinic.edit'); + $this->canState = $this->canDo->get('clinic.edit.state'); + $this->canCreate = $this->canDo->get('clinic.create'); + $this->canDelete = $this->canDo->get('clinic.delete'); + $this->canBatch = $this->canDo->get('core.batch'); + + // We don't need toolbar in the modal window. + if ($this->getLayout() !== 'modal') + { + $this->addToolbar(); + $this->sidebar = JHtmlSidebar::render(); + // load the batch html + if ($this->canCreate && $this->canEdit && $this->canState) + { + $this->batchDisplay = JHtmlBatch_::render(); + } + } + + // Display the template + parent::display($tpl); + + // Set the document + $this->setDocument(); + } + + /** + * Setting the toolbar + */ + protected function addToolBar() + { + JToolBarHelper::title(JText::_('COM_SUPPORTGROUPS_CLINICS'), 'health'); + JHtmlSidebar::setAction('index.php?option=com_supportgroups&view=clinics'); + JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields'); + + if ($this->canCreate) + { + JToolBarHelper::addNew('clinic.add'); + } + + // Only load if there are items + if (SupportgroupsHelper::checkArray($this->items)) + { + if ($this->canEdit) + { + JToolBarHelper::editList('clinic.edit'); + } + + if ($this->canState) + { + JToolBarHelper::publishList('clinics.publish'); + JToolBarHelper::unpublishList('clinics.unpublish'); + JToolBarHelper::archiveList('clinics.archive'); + + if ($this->canDo->get('core.admin')) + { + JToolBarHelper::checkin('clinics.checkin'); + } + } + + // Add a batch button + if ($this->canBatch && $this->canCreate && $this->canEdit && $this->canState) + { + // Get the toolbar object instance + $bar = JToolBar::getInstance('toolbar'); + // set the batch button name + $title = JText::_('JTOOLBAR_BATCH'); + // Instantiate a new JLayoutFile instance and render the batch button + $layout = new JLayoutFile('joomla.toolbar.batch'); + // add the button to the page + $dhtml = $layout->render(array('title' => $title)); + $bar->appendButton('Custom', $dhtml, 'batch'); + } + + if ($this->state->get('filter.published') == -2 && ($this->canState && $this->canDelete)) + { + JToolbarHelper::deleteList('', 'clinics.delete', 'JTOOLBAR_EMPTY_TRASH'); + } + elseif ($this->canState && $this->canDelete) + { + JToolbarHelper::trash('clinics.trash'); + } + + if ($this->canDo->get('core.export') && $this->canDo->get('clinic.export')) + { + JToolBarHelper::custom('clinics.exportData', 'download', '', 'COM_SUPPORTGROUPS_EXPORT_DATA', true); + } + } + + if ($this->canDo->get('core.import') && $this->canDo->get('clinic.import')) + { + JToolBarHelper::custom('clinics.importData', 'upload', '', 'COM_SUPPORTGROUPS_IMPORT_DATA', false); + } + + // set help url for this view if found + $help_url = SupportgroupsHelper::getHelpUrl('clinics'); + if (SupportgroupsHelper::checkString($help_url)) + { + JToolbarHelper::help('COM_SUPPORTGROUPS_HELP_MANAGER', false, $help_url); + } + + // add the options comp button + if ($this->canDo->get('core.admin') || $this->canDo->get('core.options')) + { + JToolBarHelper::preferences('com_supportgroups'); + } + + if ($this->canState) + { + JHtmlSidebar::addFilter( + JText::_('JOPTION_SELECT_PUBLISHED'), + 'filter_published', + JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true) + ); + // only load if batch allowed + if ($this->canBatch) + { + JHtmlBatch_::addListSelection( + JText::_('COM_SUPPORTGROUPS_KEEP_ORIGINAL_STATE'), + 'batch[published]', + JHtml::_('select.options', JHtml::_('jgrid.publishedOptions', array('all' => false)), 'value', 'text', '', true) + ); + } + } + + JHtmlSidebar::addFilter( + JText::_('JOPTION_SELECT_ACCESS'), + 'filter_access', + JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + JHtmlBatch_::addListSelection( + JText::_('COM_SUPPORTGROUPS_KEEP_ORIGINAL_ACCESS'), + 'batch[access]', + JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text') + ); + } + } + + /** + * Method to set up the document properties + * + * @return void + */ + protected function setDocument() + { + $document = JFactory::getDocument(); + $document->setTitle(JText::_('COM_SUPPORTGROUPS_CLINICS')); + $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/clinics.css"); + } + + /** + * Escapes a value for output in a view script. + * + * @param mixed $var The output to escape. + * + * @return mixed The escaped value. + */ + public function escape($var) + { + if(strlen($var) > 50) + { + // use the helper htmlEscape method instead and shorten the string + return SupportgroupsHelper::htmlEscape($var, $this->_charset, true); + } + // use the helper htmlEscape method instead. + return SupportgroupsHelper::htmlEscape($var, $this->_charset); + } + + /** + * Returns an array of fields the table can be sorted by + * + * @return array Array containing the field name to sort by as the key and display text as value + */ + protected function getSortFields() + { + return array( + 'a.sorting' => JText::_('JGRID_HEADING_ORDERING'), + 'a.published' => JText::_('JSTATUS'), + 'a.name' => JText::_('COM_SUPPORTGROUPS_CLINIC_NAME_LABEL'), + 'a.phone' => JText::_('COM_SUPPORTGROUPS_CLINIC_PHONE_LABEL'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } +} diff --git a/admin/views/country/tmpl/edit.php b/admin/views/country/tmpl/edit.php index 7c1acb8..3cf1a2f 100644 --- a/admin/views/country/tmpl/edit.php +++ b/admin/views/country/tmpl/edit.php @@ -51,6 +51,7 @@ $componentParams = JComponentHelper::getParams('com_supportgroups');
+ canDo->get('region.access')) : ?>
@@ -60,6 +61,7 @@ $componentParams = JComponentHelper::getParams('com_supportgroups');
+ canDo->get('country.delete') || $this->canDo->get('core.edit.created_by') || $this->canDo->get('country.edit.state') || $this->canDo->get('core.edit.created')) : ?> diff --git a/admin/views/country/view.html.php b/admin/views/country/view.html.php index dd7c41c..d3eca6e 100644 --- a/admin/views/country/view.html.php +++ b/admin/views/country/view.html.php @@ -71,7 +71,7 @@ class SupportgroupsViewCountry extends JViewLegacy } // Get Linked view data - $this->vvvregions = $this->get('Vvvregions'); + $this->vvyregions = $this->get('Vvyregions'); // Set the toolbar $this->addToolBar(); diff --git a/admin/views/help_document/submitbutton.js b/admin/views/help_document/submitbutton.js new file mode 100644 index 0000000..cefd160 --- /dev/null +++ b/admin/views/help_document/submitbutton.js @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage submitbutton.js + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +Joomla.submitbutton = function(task) +{ + if (task == ''){ + return false; + } else { + var isValid=true; + var action = task.split('.'); + if (action[1] != 'cancel' && action[1] != 'close'){ + var forms = $$('form.form-validate'); + for (var i=0;i + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html'); +JHtml::_('behavior.tooltip'); +JHtml::_('behavior.formvalidation'); +JHtml::_('formbehavior.chosen', 'select'); +JHtml::_('behavior.keepalive'); +$componentParams = JComponentHelper::getParams('com_supportgroups'); +?> + +
+ +
+ + 'details')); ?> + + +
+
+ +
+
+ +
+
+
+
+ +
+
+ + + canDo->get('help_document.delete') || $this->canDo->get('core.edit.created_by') || $this->canDo->get('help_document.edit.state') || $this->canDo->get('core.edit.created')) : ?> + +
+
+ +
+
+ +
+
+ + + + canDo->get('core.admin')) : ?> + +
+
+
+
+ form->getFieldset('accesscontrol') as $field): ?> +
+ label; echo $field->input;?> +
+
+ +
+
+
+
+ + + + + +
+ + +
+
+ +
+ +
+ + diff --git a/admin/views/help_document/tmpl/index.html b/admin/views/help_document/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/views/help_document/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/views/help_document/view.html.php b/admin/views/help_document/view.html.php new file mode 100644 index 0000000..93bee6d --- /dev/null +++ b/admin/views/help_document/view.html.php @@ -0,0 +1,200 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla view library +jimport('joomla.application.component.view'); + +/** + * Help_document View class + */ +class SupportgroupsViewHelp_document extends JViewLegacy +{ + /** + * display method of View + * @return void + */ + public function display($tpl = null) + { + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
', $errors)); + return false; + } + + // Assign the variables + $this->form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->script = $this->get('Script'); + $this->state = $this->get('State'); + // get action permissions + $this->canDo = SupportgroupsHelper::getActions('help_document',$this->item); + // get input + $jinput = JFactory::getApplication()->input; + $this->ref = $jinput->get('ref', 0, 'word'); + $this->refid = $jinput->get('refid', 0, 'int'); + $this->referral = ''; + if ($this->refid) + { + // return to the item that refered to this item + $this->referral = '&ref='.(string)$this->ref.'&refid='.(int)$this->refid; + } + elseif($this->ref) + { + // return to the list view that refered to this item + $this->referral = '&ref='.(string)$this->ref; + } + + // Set the toolbar + $this->addToolBar(); + + // Display the template + parent::display($tpl); + + // Set the document + $this->setDocument(); + } + + + /** + * Setting the toolbar + */ + protected function addToolBar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + $user = JFactory::getUser(); + $userId = $user->id; + $isNew = $this->item->id == 0; + + JToolbarHelper::title( JText::_($isNew ? 'COM_SUPPORTGROUPS_HELP_DOCUMENT_NEW' : 'COM_SUPPORTGROUPS_HELP_DOCUMENT_EDIT'), 'pencil-2 article-add'); + // Built the actions for new and existing records. + if ($this->refid || $this->ref) + { + if ($this->canDo->get('help_document.create') && $isNew) + { + // We can create the record. + JToolBarHelper::save('help_document.save', 'JTOOLBAR_SAVE'); + } + elseif ($this->canDo->get('help_document.edit')) + { + // We can save the record. + JToolBarHelper::save('help_document.save', 'JTOOLBAR_SAVE'); + } + if ($isNew) + { + // Do not creat but cancel. + JToolBarHelper::cancel('help_document.cancel', 'JTOOLBAR_CANCEL'); + } + else + { + // We can close it. + JToolBarHelper::cancel('help_document.cancel', 'JTOOLBAR_CLOSE'); + } + } + else + { + if ($isNew) + { + // For new records, check the create permission. + if ($this->canDo->get('help_document.create')) + { + JToolBarHelper::apply('help_document.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save('help_document.save', 'JTOOLBAR_SAVE'); + JToolBarHelper::custom('help_document.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false); + }; + JToolBarHelper::cancel('help_document.cancel', 'JTOOLBAR_CANCEL'); + } + else + { + if ($this->canDo->get('help_document.edit')) + { + // We can save the new record + JToolBarHelper::apply('help_document.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save('help_document.save', 'JTOOLBAR_SAVE'); + // We can save this record, but check the create permission to see + // if we can return to make a new one. + if ($this->canDo->get('help_document.create')) + { + JToolBarHelper::custom('help_document.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false); + } + } + $canVersion = ($this->canDo->get('core.version') && $this->canDo->get('help_document.version')); + if ($this->state->params->get('save_history', 1) && $this->canDo->get('help_document.edit') && $canVersion) + { + JToolbarHelper::versions('com_supportgroups.help_document', $this->item->id); + } + if ($this->canDo->get('help_document.create')) + { + JToolBarHelper::custom('help_document.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false); + } + JToolBarHelper::cancel('help_document.cancel', 'JTOOLBAR_CLOSE'); + } + } + JToolbarHelper::divider(); + // set help url for this view if found + $help_url = SupportgroupsHelper::getHelpUrl('help_document'); + if (SupportgroupsHelper::checkString($help_url)) + { + JToolbarHelper::help('COM_SUPPORTGROUPS_HELP_MANAGER', false, $help_url); + } + } + + /** + * Escapes a value for output in a view script. + * + * @param mixed $var The output to escape. + * + * @return mixed The escaped value. + */ + public function escape($var) + { + if(strlen($var) > 30) + { + // use the helper htmlEscape method instead and shorten the string + return SupportgroupsHelper::htmlEscape($var, $this->_charset, true, 30); + } + // use the helper htmlEscape method instead. + return SupportgroupsHelper::htmlEscape($var, $this->_charset); + } + + /** + * Method to set up the document properties + * + * @return void + */ + protected function setDocument() + { + $isNew = ($this->item->id < 1); + $document = JFactory::getDocument(); + $document->setTitle(JText::_($isNew ? 'COM_SUPPORTGROUPS_HELP_DOCUMENT_NEW' : 'COM_SUPPORTGROUPS_HELP_DOCUMENT_EDIT')); + $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/help_document.css"); + $document->addScript(JURI::root() . $this->script); + $document->addScript(JURI::root() . "administrator/components/com_supportgroups/views/help_document/submitbutton.js"); + JText::script('view not acceptable. Error'); + } +} diff --git a/admin/views/help_documents/index.html b/admin/views/help_documents/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/views/help_documents/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/views/help_documents/tmpl/default.php b/admin/views/help_documents/tmpl/default.php new file mode 100644 index 0000000..9eaab87 --- /dev/null +++ b/admin/views/help_documents/tmpl/default.php @@ -0,0 +1,99 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// load tooltip behavior +JHtml::_('behavior.tooltip'); +JHtml::_('behavior.multiselect'); +JHtml::_('dropdown.init'); +JHtml::_('formbehavior.chosen', 'select'); + +if ($this->saveOrder) +{ + $saveOrderingUrl = 'index.php?option=com_supportgroups&task=help_documents.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'help_documentList', 'adminForm', strtolower($this->listDirn), $saveOrderingUrl); +} + +?> + +
+sidebar)): ?> +
+ sidebar; ?> +
+
+ +
+ +items)): ?> + loadTemplate('toolbar');?> +
+ +
+ + loadTemplate('toolbar');?> + + loadTemplate('head');?> + loadTemplate('foot');?> + loadTemplate('body');?> +
+ + canCreate && $this->canEdit) : ?> + JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENTS_BATCH_OPTIONS'), + 'footer' => $this->loadTemplate('batch_footer') + ), + $this->loadTemplate('batch_body') + ); ?> + + + + +
+ + + + \ No newline at end of file diff --git a/admin/views/help_documents/tmpl/default_batch_body.php b/admin/views/help_documents/tmpl/default_batch_body.php new file mode 100644 index 0000000..3dafc36 --- /dev/null +++ b/admin/views/help_documents/tmpl/default_batch_body.php @@ -0,0 +1,32 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + +

+batchDisplay; ?> \ No newline at end of file diff --git a/admin/views/help_documents/tmpl/default_batch_footer.php b/admin/views/help_documents/tmpl/default_batch_footer.php new file mode 100644 index 0000000..ee8ecb7 --- /dev/null +++ b/admin/views/help_documents/tmpl/default_batch_footer.php @@ -0,0 +1,37 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + + + + \ No newline at end of file diff --git a/admin/views/help_documents/tmpl/default_body.php b/admin/views/help_documents/tmpl/default_body.php new file mode 100644 index 0000000..40be124 --- /dev/null +++ b/admin/views/help_documents/tmpl/default_body.php @@ -0,0 +1,123 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +$edit = "index.php?option=com_supportgroups&view=help_documents&task=help_document.edit"; + +?> +items as $i => $item): ?> + user->authorise('core.manage', 'com_checkin') || $item->checked_out == $this->user->id || $item->checked_out == 0; + $userChkOut = JFactory::getUser($item->checked_out); + $canDo = SupportgroupsHelper::getActions('help_document',$item,'help_documents'); + ?> + + + get('help_document.edit.state')): ?> + saveOrder) + { + $iconClass = ' inactive'; + } + else + { + $iconClass = ' inactive tip-top" hasTooltip" title="' . JHtml::tooltipText('JORDERINGDISABLED'); + } + ?> + + + + saveOrder) : ?> + + + + ⋮ + + + + get('help_document.edit')): ?> + checked_out) : ?> + + id); ?> + + □ + + + id); ?> + + + □ + + + + get('help_document.edit')): ?> +
+ escape($item->title); ?> + checked_out): ?> + name, $item->checked_out_time, 'help_documents.', $canCheckin); ?> + +
+ +
escape($item->title); ?>
+ + + + type); ?> + + + escape($item->groups); ?> + + + location); ?> + + + escape($item->admin_view); ?> + + + escape($item->site_view); ?> + + + get('help_document.edit.state')) : ?> + checked_out) : ?> + + published, $i, 'help_documents.', true, 'cb'); ?> + + published, $i, 'help_documents.', false, 'cb'); ?> + + + published, $i, 'help_documents.', true, 'cb'); ?> + + + published, $i, 'help_documents.', false, 'cb'); ?> + + + + id; ?> + + + \ No newline at end of file diff --git a/admin/views/help_documents/tmpl/default_foot.php b/admin/views/help_documents/tmpl/default_foot.php new file mode 100644 index 0000000..13fe521 --- /dev/null +++ b/admin/views/help_documents/tmpl/default_foot.php @@ -0,0 +1,32 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + + pagination->getListFooter(); ?> + \ No newline at end of file diff --git a/admin/views/help_documents/tmpl/default_head.php b/admin/views/help_documents/tmpl/default_head.php new file mode 100644 index 0000000..06a700b --- /dev/null +++ b/admin/views/help_documents/tmpl/default_head.php @@ -0,0 +1,76 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + + canEdit&& $this->canState): ?> + + ', 'ordering', $this->listDirn, $this->listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?> + + + + + + + ▾ + + + ■ + + + + listDirn, $this->listOrder); ?> + + + listDirn, $this->listOrder); ?> + + + + + + listDirn, $this->listOrder); ?> + + + listDirn, $this->listOrder); ?> + + + listDirn, $this->listOrder); ?> + + canState): ?> + + listDirn, $this->listOrder); ?> + + + + + + + + listDirn, $this->listOrder); ?> + + \ No newline at end of file diff --git a/admin/views/help_documents/tmpl/default_toolbar.php b/admin/views/help_documents/tmpl/default_toolbar.php new file mode 100644 index 0000000..abe7083 --- /dev/null +++ b/admin/views/help_documents/tmpl/default_toolbar.php @@ -0,0 +1,59 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> +
+ +
+ + +
+
+ + pagination->getLimitBox(); ?> +
+
+ + +
+
+ + +
+
+
\ No newline at end of file diff --git a/admin/views/help_documents/tmpl/index.html b/admin/views/help_documents/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/views/help_documents/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/views/help_documents/view.html.php b/admin/views/help_documents/view.html.php new file mode 100644 index 0000000..46ea6b2 --- /dev/null +++ b/admin/views/help_documents/view.html.php @@ -0,0 +1,478 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla view library +jimport('joomla.application.component.view'); + +/** + * Supportgroups View class for the Help_documents + */ +class SupportgroupsViewHelp_documents extends JViewLegacy +{ + /** + * Help_documents view display method + * @return void + */ + function display($tpl = null) + { + if ($this->getLayout() !== 'modal') + { + // Include helper submenu + SupportgroupsHelper::addSubmenu('help_documents'); + } + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
', $errors)); + return false; + } + + // Assign data to the view + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->user = JFactory::getUser(); + $this->listOrder = $this->escape($this->state->get('list.ordering')); + $this->listDirn = $this->escape($this->state->get('list.direction')); + $this->saveOrder = $this->listOrder == 'ordering'; + // get global action permissions + $this->canDo = SupportgroupsHelper::getActions('help_document'); + $this->canEdit = $this->canDo->get('help_document.edit'); + $this->canState = $this->canDo->get('help_document.edit.state'); + $this->canCreate = $this->canDo->get('help_document.create'); + $this->canDelete = $this->canDo->get('help_document.delete'); + $this->canBatch = $this->canDo->get('core.batch'); + + // We don't need toolbar in the modal window. + if ($this->getLayout() !== 'modal') + { + $this->addToolbar(); + $this->sidebar = JHtmlSidebar::render(); + // load the batch html + if ($this->canCreate && $this->canEdit && $this->canState) + { + $this->batchDisplay = JHtmlBatch_::render(); + } + } + + // Display the template + parent::display($tpl); + + // Set the document + $this->setDocument(); + } + + /** + * Setting the toolbar + */ + protected function addToolBar() + { + JToolBarHelper::title(JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENTS'), 'support'); + JHtmlSidebar::setAction('index.php?option=com_supportgroups&view=help_documents'); + JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields'); + + if ($this->canCreate) + { + JToolBarHelper::addNew('help_document.add'); + } + + // Only load if there are items + if (SupportgroupsHelper::checkArray($this->items)) + { + if ($this->canEdit) + { + JToolBarHelper::editList('help_document.edit'); + } + + if ($this->canState) + { + JToolBarHelper::publishList('help_documents.publish'); + JToolBarHelper::unpublishList('help_documents.unpublish'); + JToolBarHelper::archiveList('help_documents.archive'); + + if ($this->canDo->get('core.admin')) + { + JToolBarHelper::checkin('help_documents.checkin'); + } + } + + // Add a batch button + if ($this->canBatch && $this->canCreate && $this->canEdit && $this->canState) + { + // Get the toolbar object instance + $bar = JToolBar::getInstance('toolbar'); + // set the batch button name + $title = JText::_('JTOOLBAR_BATCH'); + // Instantiate a new JLayoutFile instance and render the batch button + $layout = new JLayoutFile('joomla.toolbar.batch'); + // add the button to the page + $dhtml = $layout->render(array('title' => $title)); + $bar->appendButton('Custom', $dhtml, 'batch'); + } + + if ($this->state->get('filter.published') == -2 && ($this->canState && $this->canDelete)) + { + JToolbarHelper::deleteList('', 'help_documents.delete', 'JTOOLBAR_EMPTY_TRASH'); + } + elseif ($this->canState && $this->canDelete) + { + JToolbarHelper::trash('help_documents.trash'); + } + + if ($this->canDo->get('core.export') && $this->canDo->get('help_document.export')) + { + JToolBarHelper::custom('help_documents.exportData', 'download', '', 'COM_SUPPORTGROUPS_EXPORT_DATA', true); + } + } + + if ($this->canDo->get('core.import') && $this->canDo->get('help_document.import')) + { + JToolBarHelper::custom('help_documents.importData', 'upload', '', 'COM_SUPPORTGROUPS_IMPORT_DATA', false); + } + + // set help url for this view if found + $help_url = SupportgroupsHelper::getHelpUrl('help_documents'); + if (SupportgroupsHelper::checkString($help_url)) + { + JToolbarHelper::help('COM_SUPPORTGROUPS_HELP_MANAGER', false, $help_url); + } + + // add the options comp button + if ($this->canDo->get('core.admin') || $this->canDo->get('core.options')) + { + JToolBarHelper::preferences('com_supportgroups'); + } + + if ($this->canState) + { + JHtmlSidebar::addFilter( + JText::_('JOPTION_SELECT_PUBLISHED'), + 'filter_published', + JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true) + ); + // only load if batch allowed + if ($this->canBatch) + { + JHtmlBatch_::addListSelection( + JText::_('COM_SUPPORTGROUPS_KEEP_ORIGINAL_STATE'), + 'batch[published]', + JHtml::_('select.options', JHtml::_('jgrid.publishedOptions', array('all' => false)), 'value', 'text', '', true) + ); + } + } + + JHtmlSidebar::addFilter( + JText::_('JOPTION_SELECT_ACCESS'), + 'filter_access', + JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + JHtmlBatch_::addListSelection( + JText::_('COM_SUPPORTGROUPS_KEEP_ORIGINAL_ACCESS'), + 'batch[access]', + JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text') + ); + } + + // Set Type Selection + $this->typeOptions = $this->getTheTypeSelections(); + if ($this->typeOptions) + { + // Type Filter + JHtmlSidebar::addFilter( + '- Select '.JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_TYPE_LABEL').' -', + 'filter_type', + JHtml::_('select.options', $this->typeOptions, 'value', 'text', $this->state->get('filter.type')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + // Type Batch Selection + JHtmlBatch_::addListSelection( + '- Keep Original '.JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_TYPE_LABEL').' -', + 'batch[type]', + JHtml::_('select.options', $this->typeOptions, 'value', 'text') + ); + } + } + + // Set Location Selection + $this->locationOptions = $this->getTheLocationSelections(); + if ($this->locationOptions) + { + // Location Filter + JHtmlSidebar::addFilter( + '- Select '.JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_LOCATION_LABEL').' -', + 'filter_location', + JHtml::_('select.options', $this->locationOptions, 'value', 'text', $this->state->get('filter.location')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + // Location Batch Selection + JHtmlBatch_::addListSelection( + '- Keep Original '.JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_LOCATION_LABEL').' -', + 'batch[location]', + JHtml::_('select.options', $this->locationOptions, 'value', 'text') + ); + } + } + + // Set Admin View Selection + $this->admin_viewOptions = $this->getTheAdmin_viewSelections(); + if ($this->admin_viewOptions) + { + // Admin View Filter + JHtmlSidebar::addFilter( + '- Select '.JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_ADMIN_VIEW_LABEL').' -', + 'filter_admin_view', + JHtml::_('select.options', $this->admin_viewOptions, 'value', 'text', $this->state->get('filter.admin_view')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + // Admin View Batch Selection + JHtmlBatch_::addListSelection( + '- Keep Original '.JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_ADMIN_VIEW_LABEL').' -', + 'batch[admin_view]', + JHtml::_('select.options', $this->admin_viewOptions, 'value', 'text') + ); + } + } + + // Set Site View Selection + $this->site_viewOptions = $this->getTheSite_viewSelections(); + if ($this->site_viewOptions) + { + // Site View Filter + JHtmlSidebar::addFilter( + '- Select '.JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_SITE_VIEW_LABEL').' -', + 'filter_site_view', + JHtml::_('select.options', $this->site_viewOptions, 'value', 'text', $this->state->get('filter.site_view')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + // Site View Batch Selection + JHtmlBatch_::addListSelection( + '- Keep Original '.JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_SITE_VIEW_LABEL').' -', + 'batch[site_view]', + JHtml::_('select.options', $this->site_viewOptions, 'value', 'text') + ); + } + } + } + + /** + * Method to set up the document properties + * + * @return void + */ + protected function setDocument() + { + $document = JFactory::getDocument(); + $document->setTitle(JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENTS')); + $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/help_documents.css"); + } + + /** + * Escapes a value for output in a view script. + * + * @param mixed $var The output to escape. + * + * @return mixed The escaped value. + */ + public function escape($var) + { + if(strlen($var) > 50) + { + // use the helper htmlEscape method instead and shorten the string + return SupportgroupsHelper::htmlEscape($var, $this->_charset, true); + } + // use the helper htmlEscape method instead. + return SupportgroupsHelper::htmlEscape($var, $this->_charset); + } + + /** + * Returns an array of fields the table can be sorted by + * + * @return array Array containing the field name to sort by as the key and display text as value + */ + protected function getSortFields() + { + return array( + 'a.sorting' => JText::_('JGRID_HEADING_ORDERING'), + 'a.published' => JText::_('JSTATUS'), + 'a.title' => JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_TITLE_LABEL'), + 'a.type' => JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_TYPE_LABEL'), + 'a.location' => JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_LOCATION_LABEL'), + 'a.admin_view' => JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_ADMIN_VIEW_LABEL'), + 'a.site_view' => JText::_('COM_SUPPORTGROUPS_HELP_DOCUMENT_SITE_VIEW_LABEL'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } + + protected function getTheTypeSelections() + { + // Get a db connection. + $db = JFactory::getDbo(); + + // Create a new query object. + $query = $db->getQuery(true); + + // Select the text. + $query->select($db->quoteName('type')); + $query->from($db->quoteName('#__supportgroups_help_document')); + $query->order($db->quoteName('type') . ' ASC'); + + // Reset the query using our newly populated query object. + $db->setQuery($query); + + $results = $db->loadColumn(); + + if ($results) + { + // get model + $model = $this->getModel(); + $results = array_unique($results); + $filter = array(); + foreach ($results as $type) + { + // Translate the type selection + $text = $model->selectionTranslation($type,'type'); + // Now add the type and its text to the options array + $filter[] = JHtml::_('select.option', $type, JText::_($text)); + } + return $filter; + } + return false; + } + + protected function getTheLocationSelections() + { + // Get a db connection. + $db = JFactory::getDbo(); + + // Create a new query object. + $query = $db->getQuery(true); + + // Select the text. + $query->select($db->quoteName('location')); + $query->from($db->quoteName('#__supportgroups_help_document')); + $query->order($db->quoteName('location') . ' ASC'); + + // Reset the query using our newly populated query object. + $db->setQuery($query); + + $results = $db->loadColumn(); + + if ($results) + { + // get model + $model = $this->getModel(); + $results = array_unique($results); + $filter = array(); + foreach ($results as $location) + { + // Translate the location selection + $text = $model->selectionTranslation($location,'location'); + // Now add the location and its text to the options array + $filter[] = JHtml::_('select.option', $location, JText::_($text)); + } + return $filter; + } + return false; + } + + protected function getTheAdmin_viewSelections() + { + // Get a db connection. + $db = JFactory::getDbo(); + + // Create a new query object. + $query = $db->getQuery(true); + + // Select the text. + $query->select($db->quoteName('admin_view')); + $query->from($db->quoteName('#__supportgroups_help_document')); + $query->order($db->quoteName('admin_view') . ' ASC'); + + // Reset the query using our newly populated query object. + $db->setQuery($query); + + $results = $db->loadColumn(); + + if ($results) + { + $results = array_unique($results); + $filter = array(); + foreach ($results as $admin_view) + { + // Now add the admin_view and its text to the options array + $filter[] = JHtml::_('select.option', $admin_view, $admin_view); + } + return $filter; + } + return false; + } + + protected function getTheSite_viewSelections() + { + // Get a db connection. + $db = JFactory::getDbo(); + + // Create a new query object. + $query = $db->getQuery(true); + + // Select the text. + $query->select($db->quoteName('site_view')); + $query->from($db->quoteName('#__supportgroups_help_document')); + $query->order($db->quoteName('site_view') . ' ASC'); + + // Reset the query using our newly populated query object. + $db->setQuery($query); + + $results = $db->loadColumn(); + + if ($results) + { + $results = array_unique($results); + $filter = array(); + foreach ($results as $site_view) + { + // Now add the site_view and its text to the options array + $filter[] = JHtml::_('select.option', $site_view, $site_view); + } + return $filter; + } + return false; + } +} diff --git a/admin/views/location/tmpl/edit.php b/admin/views/location/tmpl/edit.php index 4af536c..e4671ee 100644 --- a/admin/views/location/tmpl/edit.php +++ b/admin/views/location/tmpl/edit.php @@ -36,21 +36,33 @@ $componentParams = JComponentHelper::getParams('com_supportgroups');
-
+
- 'details')); ?> + 'settings')); ?> - +
- +
- canDo->get('core.delete') || $this->canDo->get('core.edit.created_by') || $this->canDo->get('core.edit.state') || $this->canDo->get('core.edit.created')) : ?> + canDo->get('support_group.access')) : ?> + +
+
+
+
+ +
+
+ + + + canDo->get('location.delete') || $this->canDo->get('location.edit.created_by') || $this->canDo->get('location.edit.state') || $this->canDo->get('location.edit.created')) : ?>
diff --git a/admin/views/location/view.html.php b/admin/views/location/view.html.php index 0eb443c..2915ce8 100644 --- a/admin/views/location/view.html.php +++ b/admin/views/location/view.html.php @@ -68,7 +68,10 @@ class SupportgroupsViewLocation extends JViewLegacy { // return to the list view that refered to this item $this->referral = '&ref='.(string)$this->ref; - } + } + + // Get Linked view data + $this->vvwsupport_groups = $this->get('Vvwsupport_groups'); // Set the toolbar $this->addToolBar(); @@ -95,12 +98,12 @@ class SupportgroupsViewLocation extends JViewLegacy // Built the actions for new and existing records. if ($this->refid || $this->ref) { - if ($this->canDo->get('core.create') && $isNew) + if ($this->canDo->get('location.create') && $isNew) { // We can create the record. JToolBarHelper::save('location.save', 'JTOOLBAR_SAVE'); } - elseif ($this->canDo->get('core.edit')) + elseif ($this->canDo->get('location.edit')) { // We can save the record. JToolBarHelper::save('location.save', 'JTOOLBAR_SAVE'); @@ -121,7 +124,7 @@ class SupportgroupsViewLocation extends JViewLegacy if ($isNew) { // For new records, check the create permission. - if ($this->canDo->get('core.create')) + if ($this->canDo->get('location.create')) { JToolBarHelper::apply('location.apply', 'JTOOLBAR_APPLY'); JToolBarHelper::save('location.save', 'JTOOLBAR_SAVE'); @@ -131,24 +134,24 @@ class SupportgroupsViewLocation extends JViewLegacy } else { - if ($this->canDo->get('core.edit')) + if ($this->canDo->get('location.edit')) { // We can save the new record JToolBarHelper::apply('location.apply', 'JTOOLBAR_APPLY'); JToolBarHelper::save('location.save', 'JTOOLBAR_SAVE'); // We can save this record, but check the create permission to see // if we can return to make a new one. - if ($this->canDo->get('core.create')) + if ($this->canDo->get('location.create')) { JToolBarHelper::custom('location.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false); } } $canVersion = ($this->canDo->get('core.version') && $this->canDo->get('location.version')); - if ($this->state->params->get('save_history', 1) && $this->canDo->get('') && $canVersion) + if ($this->state->params->get('save_history', 1) && $this->canDo->get('location.edit') && $canVersion) { JToolbarHelper::versions('com_supportgroups.location', $this->item->id); } - if ($this->canDo->get('core.create')) + if ($this->canDo->get('location.create')) { JToolBarHelper::custom('location.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false); } @@ -192,7 +195,31 @@ class SupportgroupsViewLocation extends JViewLegacy $isNew = ($this->item->id < 1); $document = JFactory::getDocument(); $document->setTitle(JText::_($isNew ? 'COM_SUPPORTGROUPS_LOCATION_NEW' : 'COM_SUPPORTGROUPS_LOCATION_EDIT')); - $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/location.css"); + $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/location.css"); + + // Add the CSS for Footable. + $document->addStyleSheet(JURI::root() .'media/com_supportgroups/footable/css/footable.core.min.css'); + + // Use the Metro Style + if (!isset($this->fooTableStyle) || 0 == $this->fooTableStyle) + { + $document->addStyleSheet(JURI::root() .'media/com_supportgroups/footable/css/footable.metro.min.css'); + } + // Use the Legacy Style. + elseif (isset($this->fooTableStyle) && 1 == $this->fooTableStyle) + { + $document->addStyleSheet(JURI::root() .'media/com_supportgroups/footable/css/footable.standalone.min.css'); + } + + // Add the JavaScript for Footable + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.js'); + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.sort.js'); + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.filter.js'); + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.paginate.js'); + + $footable = "jQuery(document).ready(function() { jQuery(function () { jQuery('.footable').footable(); }); jQuery('.nav-tabs').on('click', 'li', function() { setTimeout(tableFix, 10); }); }); function tableFix() { jQuery('.footable').trigger('footable_resize'); }"; + $document->addScriptDeclaration($footable); + $document->addScript(JURI::root() . $this->script); $document->addScript(JURI::root() . "administrator/components/com_supportgroups/views/location/submitbutton.js"); JText::script('view not acceptable. Error'); diff --git a/admin/views/locations/tmpl/default_body.php b/admin/views/locations/tmpl/default_body.php index bc58ad5..84dfb98 100644 --- a/admin/views/locations/tmpl/default_body.php +++ b/admin/views/locations/tmpl/default_body.php @@ -37,7 +37,7 @@ $edit = "index.php?option=com_supportgroups&view=locations&task=location.edit"; ?> - get('core.edit.state')): ?> + get('location.edit.state')): ?> saveOrder) { @@ -60,7 +60,7 @@ $edit = "index.php?option=com_supportgroups&view=locations&task=location.edit"; - get('core.edit')): ?> + get('location.edit')): ?> checked_out) : ?> id); ?> @@ -75,7 +75,7 @@ $edit = "index.php?option=com_supportgroups&view=locations&task=location.edit"; - get('core.edit')): ?> + get('location.edit')): ?>
escape($item->name); ?> checked_out): ?> @@ -87,7 +87,7 @@ $edit = "index.php?option=com_supportgroups&view=locations&task=location.edit"; - user->authorise('core.edit', 'com_supportgroups.region.' . (int)$item->region)): ?> + user->authorise('region.edit', 'com_supportgroups.region.' . (int)$item->region)): ?> @@ -96,7 +96,7 @@ $edit = "index.php?option=com_supportgroups&view=locations&task=location.edit"; - get('core.edit.state')) : ?> + get('location.edit.state')) : ?> checked_out) : ?> published, $i, 'locations.', true, 'cb'); ?> diff --git a/admin/views/locations/view.html.php b/admin/views/locations/view.html.php index 30f74ea..f38be22 100644 --- a/admin/views/locations/view.html.php +++ b/admin/views/locations/view.html.php @@ -63,10 +63,10 @@ class SupportgroupsViewLocations extends JViewLegacy $this->saveOrder = $this->listOrder == 'ordering'; // get global action permissions $this->canDo = SupportgroupsHelper::getActions('location'); - $this->canEdit = $this->canDo->get('core.edit'); - $this->canState = $this->canDo->get('core.edit.state'); - $this->canCreate = $this->canDo->get('core.create'); - $this->canDelete = $this->canDo->get('core.delete'); + $this->canEdit = $this->canDo->get('location.edit'); + $this->canState = $this->canDo->get('location.edit.state'); + $this->canCreate = $this->canDo->get('location.create'); + $this->canDelete = $this->canDo->get('location.delete'); $this->canBatch = $this->canDo->get('core.batch'); // We don't need toolbar in the modal window. diff --git a/admin/views/payment/submitbutton.js b/admin/views/payment/submitbutton.js new file mode 100644 index 0000000..e73ab84 --- /dev/null +++ b/admin/views/payment/submitbutton.js @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/ + __ __ _ _____ _ _ __ __ _ _ _ + \ \ / / | | | __ \ | | | | | \/ | | | | | | | + \ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| | + \ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` | + \ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| | + \/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_| + | | + |_| +/-------------------------------------------------------------------------------------------------------------------------------/ + + @version 1.0.3 + @build 6th March, 2016 + @created 24th February, 2016 + @package Support Groups + @subpackage submitbutton.js + @author Llewellyn van der Merwe + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +Joomla.submitbutton = function(task) +{ + if (task == ''){ + return false; + } else { + var isValid=true; + var action = task.split('.'); + if (action[1] != 'cancel' && action[1] != 'close'){ + var forms = $$('form.form-validate'); + for (var i=0;i + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html'); +JHtml::_('behavior.tooltip'); +JHtml::_('behavior.formvalidation'); +JHtml::_('formbehavior.chosen', 'select'); +JHtml::_('behavior.keepalive'); +$componentParams = JComponentHelper::getParams('com_supportgroups'); +?> + + + +
+ + 'details')); ?> + + +
+
+ +
+
+ +
+
+ + + canDo->get('payment.delete') || $this->canDo->get('payment.edit.created_by') || $this->canDo->get('payment.edit.state') || $this->canDo->get('payment.edit.created')) : ?> + +
+
+ +
+
+ +
+
+ + + + canDo->get('core.admin')) : ?> + +
+
+
+
+ form->getFieldset('accesscontrol') as $field): ?> +
+ label; echo $field->input;?> +
+
+ +
+
+
+
+ + + + + +
+ + +
+
+ diff --git a/admin/views/payment/tmpl/index.html b/admin/views/payment/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/views/payment/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/views/payment/view.html.php b/admin/views/payment/view.html.php new file mode 100644 index 0000000..1aa7760 --- /dev/null +++ b/admin/views/payment/view.html.php @@ -0,0 +1,200 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla view library +jimport('joomla.application.component.view'); + +/** + * Payment View class + */ +class SupportgroupsViewPayment extends JViewLegacy +{ + /** + * display method of View + * @return void + */ + public function display($tpl = null) + { + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
', $errors)); + return false; + } + + // Assign the variables + $this->form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->script = $this->get('Script'); + $this->state = $this->get('State'); + // get action permissions + $this->canDo = SupportgroupsHelper::getActions('payment',$this->item); + // get input + $jinput = JFactory::getApplication()->input; + $this->ref = $jinput->get('ref', 0, 'word'); + $this->refid = $jinput->get('refid', 0, 'int'); + $this->referral = ''; + if ($this->refid) + { + // return to the item that refered to this item + $this->referral = '&ref='.(string)$this->ref.'&refid='.(int)$this->refid; + } + elseif($this->ref) + { + // return to the list view that refered to this item + $this->referral = '&ref='.(string)$this->ref; + } + + // Set the toolbar + $this->addToolBar(); + + // Display the template + parent::display($tpl); + + // Set the document + $this->setDocument(); + } + + + /** + * Setting the toolbar + */ + protected function addToolBar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + $user = JFactory::getUser(); + $userId = $user->id; + $isNew = $this->item->id == 0; + + JToolbarHelper::title( JText::_($isNew ? 'COM_SUPPORTGROUPS_PAYMENT_NEW' : 'COM_SUPPORTGROUPS_PAYMENT_EDIT'), 'pencil-2 article-add'); + // Built the actions for new and existing records. + if ($this->refid || $this->ref) + { + if ($this->canDo->get('payment.create') && $isNew) + { + // We can create the record. + JToolBarHelper::save('payment.save', 'JTOOLBAR_SAVE'); + } + elseif ($this->canDo->get('payment.edit')) + { + // We can save the record. + JToolBarHelper::save('payment.save', 'JTOOLBAR_SAVE'); + } + if ($isNew) + { + // Do not creat but cancel. + JToolBarHelper::cancel('payment.cancel', 'JTOOLBAR_CANCEL'); + } + else + { + // We can close it. + JToolBarHelper::cancel('payment.cancel', 'JTOOLBAR_CLOSE'); + } + } + else + { + if ($isNew) + { + // For new records, check the create permission. + if ($this->canDo->get('payment.create')) + { + JToolBarHelper::apply('payment.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save('payment.save', 'JTOOLBAR_SAVE'); + JToolBarHelper::custom('payment.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false); + }; + JToolBarHelper::cancel('payment.cancel', 'JTOOLBAR_CANCEL'); + } + else + { + if ($this->canDo->get('payment.edit')) + { + // We can save the new record + JToolBarHelper::apply('payment.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save('payment.save', 'JTOOLBAR_SAVE'); + // We can save this record, but check the create permission to see + // if we can return to make a new one. + if ($this->canDo->get('payment.create')) + { + JToolBarHelper::custom('payment.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false); + } + } + $canVersion = ($this->canDo->get('core.version') && $this->canDo->get('payment.version')); + if ($this->state->params->get('save_history', 1) && $this->canDo->get('payment.edit') && $canVersion) + { + JToolbarHelper::versions('com_supportgroups.payment', $this->item->id); + } + if ($this->canDo->get('payment.create')) + { + JToolBarHelper::custom('payment.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false); + } + JToolBarHelper::cancel('payment.cancel', 'JTOOLBAR_CLOSE'); + } + } + JToolbarHelper::divider(); + // set help url for this view if found + $help_url = SupportgroupsHelper::getHelpUrl('payment'); + if (SupportgroupsHelper::checkString($help_url)) + { + JToolbarHelper::help('COM_SUPPORTGROUPS_HELP_MANAGER', false, $help_url); + } + } + + /** + * Escapes a value for output in a view script. + * + * @param mixed $var The output to escape. + * + * @return mixed The escaped value. + */ + public function escape($var) + { + if(strlen($var) > 30) + { + // use the helper htmlEscape method instead and shorten the string + return SupportgroupsHelper::htmlEscape($var, $this->_charset, true, 30); + } + // use the helper htmlEscape method instead. + return SupportgroupsHelper::htmlEscape($var, $this->_charset); + } + + /** + * Method to set up the document properties + * + * @return void + */ + protected function setDocument() + { + $isNew = ($this->item->id < 1); + $document = JFactory::getDocument(); + $document->setTitle(JText::_($isNew ? 'COM_SUPPORTGROUPS_PAYMENT_NEW' : 'COM_SUPPORTGROUPS_PAYMENT_EDIT')); + $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/payment.css"); + $document->addScript(JURI::root() . $this->script); + $document->addScript(JURI::root() . "administrator/components/com_supportgroups/views/payment/submitbutton.js"); + JText::script('view not acceptable. Error'); + } +} diff --git a/admin/views/payments/index.html b/admin/views/payments/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/views/payments/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/views/payments/tmpl/default.php b/admin/views/payments/tmpl/default.php new file mode 100644 index 0000000..02c6368 --- /dev/null +++ b/admin/views/payments/tmpl/default.php @@ -0,0 +1,99 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// load tooltip behavior +JHtml::_('behavior.tooltip'); +JHtml::_('behavior.multiselect'); +JHtml::_('dropdown.init'); +JHtml::_('formbehavior.chosen', 'select'); + +if ($this->saveOrder) +{ + $saveOrderingUrl = 'index.php?option=com_supportgroups&task=payments.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'paymentList', 'adminForm', strtolower($this->listDirn), $saveOrderingUrl); +} + +?> + +
+sidebar)): ?> +
+ sidebar; ?> +
+
+ +
+ +items)): ?> + loadTemplate('toolbar');?> +
+ +
+ + loadTemplate('toolbar');?> + + loadTemplate('head');?> + loadTemplate('foot');?> + loadTemplate('body');?> +
+ + canCreate && $this->canEdit) : ?> + JText::_('COM_SUPPORTGROUPS_PAYMENTS_BATCH_OPTIONS'), + 'footer' => $this->loadTemplate('batch_footer') + ), + $this->loadTemplate('batch_body') + ); ?> + + + + +
+ + + + \ No newline at end of file diff --git a/admin/views/payments/tmpl/default_batch_body.php b/admin/views/payments/tmpl/default_batch_body.php new file mode 100644 index 0000000..7417498 --- /dev/null +++ b/admin/views/payments/tmpl/default_batch_body.php @@ -0,0 +1,32 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + +

+batchDisplay; ?> \ No newline at end of file diff --git a/admin/views/payments/tmpl/default_batch_footer.php b/admin/views/payments/tmpl/default_batch_footer.php new file mode 100644 index 0000000..1c8a0dd --- /dev/null +++ b/admin/views/payments/tmpl/default_batch_footer.php @@ -0,0 +1,37 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + + + + \ No newline at end of file diff --git a/admin/views/payments/tmpl/default_body.php b/admin/views/payments/tmpl/default_body.php new file mode 100644 index 0000000..58b1e53 --- /dev/null +++ b/admin/views/payments/tmpl/default_body.php @@ -0,0 +1,114 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +$edit = "index.php?option=com_supportgroups&view=payments&task=payment.edit"; + +?> +items as $i => $item): ?> + user->authorise('core.manage', 'com_checkin') || $item->checked_out == $this->user->id || $item->checked_out == 0; + $userChkOut = JFactory::getUser($item->checked_out); + $canDo = SupportgroupsHelper::getActions('payment',$item,'payments'); + ?> + + + get('payment.edit.state')): ?> + saveOrder) + { + $iconClass = ' inactive'; + } + else + { + $iconClass = ' inactive tip-top" hasTooltip" title="' . JHtml::tooltipText('JORDERINGDISABLED'); + } + ?> + + + + saveOrder) : ?> + + + + ⋮ + + + + get('payment.edit')): ?> + checked_out) : ?> + + id); ?> + + □ + + + id); ?> + + + □ + + + + get('payment.edit')): ?> +
+ escape($item->support_group_name); ?> + checked_out): ?> + name, $item->checked_out_time, 'payments.', $canCheckin); ?> + +
+ +
escape($item->support_group_name); ?>
+ + + + year); ?> + + + escape($item->amount); ?> + + + get('payment.edit.state')) : ?> + checked_out) : ?> + + published, $i, 'payments.', true, 'cb'); ?> + + published, $i, 'payments.', false, 'cb'); ?> + + + published, $i, 'payments.', true, 'cb'); ?> + + + published, $i, 'payments.', false, 'cb'); ?> + + + + id; ?> + + + \ No newline at end of file diff --git a/admin/views/payments/tmpl/default_foot.php b/admin/views/payments/tmpl/default_foot.php new file mode 100644 index 0000000..8c58d8c --- /dev/null +++ b/admin/views/payments/tmpl/default_foot.php @@ -0,0 +1,32 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + + pagination->getListFooter(); ?> + \ No newline at end of file diff --git a/admin/views/payments/tmpl/default_head.php b/admin/views/payments/tmpl/default_head.php new file mode 100644 index 0000000..e6a09bb --- /dev/null +++ b/admin/views/payments/tmpl/default_head.php @@ -0,0 +1,67 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> + + canEdit&& $this->canState): ?> + + ', 'ordering', $this->listDirn, $this->listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?> + + + + + + + ▾ + + + ■ + + + + listDirn, $this->listOrder); ?> + + + listDirn, $this->listOrder); ?> + + + listDirn, $this->listOrder); ?> + + canState): ?> + + listDirn, $this->listOrder); ?> + + + + + + + + listDirn, $this->listOrder); ?> + + \ No newline at end of file diff --git a/admin/views/payments/tmpl/default_toolbar.php b/admin/views/payments/tmpl/default_toolbar.php new file mode 100644 index 0000000..bb588e2 --- /dev/null +++ b/admin/views/payments/tmpl/default_toolbar.php @@ -0,0 +1,59 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +?> +
+ +
+ + +
+
+ + pagination->getLimitBox(); ?> +
+
+ + +
+
+ + +
+
+
\ No newline at end of file diff --git a/admin/views/payments/tmpl/index.html b/admin/views/payments/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/admin/views/payments/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/views/payments/view.html.php b/admin/views/payments/view.html.php new file mode 100644 index 0000000..2c0618d --- /dev/null +++ b/admin/views/payments/view.html.php @@ -0,0 +1,332 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla view library +jimport('joomla.application.component.view'); + +/** + * Supportgroups View class for the Payments + */ +class SupportgroupsViewPayments extends JViewLegacy +{ + /** + * Payments view display method + * @return void + */ + function display($tpl = null) + { + if ($this->getLayout() !== 'modal') + { + // Include helper submenu + SupportgroupsHelper::addSubmenu('payments'); + } + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
', $errors)); + return false; + } + + // Assign data to the view + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->user = JFactory::getUser(); + $this->listOrder = $this->escape($this->state->get('list.ordering')); + $this->listDirn = $this->escape($this->state->get('list.direction')); + $this->saveOrder = $this->listOrder == 'ordering'; + // get global action permissions + $this->canDo = SupportgroupsHelper::getActions('payment'); + $this->canEdit = $this->canDo->get('payment.edit'); + $this->canState = $this->canDo->get('payment.edit.state'); + $this->canCreate = $this->canDo->get('payment.create'); + $this->canDelete = $this->canDo->get('payment.delete'); + $this->canBatch = $this->canDo->get('core.batch'); + + // We don't need toolbar in the modal window. + if ($this->getLayout() !== 'modal') + { + $this->addToolbar(); + $this->sidebar = JHtmlSidebar::render(); + // load the batch html + if ($this->canCreate && $this->canEdit && $this->canState) + { + $this->batchDisplay = JHtmlBatch_::render(); + } + } + + // Display the template + parent::display($tpl); + + // Set the document + $this->setDocument(); + } + + /** + * Setting the toolbar + */ + protected function addToolBar() + { + JToolBarHelper::title(JText::_('COM_SUPPORTGROUPS_PAYMENTS'), 'archive'); + JHtmlSidebar::setAction('index.php?option=com_supportgroups&view=payments'); + JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields'); + + if ($this->canCreate) + { + JToolBarHelper::addNew('payment.add'); + } + + // Only load if there are items + if (SupportgroupsHelper::checkArray($this->items)) + { + if ($this->canEdit) + { + JToolBarHelper::editList('payment.edit'); + } + + if ($this->canState) + { + JToolBarHelper::publishList('payments.publish'); + JToolBarHelper::unpublishList('payments.unpublish'); + JToolBarHelper::archiveList('payments.archive'); + + if ($this->canDo->get('core.admin')) + { + JToolBarHelper::checkin('payments.checkin'); + } + } + + // Add a batch button + if ($this->canBatch && $this->canCreate && $this->canEdit && $this->canState) + { + // Get the toolbar object instance + $bar = JToolBar::getInstance('toolbar'); + // set the batch button name + $title = JText::_('JTOOLBAR_BATCH'); + // Instantiate a new JLayoutFile instance and render the batch button + $layout = new JLayoutFile('joomla.toolbar.batch'); + // add the button to the page + $dhtml = $layout->render(array('title' => $title)); + $bar->appendButton('Custom', $dhtml, 'batch'); + } + + if ($this->state->get('filter.published') == -2 && ($this->canState && $this->canDelete)) + { + JToolbarHelper::deleteList('', 'payments.delete', 'JTOOLBAR_EMPTY_TRASH'); + } + elseif ($this->canState && $this->canDelete) + { + JToolbarHelper::trash('payments.trash'); + } + + if ($this->canDo->get('core.export') && $this->canDo->get('payment.export')) + { + JToolBarHelper::custom('payments.exportData', 'download', '', 'COM_SUPPORTGROUPS_EXPORT_DATA', true); + } + } + + if ($this->canDo->get('core.import') && $this->canDo->get('payment.import')) + { + JToolBarHelper::custom('payments.importData', 'upload', '', 'COM_SUPPORTGROUPS_IMPORT_DATA', false); + } + + // set help url for this view if found + $help_url = SupportgroupsHelper::getHelpUrl('payments'); + if (SupportgroupsHelper::checkString($help_url)) + { + JToolbarHelper::help('COM_SUPPORTGROUPS_HELP_MANAGER', false, $help_url); + } + + // add the options comp button + if ($this->canDo->get('core.admin') || $this->canDo->get('core.options')) + { + JToolBarHelper::preferences('com_supportgroups'); + } + + if ($this->canState) + { + JHtmlSidebar::addFilter( + JText::_('JOPTION_SELECT_PUBLISHED'), + 'filter_published', + JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true) + ); + // only load if batch allowed + if ($this->canBatch) + { + JHtmlBatch_::addListSelection( + JText::_('COM_SUPPORTGROUPS_KEEP_ORIGINAL_STATE'), + 'batch[published]', + JHtml::_('select.options', JHtml::_('jgrid.publishedOptions', array('all' => false)), 'value', 'text', '', true) + ); + } + } + + JHtmlSidebar::addFilter( + JText::_('JOPTION_SELECT_ACCESS'), + 'filter_access', + JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + JHtmlBatch_::addListSelection( + JText::_('COM_SUPPORTGROUPS_KEEP_ORIGINAL_ACCESS'), + 'batch[access]', + JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text') + ); + } + + // Set Support Group Name Selection + $this->support_groupNameOptions = JFormHelper::loadFieldType('Supportgroups')->getOptions(); + if ($this->support_groupNameOptions) + { + // Support Group Name Filter + JHtmlSidebar::addFilter( + '- Select '.JText::_('COM_SUPPORTGROUPS_PAYMENT_SUPPORT_GROUP_LABEL').' -', + 'filter_support_group', + JHtml::_('select.options', $this->support_groupNameOptions, 'value', 'text', $this->state->get('filter.support_group')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + // Support Group Name Batch Selection + JHtmlBatch_::addListSelection( + '- Keep Original '.JText::_('COM_SUPPORTGROUPS_PAYMENT_SUPPORT_GROUP_LABEL').' -', + 'batch[support_group]', + JHtml::_('select.options', $this->support_groupNameOptions, 'value', 'text') + ); + } + } + + // Set Year Selection + $this->yearOptions = $this->getTheYearSelections(); + if ($this->yearOptions) + { + // Year Filter + JHtmlSidebar::addFilter( + '- Select '.JText::_('COM_SUPPORTGROUPS_PAYMENT_YEAR_LABEL').' -', + 'filter_year', + JHtml::_('select.options', $this->yearOptions, 'value', 'text', $this->state->get('filter.year')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + // Year Batch Selection + JHtmlBatch_::addListSelection( + '- Keep Original '.JText::_('COM_SUPPORTGROUPS_PAYMENT_YEAR_LABEL').' -', + 'batch[year]', + JHtml::_('select.options', $this->yearOptions, 'value', 'text') + ); + } + } + } + + /** + * Method to set up the document properties + * + * @return void + */ + protected function setDocument() + { + $document = JFactory::getDocument(); + $document->setTitle(JText::_('COM_SUPPORTGROUPS_PAYMENTS')); + $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/payments.css"); + } + + /** + * Escapes a value for output in a view script. + * + * @param mixed $var The output to escape. + * + * @return mixed The escaped value. + */ + public function escape($var) + { + if(strlen($var) > 50) + { + // use the helper htmlEscape method instead and shorten the string + return SupportgroupsHelper::htmlEscape($var, $this->_charset, true); + } + // use the helper htmlEscape method instead. + return SupportgroupsHelper::htmlEscape($var, $this->_charset); + } + + /** + * Returns an array of fields the table can be sorted by + * + * @return array Array containing the field name to sort by as the key and display text as value + */ + protected function getSortFields() + { + return array( + 'a.sorting' => JText::_('JGRID_HEADING_ORDERING'), + 'a.published' => JText::_('JSTATUS'), + 'g.name' => JText::_('COM_SUPPORTGROUPS_PAYMENT_SUPPORT_GROUP_LABEL'), + 'a.year' => JText::_('COM_SUPPORTGROUPS_PAYMENT_YEAR_LABEL'), + 'a.amount' => JText::_('COM_SUPPORTGROUPS_PAYMENT_AMOUNT_LABEL'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } + + protected function getTheYearSelections() + { + // Get a db connection. + $db = JFactory::getDbo(); + + // Create a new query object. + $query = $db->getQuery(true); + + // Select the text. + $query->select($db->quoteName('year')); + $query->from($db->quoteName('#__supportgroups_payment')); + $query->order($db->quoteName('year') . ' ASC'); + + // Reset the query using our newly populated query object. + $db->setQuery($query); + + $results = $db->loadColumn(); + + if ($results) + { + // get model + $model = $this->getModel(); + $results = array_unique($results); + $filter = array(); + foreach ($results as $year) + { + // Translate the year selection + $text = $model->selectionTranslation($year,'year'); + // Now add the year and its text to the options array + $filter[] = JHtml::_('select.option', $year, JText::_($text)); + } + return $filter; + } + return false; + } +} diff --git a/admin/views/region/tmpl/edit.php b/admin/views/region/tmpl/edit.php index 7f8660d..62ca1b1 100644 --- a/admin/views/region/tmpl/edit.php +++ b/admin/views/region/tmpl/edit.php @@ -37,20 +37,32 @@ $componentParams = JComponentHelper::getParams('com_supportgroups');
- 'details')); ?> + 'settings')); ?> - +
- +
- +
- canDo->get('core.delete') || $this->canDo->get('core.edit.created_by') || $this->canDo->get('core.edit.state') || $this->canDo->get('core.edit.created')) : ?> + canDo->get('location.access')) : ?> + +
+
+
+
+ +
+
+ + + + canDo->get('region.delete') || $this->canDo->get('region.edit.created_by') || $this->canDo->get('region.edit.state') || $this->canDo->get('region.edit.created')) : ?>
diff --git a/admin/views/region/view.html.php b/admin/views/region/view.html.php index c32afb2..bf619ac 100644 --- a/admin/views/region/view.html.php +++ b/admin/views/region/view.html.php @@ -68,7 +68,10 @@ class SupportgroupsViewRegion extends JViewLegacy { // return to the list view that refered to this item $this->referral = '&ref='.(string)$this->ref; - } + } + + // Get Linked view data + $this->vvxlocations = $this->get('Vvxlocations'); // Set the toolbar $this->addToolBar(); @@ -95,12 +98,12 @@ class SupportgroupsViewRegion extends JViewLegacy // Built the actions for new and existing records. if ($this->refid || $this->ref) { - if ($this->canDo->get('core.create') && $isNew) + if ($this->canDo->get('region.create') && $isNew) { // We can create the record. JToolBarHelper::save('region.save', 'JTOOLBAR_SAVE'); } - elseif ($this->canDo->get('core.edit')) + elseif ($this->canDo->get('region.edit')) { // We can save the record. JToolBarHelper::save('region.save', 'JTOOLBAR_SAVE'); @@ -121,7 +124,7 @@ class SupportgroupsViewRegion extends JViewLegacy if ($isNew) { // For new records, check the create permission. - if ($this->canDo->get('core.create')) + if ($this->canDo->get('region.create')) { JToolBarHelper::apply('region.apply', 'JTOOLBAR_APPLY'); JToolBarHelper::save('region.save', 'JTOOLBAR_SAVE'); @@ -131,24 +134,24 @@ class SupportgroupsViewRegion extends JViewLegacy } else { - if ($this->canDo->get('core.edit')) + if ($this->canDo->get('region.edit')) { // We can save the new record JToolBarHelper::apply('region.apply', 'JTOOLBAR_APPLY'); JToolBarHelper::save('region.save', 'JTOOLBAR_SAVE'); // We can save this record, but check the create permission to see // if we can return to make a new one. - if ($this->canDo->get('core.create')) + if ($this->canDo->get('region.create')) { JToolBarHelper::custom('region.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false); } } $canVersion = ($this->canDo->get('core.version') && $this->canDo->get('region.version')); - if ($this->state->params->get('save_history', 1) && $this->canDo->get('') && $canVersion) + if ($this->state->params->get('save_history', 1) && $this->canDo->get('region.edit') && $canVersion) { JToolbarHelper::versions('com_supportgroups.region', $this->item->id); } - if ($this->canDo->get('core.create')) + if ($this->canDo->get('region.create')) { JToolBarHelper::custom('region.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false); } @@ -192,7 +195,31 @@ class SupportgroupsViewRegion extends JViewLegacy $isNew = ($this->item->id < 1); $document = JFactory::getDocument(); $document->setTitle(JText::_($isNew ? 'COM_SUPPORTGROUPS_REGION_NEW' : 'COM_SUPPORTGROUPS_REGION_EDIT')); - $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/region.css"); + $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/region.css"); + + // Add the CSS for Footable. + $document->addStyleSheet(JURI::root() .'media/com_supportgroups/footable/css/footable.core.min.css'); + + // Use the Metro Style + if (!isset($this->fooTableStyle) || 0 == $this->fooTableStyle) + { + $document->addStyleSheet(JURI::root() .'media/com_supportgroups/footable/css/footable.metro.min.css'); + } + // Use the Legacy Style. + elseif (isset($this->fooTableStyle) && 1 == $this->fooTableStyle) + { + $document->addStyleSheet(JURI::root() .'media/com_supportgroups/footable/css/footable.standalone.min.css'); + } + + // Add the JavaScript for Footable + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.js'); + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.sort.js'); + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.filter.js'); + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.paginate.js'); + + $footable = "jQuery(document).ready(function() { jQuery(function () { jQuery('.footable').footable(); }); jQuery('.nav-tabs').on('click', 'li', function() { setTimeout(tableFix, 10); }); }); function tableFix() { jQuery('.footable').trigger('footable_resize'); }"; + $document->addScriptDeclaration($footable); + $document->addScript(JURI::root() . $this->script); $document->addScript(JURI::root() . "administrator/components/com_supportgroups/views/region/submitbutton.js"); JText::script('view not acceptable. Error'); diff --git a/admin/views/regions/tmpl/default_body.php b/admin/views/regions/tmpl/default_body.php index 7db8fbc..9a6d6f5 100644 --- a/admin/views/regions/tmpl/default_body.php +++ b/admin/views/regions/tmpl/default_body.php @@ -37,7 +37,7 @@ $edit = "index.php?option=com_supportgroups&view=regions&task=region.edit"; ?> - get('core.edit.state')): ?> + get('region.edit.state')): ?> saveOrder) { @@ -60,7 +60,7 @@ $edit = "index.php?option=com_supportgroups&view=regions&task=region.edit"; - get('core.edit')): ?> + get('region.edit')): ?> checked_out) : ?> id); ?> @@ -75,7 +75,7 @@ $edit = "index.php?option=com_supportgroups&view=regions&task=region.edit"; - get('core.edit')): ?> + get('region.edit')): ?>
escape($item->name); ?> checked_out): ?> @@ -96,7 +96,7 @@ $edit = "index.php?option=com_supportgroups&view=regions&task=region.edit"; - get('core.edit.state')) : ?> + get('region.edit.state')) : ?> checked_out) : ?> published, $i, 'regions.', true, 'cb'); ?> diff --git a/admin/views/regions/view.html.php b/admin/views/regions/view.html.php index d925d55..57c0126 100644 --- a/admin/views/regions/view.html.php +++ b/admin/views/regions/view.html.php @@ -63,10 +63,10 @@ class SupportgroupsViewRegions extends JViewLegacy $this->saveOrder = $this->listOrder == 'ordering'; // get global action permissions $this->canDo = SupportgroupsHelper::getActions('region'); - $this->canEdit = $this->canDo->get('core.edit'); - $this->canState = $this->canDo->get('core.edit.state'); - $this->canCreate = $this->canDo->get('core.create'); - $this->canDelete = $this->canDo->get('core.delete'); + $this->canEdit = $this->canDo->get('region.edit'); + $this->canState = $this->canDo->get('region.edit.state'); + $this->canCreate = $this->canDo->get('region.create'); + $this->canDelete = $this->canDo->get('region.delete'); $this->canBatch = $this->canDo->get('core.batch'); // We don't need toolbar in the modal window. diff --git a/admin/views/support_group/tmpl/edit.php b/admin/views/support_group/tmpl/edit.php index eda8a8a..4c2ce5e 100644 --- a/admin/views/support_group/tmpl/edit.php +++ b/admin/views/support_group/tmpl/edit.php @@ -35,19 +35,35 @@ $componentParams = JComponentHelper::getParams('com_supportgroups'); ?> -
+ +
'details')); ?>
-
+
+
+ +
- canDo->get('core.delete') || $this->canDo->get('core.edit.created_by') || $this->canDo->get('core.edit.state') || $this->canDo->get('core.edit.created')) : ?> + canDo->get('payment.access')) : ?> + +
+
+
+
+ +
+
+ + + + canDo->get('support_group.delete') || $this->canDo->get('support_group.edit.created_by') || $this->canDo->get('support_group.edit.state') || $this->canDo->get('support_group.edit.created')) : ?>
@@ -85,5 +101,8 @@ $componentParams = JComponentHelper::getParams('com_supportgroups');
-
+
+ +
+ diff --git a/admin/views/support_group/view.html.php b/admin/views/support_group/view.html.php index 01c123b..37066c8 100644 --- a/admin/views/support_group/view.html.php +++ b/admin/views/support_group/view.html.php @@ -68,7 +68,10 @@ class SupportgroupsViewSupport_group extends JViewLegacy { // return to the list view that refered to this item $this->referral = '&ref='.(string)$this->ref; - } + } + + // Get Linked view data + $this->vvvpayments = $this->get('Vvvpayments'); // Set the toolbar $this->addToolBar(); @@ -95,12 +98,12 @@ class SupportgroupsViewSupport_group extends JViewLegacy // Built the actions for new and existing records. if ($this->refid || $this->ref) { - if ($this->canDo->get('core.create') && $isNew) + if ($this->canDo->get('support_group.create') && $isNew) { // We can create the record. JToolBarHelper::save('support_group.save', 'JTOOLBAR_SAVE'); } - elseif ($this->canDo->get('core.edit')) + elseif ($this->canDo->get('support_group.edit')) { // We can save the record. JToolBarHelper::save('support_group.save', 'JTOOLBAR_SAVE'); @@ -121,7 +124,7 @@ class SupportgroupsViewSupport_group extends JViewLegacy if ($isNew) { // For new records, check the create permission. - if ($this->canDo->get('core.create')) + if ($this->canDo->get('support_group.create')) { JToolBarHelper::apply('support_group.apply', 'JTOOLBAR_APPLY'); JToolBarHelper::save('support_group.save', 'JTOOLBAR_SAVE'); @@ -131,24 +134,24 @@ class SupportgroupsViewSupport_group extends JViewLegacy } else { - if ($this->canDo->get('core.edit')) + if ($this->canDo->get('support_group.edit')) { // We can save the new record JToolBarHelper::apply('support_group.apply', 'JTOOLBAR_APPLY'); JToolBarHelper::save('support_group.save', 'JTOOLBAR_SAVE'); // We can save this record, but check the create permission to see // if we can return to make a new one. - if ($this->canDo->get('core.create')) + if ($this->canDo->get('support_group.create')) { JToolBarHelper::custom('support_group.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false); } } $canVersion = ($this->canDo->get('core.version') && $this->canDo->get('support_group.version')); - if ($this->state->params->get('save_history', 1) && $this->canDo->get('') && $canVersion) + if ($this->state->params->get('save_history', 1) && $this->canDo->get('support_group.edit') && $canVersion) { JToolbarHelper::versions('com_supportgroups.support_group', $this->item->id); } - if ($this->canDo->get('core.create')) + if ($this->canDo->get('support_group.create')) { JToolBarHelper::custom('support_group.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false); } @@ -192,7 +195,31 @@ class SupportgroupsViewSupport_group extends JViewLegacy $isNew = ($this->item->id < 1); $document = JFactory::getDocument(); $document->setTitle(JText::_($isNew ? 'COM_SUPPORTGROUPS_SUPPORT_GROUP_NEW' : 'COM_SUPPORTGROUPS_SUPPORT_GROUP_EDIT')); - $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/support_group.css"); + $document->addStyleSheet(JURI::root() . "administrator/components/com_supportgroups/assets/css/support_group.css"); + + // Add the CSS for Footable. + $document->addStyleSheet(JURI::root() .'media/com_supportgroups/footable/css/footable.core.min.css'); + + // Use the Metro Style + if (!isset($this->fooTableStyle) || 0 == $this->fooTableStyle) + { + $document->addStyleSheet(JURI::root() .'media/com_supportgroups/footable/css/footable.metro.min.css'); + } + // Use the Legacy Style. + elseif (isset($this->fooTableStyle) && 1 == $this->fooTableStyle) + { + $document->addStyleSheet(JURI::root() .'media/com_supportgroups/footable/css/footable.standalone.min.css'); + } + + // Add the JavaScript for Footable + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.js'); + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.sort.js'); + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.filter.js'); + $document->addScript(JURI::root() .'media/com_supportgroups/footable/js/footable.paginate.js'); + + $footable = "jQuery(document).ready(function() { jQuery(function () { jQuery('.footable').footable(); }); jQuery('.nav-tabs').on('click', 'li', function() { setTimeout(tableFix, 10); }); }); function tableFix() { jQuery('.footable').trigger('footable_resize'); }"; + $document->addScriptDeclaration($footable); + $document->addScript(JURI::root() . $this->script); $document->addScript(JURI::root() . "administrator/components/com_supportgroups/views/support_group/submitbutton.js"); JText::script('view not acceptable. Error'); diff --git a/admin/views/support_groups/tmpl/default_body.php b/admin/views/support_groups/tmpl/default_body.php index cceb641..ebb38f5 100644 --- a/admin/views/support_groups/tmpl/default_body.php +++ b/admin/views/support_groups/tmpl/default_body.php @@ -37,7 +37,7 @@ $edit = "index.php?option=com_supportgroups&view=support_groups&task=support_gro ?> - get('core.edit.state')): ?> + get('support_group.edit.state')): ?> saveOrder) { @@ -60,7 +60,7 @@ $edit = "index.php?option=com_supportgroups&view=support_groups&task=support_gro - get('core.edit')): ?> + get('support_group.edit')): ?> checked_out) : ?> id); ?> @@ -75,7 +75,7 @@ $edit = "index.php?option=com_supportgroups&view=support_groups&task=support_gro - get('core.edit')): ?> + get('support_group.edit')): ?>
escape($item->name); ?> checked_out): ?> @@ -86,8 +86,35 @@ $edit = "index.php?option=com_supportgroups&view=support_groups&task=support_gro
escape($item->name); ?>
+ + escape($item->phone); ?> + + + user->authorise('location.edit', 'com_supportgroups.location.' . (int)$item->location)): ?> + + +
escape($item->location_name); ?>
+ + + + user->authorise('clinic.edit', 'com_supportgroups.clinic.' . (int)$item->clinic)): ?> + + +
escape($item->clinic_name); ?>
+ + + + escape($item->male); ?> + + + escape($item->female); ?> + - get('core.edit.state')) : ?> + get('support_group.edit.state')) : ?> checked_out) : ?> published, $i, 'support_groups.', true, 'cb'); ?> diff --git a/admin/views/support_groups/tmpl/default_foot.php b/admin/views/support_groups/tmpl/default_foot.php index 21d189c..13fe521 100644 --- a/admin/views/support_groups/tmpl/default_foot.php +++ b/admin/views/support_groups/tmpl/default_foot.php @@ -28,5 +28,5 @@ defined('_JEXEC') or die('Restricted access'); ?> - pagination->getListFooter(); ?> + pagination->getListFooter(); ?> \ No newline at end of file diff --git a/admin/views/support_groups/tmpl/default_head.php b/admin/views/support_groups/tmpl/default_head.php index 9e1a8d4..c6c80cf 100644 --- a/admin/views/support_groups/tmpl/default_head.php +++ b/admin/views/support_groups/tmpl/default_head.php @@ -46,6 +46,21 @@ defined('_JEXEC') or die('Restricted access'); listDirn, $this->listOrder); ?> + + listDirn, $this->listOrder); ?> + + + listDirn, $this->listOrder); ?> + + + listDirn, $this->listOrder); ?> + + + listDirn, $this->listOrder); ?> + + + listDirn, $this->listOrder); ?> + canState): ?> listDirn, $this->listOrder); ?> diff --git a/admin/views/support_groups/view.html.php b/admin/views/support_groups/view.html.php index fc561ca..6685119 100644 --- a/admin/views/support_groups/view.html.php +++ b/admin/views/support_groups/view.html.php @@ -63,10 +63,10 @@ class SupportgroupsViewSupport_groups extends JViewLegacy $this->saveOrder = $this->listOrder == 'ordering'; // get global action permissions $this->canDo = SupportgroupsHelper::getActions('support_group'); - $this->canEdit = $this->canDo->get('core.edit'); - $this->canState = $this->canDo->get('core.edit.state'); - $this->canCreate = $this->canDo->get('core.create'); - $this->canDelete = $this->canDo->get('core.delete'); + $this->canEdit = $this->canDo->get('support_group.edit'); + $this->canState = $this->canDo->get('support_group.edit.state'); + $this->canCreate = $this->canDo->get('support_group.create'); + $this->canDelete = $this->canDo->get('support_group.delete'); $this->canBatch = $this->canDo->get('core.batch'); // We don't need toolbar in the modal window. @@ -200,7 +200,51 @@ class SupportgroupsViewSupport_groups extends JViewLegacy 'batch[access]', JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text') ); - } + } + + // Set Location Name Selection + $this->locationNameOptions = JFormHelper::loadFieldType('Locations')->getOptions(); + if ($this->locationNameOptions) + { + // Location Name Filter + JHtmlSidebar::addFilter( + '- Select '.JText::_('COM_SUPPORTGROUPS_SUPPORT_GROUP_LOCATION_LABEL').' -', + 'filter_location', + JHtml::_('select.options', $this->locationNameOptions, 'value', 'text', $this->state->get('filter.location')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + // Location Name Batch Selection + JHtmlBatch_::addListSelection( + '- Keep Original '.JText::_('COM_SUPPORTGROUPS_SUPPORT_GROUP_LOCATION_LABEL').' -', + 'batch[location]', + JHtml::_('select.options', $this->locationNameOptions, 'value', 'text') + ); + } + } + + // Set Clinic Name Selection + $this->clinicNameOptions = JFormHelper::loadFieldType('Clinics')->getOptions(); + if ($this->clinicNameOptions) + { + // Clinic Name Filter + JHtmlSidebar::addFilter( + '- Select '.JText::_('COM_SUPPORTGROUPS_SUPPORT_GROUP_CLINIC_LABEL').' -', + 'filter_clinic', + JHtml::_('select.options', $this->clinicNameOptions, 'value', 'text', $this->state->get('filter.clinic')) + ); + + if ($this->canBatch && $this->canCreate && $this->canEdit) + { + // Clinic Name Batch Selection + JHtmlBatch_::addListSelection( + '- Keep Original '.JText::_('COM_SUPPORTGROUPS_SUPPORT_GROUP_CLINIC_LABEL').' -', + 'batch[clinic]', + JHtml::_('select.options', $this->clinicNameOptions, 'value', 'text') + ); + } + } } /** @@ -244,6 +288,11 @@ class SupportgroupsViewSupport_groups extends JViewLegacy 'a.sorting' => JText::_('JGRID_HEADING_ORDERING'), 'a.published' => JText::_('JSTATUS'), 'a.name' => JText::_('COM_SUPPORTGROUPS_SUPPORT_GROUP_NAME_LABEL'), + 'a.phone' => JText::_('COM_SUPPORTGROUPS_SUPPORT_GROUP_PHONE_LABEL'), + 'g.name' => JText::_('COM_SUPPORTGROUPS_SUPPORT_GROUP_LOCATION_LABEL'), + 'h.name' => JText::_('COM_SUPPORTGROUPS_SUPPORT_GROUP_CLINIC_LABEL'), + 'a.male' => JText::_('COM_SUPPORTGROUPS_SUPPORT_GROUP_MALE_LABEL'), + 'a.female' => JText::_('COM_SUPPORTGROUPS_SUPPORT_GROUP_FEMALE_LABEL'), 'a.id' => JText::_('JGRID_HEADING_ID') ); } diff --git a/script.php b/script.php index 74e0117..b25d9bd 100644 --- a/script.php +++ b/script.php @@ -145,6 +145,178 @@ class com_supportgroupsInstallerScript } } + // Create a new query object. + $query = $db->getQuery(true); + // Select id from content type table + $query->select($db->quoteName('type_id')); + $query->from($db->quoteName('#__content_types')); + // Where Payment alias is found + $query->where( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.payment') ); + $db->setQuery($query); + // Execute query to see if alias is found + $db->execute(); + $payment_found = $db->getNumRows(); + // Now check if there were any rows + if ($payment_found) + { + // Since there are load the needed payment type ids + $payment_ids = $db->loadColumn(); + // Remove Payment from the content type table + $payment_condition = array( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.payment') ); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__content_types')); + $query->where($payment_condition); + $db->setQuery($query); + // Execute the query to remove Payment items + $payment_done = $db->execute(); + if ($payment_done); + { + // If succesfully remove Payment add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.payment) type alias was removed from the #__content_type table')); + } + + // Remove Payment items from the contentitem tag map table + $payment_condition = array( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.payment') ); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__contentitem_tag_map')); + $query->where($payment_condition); + $db->setQuery($query); + // Execute the query to remove Payment items + $payment_done = $db->execute(); + if ($payment_done); + { + // If succesfully remove Payment add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.payment) type alias was removed from the #__contentitem_tag_map table')); + } + + // Remove Payment items from the ucm content table + $payment_condition = array( $db->quoteName('core_type_alias') . ' = ' . $db->quote('com_supportgroups.payment') ); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__ucm_content')); + $query->where($payment_condition); + $db->setQuery($query); + // Execute the query to remove Payment items + $payment_done = $db->execute(); + if ($payment_done); + { + // If succesfully remove Payment add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.payment) type alias was removed from the #__ucm_content table')); + } + + // Make sure that all the Payment items are cleared from DB + foreach ($payment_ids as $payment_id) + { + // Remove Payment items from the ucm base table + $payment_condition = array( $db->quoteName('ucm_type_id') . ' = ' . $payment_id); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__ucm_base')); + $query->where($payment_condition); + $db->setQuery($query); + // Execute the query to remove Payment items + $db->execute(); + + // Remove Payment items from the ucm history table + $payment_condition = array( $db->quoteName('ucm_type_id') . ' = ' . $payment_id); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__ucm_history')); + $query->where($payment_condition); + $db->setQuery($query); + // Execute the query to remove Payment items + $db->execute(); + } + } + + // Create a new query object. + $query = $db->getQuery(true); + // Select id from content type table + $query->select($db->quoteName('type_id')); + $query->from($db->quoteName('#__content_types')); + // Where Clinic alias is found + $query->where( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.clinic') ); + $db->setQuery($query); + // Execute query to see if alias is found + $db->execute(); + $clinic_found = $db->getNumRows(); + // Now check if there were any rows + if ($clinic_found) + { + // Since there are load the needed clinic type ids + $clinic_ids = $db->loadColumn(); + // Remove Clinic from the content type table + $clinic_condition = array( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.clinic') ); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__content_types')); + $query->where($clinic_condition); + $db->setQuery($query); + // Execute the query to remove Clinic items + $clinic_done = $db->execute(); + if ($clinic_done); + { + // If succesfully remove Clinic add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.clinic) type alias was removed from the #__content_type table')); + } + + // Remove Clinic items from the contentitem tag map table + $clinic_condition = array( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.clinic') ); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__contentitem_tag_map')); + $query->where($clinic_condition); + $db->setQuery($query); + // Execute the query to remove Clinic items + $clinic_done = $db->execute(); + if ($clinic_done); + { + // If succesfully remove Clinic add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.clinic) type alias was removed from the #__contentitem_tag_map table')); + } + + // Remove Clinic items from the ucm content table + $clinic_condition = array( $db->quoteName('core_type_alias') . ' = ' . $db->quote('com_supportgroups.clinic') ); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__ucm_content')); + $query->where($clinic_condition); + $db->setQuery($query); + // Execute the query to remove Clinic items + $clinic_done = $db->execute(); + if ($clinic_done); + { + // If succesfully remove Clinic add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.clinic) type alias was removed from the #__ucm_content table')); + } + + // Make sure that all the Clinic items are cleared from DB + foreach ($clinic_ids as $clinic_id) + { + // Remove Clinic items from the ucm base table + $clinic_condition = array( $db->quoteName('ucm_type_id') . ' = ' . $clinic_id); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__ucm_base')); + $query->where($clinic_condition); + $db->setQuery($query); + // Execute the query to remove Clinic items + $db->execute(); + + // Remove Clinic items from the ucm history table + $clinic_condition = array( $db->quoteName('ucm_type_id') . ' = ' . $clinic_id); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__ucm_history')); + $query->where($clinic_condition); + $db->setQuery($query); + // Execute the query to remove Clinic items + $db->execute(); + } + } + // Create a new query object. $query = $db->getQuery(true); // Select id from content type table @@ -317,6 +489,92 @@ class com_supportgroupsInstallerScript } } + // Create a new query object. + $query = $db->getQuery(true); + // Select id from content type table + $query->select($db->quoteName('type_id')); + $query->from($db->quoteName('#__content_types')); + // Where Country alias is found + $query->where( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.country') ); + $db->setQuery($query); + // Execute query to see if alias is found + $db->execute(); + $country_found = $db->getNumRows(); + // Now check if there were any rows + if ($country_found) + { + // Since there are load the needed country type ids + $country_ids = $db->loadColumn(); + // Remove Country from the content type table + $country_condition = array( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.country') ); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__content_types')); + $query->where($country_condition); + $db->setQuery($query); + // Execute the query to remove Country items + $country_done = $db->execute(); + if ($country_done); + { + // If succesfully remove Country add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.country) type alias was removed from the #__content_type table')); + } + + // Remove Country items from the contentitem tag map table + $country_condition = array( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.country') ); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__contentitem_tag_map')); + $query->where($country_condition); + $db->setQuery($query); + // Execute the query to remove Country items + $country_done = $db->execute(); + if ($country_done); + { + // If succesfully remove Country add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.country) type alias was removed from the #__contentitem_tag_map table')); + } + + // Remove Country items from the ucm content table + $country_condition = array( $db->quoteName('core_type_alias') . ' = ' . $db->quote('com_supportgroups.country') ); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__ucm_content')); + $query->where($country_condition); + $db->setQuery($query); + // Execute the query to remove Country items + $country_done = $db->execute(); + if ($country_done); + { + // If succesfully remove Country add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.country) type alias was removed from the #__ucm_content table')); + } + + // Make sure that all the Country items are cleared from DB + foreach ($country_ids as $country_id) + { + // Remove Country items from the ucm base table + $country_condition = array( $db->quoteName('ucm_type_id') . ' = ' . $country_id); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__ucm_base')); + $query->where($country_condition); + $db->setQuery($query); + // Execute the query to remove Country items + $db->execute(); + + // Remove Country items from the ucm history table + $country_condition = array( $db->quoteName('ucm_type_id') . ' = ' . $country_id); + // Create a new query object. + $query = $db->getQuery(true); + $query->delete($db->quoteName('#__ucm_history')); + $query->where($country_condition); + $db->setQuery($query); + // Execute the query to remove Country items + $db->execute(); + } + } + // Create a new query object. $query = $db->getQuery(true); // Select id from content type table @@ -408,83 +666,83 @@ class com_supportgroupsInstallerScript // Select id from content type table $query->select($db->quoteName('type_id')); $query->from($db->quoteName('#__content_types')); - // Where Country alias is found - $query->where( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.country') ); + // Where Help_document alias is found + $query->where( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.help_document') ); $db->setQuery($query); // Execute query to see if alias is found $db->execute(); - $country_found = $db->getNumRows(); + $help_document_found = $db->getNumRows(); // Now check if there were any rows - if ($country_found) + if ($help_document_found) { - // Since there are load the needed country type ids - $country_ids = $db->loadColumn(); - // Remove Country from the content type table - $country_condition = array( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.country') ); + // Since there are load the needed help_document type ids + $help_document_ids = $db->loadColumn(); + // Remove Help_document from the content type table + $help_document_condition = array( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.help_document') ); // Create a new query object. $query = $db->getQuery(true); $query->delete($db->quoteName('#__content_types')); - $query->where($country_condition); + $query->where($help_document_condition); $db->setQuery($query); - // Execute the query to remove Country items - $country_done = $db->execute(); - if ($country_done); + // Execute the query to remove Help_document items + $help_document_done = $db->execute(); + if ($help_document_done); { - // If succesfully remove Country add queued success message. - $app->enqueueMessage(JText::_('The (com_supportgroups.country) type alias was removed from the #__content_type table')); + // If succesfully remove Help_document add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.help_document) type alias was removed from the #__content_type table')); } - // Remove Country items from the contentitem tag map table - $country_condition = array( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.country') ); + // Remove Help_document items from the contentitem tag map table + $help_document_condition = array( $db->quoteName('type_alias') . ' = '. $db->quote('com_supportgroups.help_document') ); // Create a new query object. $query = $db->getQuery(true); $query->delete($db->quoteName('#__contentitem_tag_map')); - $query->where($country_condition); + $query->where($help_document_condition); $db->setQuery($query); - // Execute the query to remove Country items - $country_done = $db->execute(); - if ($country_done); + // Execute the query to remove Help_document items + $help_document_done = $db->execute(); + if ($help_document_done); { - // If succesfully remove Country add queued success message. - $app->enqueueMessage(JText::_('The (com_supportgroups.country) type alias was removed from the #__contentitem_tag_map table')); + // If succesfully remove Help_document add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.help_document) type alias was removed from the #__contentitem_tag_map table')); } - // Remove Country items from the ucm content table - $country_condition = array( $db->quoteName('core_type_alias') . ' = ' . $db->quote('com_supportgroups.country') ); + // Remove Help_document items from the ucm content table + $help_document_condition = array( $db->quoteName('core_type_alias') . ' = ' . $db->quote('com_supportgroups.help_document') ); // Create a new query object. $query = $db->getQuery(true); $query->delete($db->quoteName('#__ucm_content')); - $query->where($country_condition); + $query->where($help_document_condition); $db->setQuery($query); - // Execute the query to remove Country items - $country_done = $db->execute(); - if ($country_done); + // Execute the query to remove Help_document items + $help_document_done = $db->execute(); + if ($help_document_done); { - // If succesfully remove Country add queued success message. - $app->enqueueMessage(JText::_('The (com_supportgroups.country) type alias was removed from the #__ucm_content table')); + // If succesfully remove Help_document add queued success message. + $app->enqueueMessage(JText::_('The (com_supportgroups.help_document) type alias was removed from the #__ucm_content table')); } - // Make sure that all the Country items are cleared from DB - foreach ($country_ids as $country_id) + // Make sure that all the Help_document items are cleared from DB + foreach ($help_document_ids as $help_document_id) { - // Remove Country items from the ucm base table - $country_condition = array( $db->quoteName('ucm_type_id') . ' = ' . $country_id); + // Remove Help_document items from the ucm base table + $help_document_condition = array( $db->quoteName('ucm_type_id') . ' = ' . $help_document_id); // Create a new query object. $query = $db->getQuery(true); $query->delete($db->quoteName('#__ucm_base')); - $query->where($country_condition); + $query->where($help_document_condition); $db->setQuery($query); - // Execute the query to remove Country items + // Execute the query to remove Help_document items $db->execute(); - // Remove Country items from the ucm history table - $country_condition = array( $db->quoteName('ucm_type_id') . ' = ' . $country_id); + // Remove Help_document items from the ucm history table + $help_document_condition = array( $db->quoteName('ucm_type_id') . ' = ' . $help_document_id); // Create a new query object. $query = $db->getQuery(true); $query->delete($db->quoteName('#__ucm_history')); - $query->where($country_condition); + $query->where($help_document_condition); $db->setQuery($query); - // Execute the query to remove Country items + // Execute the query to remove Help_document items $db->execute(); } } @@ -501,8 +759,8 @@ class com_supportgroupsInstallerScript $query->delete($db->quoteName('#__assets')); $query->where($supportgroups_condition); $db->setQuery($query); - $country_done = $db->execute(); - if ($country_done); + $help_document_done = $db->execute(); + if ($help_document_done); { // If succesfully remove supportgroups add queued success message. $app->enqueueMessage(JText::_('All related items was removed from the #__assets table')); @@ -566,13 +824,37 @@ class com_supportgroupsInstallerScript $support_group->type_title = 'Supportgroups Support_group'; $support_group->type_alias = 'com_supportgroups.support_group'; $support_group->table = '{"special": {"dbtable": "#__supportgroups_support_group","key": "id","type": "Support_group","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; - $support_group->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "name","core_state": "published","core_alias": "null","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "metadata","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "metakey","core_metadesc": "metadesc","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"name":"name"}}'; + $support_group->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "name","core_state": "published","core_alias": "null","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "metadata","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "metakey","core_metadesc": "metadesc","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"name":"name","phone":"phone","location":"location","clinic":"clinic","male":"male","female":"female","female_art":"female_art","male_art":"male_art","female_children":"female_children","male_children":"male_children","area":"area"}}'; $support_group->router = 'SupportgroupsHelperRoute::getSupport_groupRoute'; - $support_group->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/support_group.xml","hideFields": ["asset_id","checked_out","checked_out_time","version"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"}]}'; + $support_group->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/support_group.xml","hideFields": ["asset_id","checked_out","checked_out_time","version","area"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering","location","clinic","male","female","female_art","male_art","female_children","male_children"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "location","targetTable": "#__supportgroups_location","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "clinic","targetTable": "#__supportgroups_clinic","targetColumn": "id","displayColumn": "name"}]}'; // Set the object into the content types table. $support_group_Inserted = $db->insertObject('#__content_types', $support_group); + // Create the payment content type object. + $payment = new stdClass(); + $payment->type_title = 'Supportgroups Payment'; + $payment->type_alias = 'com_supportgroups.payment'; + $payment->table = '{"special": {"dbtable": "#__supportgroups_payment","key": "id","type": "Payment","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; + $payment->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "support_group","core_state": "published","core_alias": "null","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "null","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "null","core_metadesc": "null","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"support_group":"support_group","year":"year","amount":"amount"}}'; + $payment->router = 'SupportgroupsHelperRoute::getPaymentRoute'; + $payment->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/payment.xml","hideFields": ["asset_id","checked_out","checked_out_time","version"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering","support_group","year"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "support_group","targetTable": "#__supportgroups_support_group","targetColumn": "id","displayColumn": "name"}]}'; + + // Set the object into the content types table. + $payment_Inserted = $db->insertObject('#__content_types', $payment); + + // Create the clinic content type object. + $clinic = new stdClass(); + $clinic->type_title = 'Supportgroups Clinic'; + $clinic->type_alias = 'com_supportgroups.clinic'; + $clinic->table = '{"special": {"dbtable": "#__supportgroups_clinic","key": "id","type": "Clinic","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; + $clinic->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "name","core_state": "published","core_alias": "null","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "metadata","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "metakey","core_metadesc": "metadesc","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"name":"name","phone":"phone","area":"area"}}'; + $clinic->router = 'SupportgroupsHelperRoute::getClinicRoute'; + $clinic->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/clinic.xml","hideFields": ["asset_id","checked_out","checked_out_time","version","area"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"}]}'; + + // Set the object into the content types table. + $clinic_Inserted = $db->insertObject('#__content_types', $clinic); + // Create the location content type object. $location = new stdClass(); $location->type_title = 'Supportgroups Location'; @@ -597,6 +879,18 @@ class com_supportgroupsInstallerScript // Set the object into the content types table. $region_Inserted = $db->insertObject('#__content_types', $region); + // Create the country content type object. + $country = new stdClass(); + $country->type_title = 'Supportgroups Country'; + $country->type_alias = 'com_supportgroups.country'; + $country->table = '{"special": {"dbtable": "#__supportgroups_country","key": "id","type": "Country","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; + $country->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "name","core_state": "published","core_alias": "alias","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "metadata","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "metakey","core_metadesc": "metadesc","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"name":"name","currency":"currency","worldzone":"worldzone","codethree":"codethree","codetwo":"codetwo","alias":"alias"}}'; + $country->router = 'SupportgroupsHelperRoute::getCountryRoute'; + $country->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/country.xml","hideFields": ["asset_id","checked_out","checked_out_time","version"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "currency","targetTable": "#__supportgroups_currency","targetColumn": "codethree","displayColumn": "name"}]}'; + + // Set the object into the content types table. + $country_Inserted = $db->insertObject('#__content_types', $country); + // Create the currency content type object. $currency = new stdClass(); $currency->type_title = 'Supportgroups Currency'; @@ -609,17 +903,17 @@ class com_supportgroupsInstallerScript // Set the object into the content types table. $currency_Inserted = $db->insertObject('#__content_types', $currency); - // Create the country content type object. - $country = new stdClass(); - $country->type_title = 'Supportgroups Country'; - $country->type_alias = 'com_supportgroups.country'; - $country->table = '{"special": {"dbtable": "#__supportgroups_country","key": "id","type": "Country","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; - $country->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "name","core_state": "published","core_alias": "alias","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "metadata","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "metakey","core_metadesc": "metadesc","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"name":"name","currency":"currency","worldzone":"worldzone","codethree":"codethree","codetwo":"codetwo","alias":"alias"}}'; - $country->router = 'SupportgroupsHelperRoute::getCountryRoute'; - $country->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/country.xml","hideFields": ["asset_id","checked_out","checked_out_time","version"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "currency","targetTable": "#__supportgroups_currency","targetColumn": "codethree","displayColumn": "name"}]}'; + // Create the help_document content type object. + $help_document = new stdClass(); + $help_document->type_title = 'Supportgroups Help_document'; + $help_document->type_alias = 'com_supportgroups.help_document'; + $help_document->table = '{"special": {"dbtable": "#__supportgroups_help_document","key": "id","type": "Help_document","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; + $help_document->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "title","core_state": "published","core_alias": "alias","core_created_time": "created","core_modified_time": "modified","core_body": "content","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "null","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "null","core_metadesc": "null","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"title":"title","type":"type","groups":"groups","location":"location","admin_view":"admin_view","site_view":"site_view","target":"target","content":"content","alias":"alias","article":"article","url":"url","not_required":"not_required"}}'; + $help_document->router = 'SupportgroupsHelperRoute::getHelp_documentRoute'; + $help_document->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/help_document.xml","hideFields": ["asset_id","checked_out","checked_out_time","version","not_required"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering","type","location","target","article","not_required"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "article","targetTable": "#__content","targetColumn": "id","displayColumn": "title"}]}'; // Set the object into the content types table. - $country_Inserted = $db->insertObject('#__content_types', $country); + $help_document_Inserted = $db->insertObject('#__content_types', $help_document); // Install the global extenstion params. @@ -654,9 +948,9 @@ class com_supportgroupsInstallerScript $support_group->type_title = 'Supportgroups Support_group'; $support_group->type_alias = 'com_supportgroups.support_group'; $support_group->table = '{"special": {"dbtable": "#__supportgroups_support_group","key": "id","type": "Support_group","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; - $support_group->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "name","core_state": "published","core_alias": "null","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "metadata","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "metakey","core_metadesc": "metadesc","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"name":"name"}}'; + $support_group->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "name","core_state": "published","core_alias": "null","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "metadata","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "metakey","core_metadesc": "metadesc","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"name":"name","phone":"phone","location":"location","clinic":"clinic","male":"male","female":"female","female_art":"female_art","male_art":"male_art","female_children":"female_children","male_children":"male_children","area":"area"}}'; $support_group->router = 'SupportgroupsHelperRoute::getSupport_groupRoute'; - $support_group->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/support_group.xml","hideFields": ["asset_id","checked_out","checked_out_time","version"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"}]}'; + $support_group->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/support_group.xml","hideFields": ["asset_id","checked_out","checked_out_time","version","area"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering","location","clinic","male","female","female_art","male_art","female_children","male_children"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "location","targetTable": "#__supportgroups_location","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "clinic","targetTable": "#__supportgroups_clinic","targetColumn": "id","displayColumn": "name"}]}'; // Check if support_group type is already in content_type DB. $support_group_id = null; @@ -678,6 +972,64 @@ class com_supportgroupsInstallerScript $support_group_Inserted = $db->insertObject('#__content_types', $support_group); } + // Create the payment content type object. + $payment = new stdClass(); + $payment->type_title = 'Supportgroups Payment'; + $payment->type_alias = 'com_supportgroups.payment'; + $payment->table = '{"special": {"dbtable": "#__supportgroups_payment","key": "id","type": "Payment","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; + $payment->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "support_group","core_state": "published","core_alias": "null","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "null","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "null","core_metadesc": "null","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"support_group":"support_group","year":"year","amount":"amount"}}'; + $payment->router = 'SupportgroupsHelperRoute::getPaymentRoute'; + $payment->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/payment.xml","hideFields": ["asset_id","checked_out","checked_out_time","version"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering","support_group","year"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "support_group","targetTable": "#__supportgroups_support_group","targetColumn": "id","displayColumn": "name"}]}'; + + // Check if payment type is already in content_type DB. + $payment_id = null; + $query = $db->getQuery(true); + $query->select($db->quoteName(array('type_id'))); + $query->from($db->quoteName('#__content_types')); + $query->where($db->quoteName('type_alias') . ' LIKE '. $db->quote($payment->type_alias)); + $db->setQuery($query); + $db->execute(); + + // Set the object into the content types table. + if ($db->getNumRows()) + { + $payment->type_id = $db->loadResult(); + $payment_Updated = $db->updateObject('#__content_types', $payment, 'type_id'); + } + else + { + $payment_Inserted = $db->insertObject('#__content_types', $payment); + } + + // Create the clinic content type object. + $clinic = new stdClass(); + $clinic->type_title = 'Supportgroups Clinic'; + $clinic->type_alias = 'com_supportgroups.clinic'; + $clinic->table = '{"special": {"dbtable": "#__supportgroups_clinic","key": "id","type": "Clinic","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; + $clinic->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "name","core_state": "published","core_alias": "null","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "metadata","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "metakey","core_metadesc": "metadesc","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"name":"name","phone":"phone","area":"area"}}'; + $clinic->router = 'SupportgroupsHelperRoute::getClinicRoute'; + $clinic->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/clinic.xml","hideFields": ["asset_id","checked_out","checked_out_time","version","area"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"}]}'; + + // Check if clinic type is already in content_type DB. + $clinic_id = null; + $query = $db->getQuery(true); + $query->select($db->quoteName(array('type_id'))); + $query->from($db->quoteName('#__content_types')); + $query->where($db->quoteName('type_alias') . ' LIKE '. $db->quote($clinic->type_alias)); + $db->setQuery($query); + $db->execute(); + + // Set the object into the content types table. + if ($db->getNumRows()) + { + $clinic->type_id = $db->loadResult(); + $clinic_Updated = $db->updateObject('#__content_types', $clinic, 'type_id'); + } + else + { + $clinic_Inserted = $db->insertObject('#__content_types', $clinic); + } + // Create the location content type object. $location = new stdClass(); $location->type_title = 'Supportgroups Location'; @@ -736,35 +1088,6 @@ class com_supportgroupsInstallerScript $region_Inserted = $db->insertObject('#__content_types', $region); } - // Create the currency content type object. - $currency = new stdClass(); - $currency->type_title = 'Supportgroups Currency'; - $currency->type_alias = 'com_supportgroups.currency'; - $currency->table = '{"special": {"dbtable": "#__supportgroups_currency","key": "id","type": "Currency","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; - $currency->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "name","core_state": "published","core_alias": "alias","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "metadata","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "metakey","core_metadesc": "metadesc","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"name":"name","codethree":"codethree","numericcode":"numericcode","symbol":"symbol","alias":"alias","positivestyle":"positivestyle","thousands":"thousands","decimalsymbol":"decimalsymbol","decimalplace":"decimalplace","negativestyle":"negativestyle"}}'; - $currency->router = 'SupportgroupsHelperRoute::getCurrencyRoute'; - $currency->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/currency.xml","hideFields": ["asset_id","checked_out","checked_out_time","version"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering","numericcode","decimalplace"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"}]}'; - - // Check if currency type is already in content_type DB. - $currency_id = null; - $query = $db->getQuery(true); - $query->select($db->quoteName(array('type_id'))); - $query->from($db->quoteName('#__content_types')); - $query->where($db->quoteName('type_alias') . ' LIKE '. $db->quote($currency->type_alias)); - $db->setQuery($query); - $db->execute(); - - // Set the object into the content types table. - if ($db->getNumRows()) - { - $currency->type_id = $db->loadResult(); - $currency_Updated = $db->updateObject('#__content_types', $currency, 'type_id'); - } - else - { - $currency_Inserted = $db->insertObject('#__content_types', $currency); - } - // Create the country content type object. $country = new stdClass(); $country->type_title = 'Supportgroups Country'; @@ -794,6 +1117,64 @@ class com_supportgroupsInstallerScript $country_Inserted = $db->insertObject('#__content_types', $country); } + // Create the currency content type object. + $currency = new stdClass(); + $currency->type_title = 'Supportgroups Currency'; + $currency->type_alias = 'com_supportgroups.currency'; + $currency->table = '{"special": {"dbtable": "#__supportgroups_currency","key": "id","type": "Currency","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; + $currency->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "name","core_state": "published","core_alias": "alias","core_created_time": "created","core_modified_time": "modified","core_body": "null","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "metadata","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "metakey","core_metadesc": "metadesc","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"name":"name","codethree":"codethree","numericcode":"numericcode","symbol":"symbol","alias":"alias","positivestyle":"positivestyle","thousands":"thousands","decimalsymbol":"decimalsymbol","decimalplace":"decimalplace","negativestyle":"negativestyle"}}'; + $currency->router = 'SupportgroupsHelperRoute::getCurrencyRoute'; + $currency->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/currency.xml","hideFields": ["asset_id","checked_out","checked_out_time","version"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering","numericcode","decimalplace"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"}]}'; + + // Check if currency type is already in content_type DB. + $currency_id = null; + $query = $db->getQuery(true); + $query->select($db->quoteName(array('type_id'))); + $query->from($db->quoteName('#__content_types')); + $query->where($db->quoteName('type_alias') . ' LIKE '. $db->quote($currency->type_alias)); + $db->setQuery($query); + $db->execute(); + + // Set the object into the content types table. + if ($db->getNumRows()) + { + $currency->type_id = $db->loadResult(); + $currency_Updated = $db->updateObject('#__content_types', $currency, 'type_id'); + } + else + { + $currency_Inserted = $db->insertObject('#__content_types', $currency); + } + + // Create the help_document content type object. + $help_document = new stdClass(); + $help_document->type_title = 'Supportgroups Help_document'; + $help_document->type_alias = 'com_supportgroups.help_document'; + $help_document->table = '{"special": {"dbtable": "#__supportgroups_help_document","key": "id","type": "Help_document","prefix": "supportgroupsTable","config": "array()"},"common": {"dbtable": "#__ucm_content","key": "ucm_id","type": "Corecontent","prefix": "JTable","config": "array()"}}'; + $help_document->field_mappings = '{"common": {"core_content_item_id": "id","core_title": "title","core_state": "published","core_alias": "alias","core_created_time": "created","core_modified_time": "modified","core_body": "content","core_hits": "hits","core_publish_up": "null","core_publish_down": "null","core_access": "access","core_params": "params","core_featured": "null","core_metadata": "null","core_language": "null","core_images": "null","core_urls": "null","core_version": "version","core_ordering": "ordering","core_metakey": "null","core_metadesc": "null","core_catid": "null","core_xreference": "null","asset_id": "asset_id"},"special": {"title":"title","type":"type","groups":"groups","location":"location","admin_view":"admin_view","site_view":"site_view","target":"target","content":"content","alias":"alias","article":"article","url":"url","not_required":"not_required"}}'; + $help_document->router = 'SupportgroupsHelperRoute::getHelp_documentRoute'; + $help_document->content_history_options = '{"formFile": "administrator/components/com_supportgroups/models/forms/help_document.xml","hideFields": ["asset_id","checked_out","checked_out_time","version","not_required"],"ignoreChanges": ["modified_by","modified","checked_out","checked_out_time","version","hits"],"convertToInt": ["published","ordering","type","location","target","article","not_required"],"displayLookup": [{"sourceColumn": "created_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "access","targetTable": "#__viewlevels","targetColumn": "id","displayColumn": "title"},{"sourceColumn": "modified_by","targetTable": "#__users","targetColumn": "id","displayColumn": "name"},{"sourceColumn": "article","targetTable": "#__content","targetColumn": "id","displayColumn": "title"}]}'; + + // Check if help_document type is already in content_type DB. + $help_document_id = null; + $query = $db->getQuery(true); + $query->select($db->quoteName(array('type_id'))); + $query->from($db->quoteName('#__content_types')); + $query->where($db->quoteName('type_alias') . ' LIKE '. $db->quote($help_document->type_alias)); + $db->setQuery($query); + $db->execute(); + + // Set the object into the content types table. + if ($db->getNumRows()) + { + $help_document->type_id = $db->loadResult(); + $help_document_Updated = $db->updateObject('#__content_types', $help_document, 'type_id'); + } + else + { + $help_document_Inserted = $db->insertObject('#__content_types', $help_document); + } + echo ' diff --git a/site/controllers/help.php b/site/controllers/help.php new file mode 100644 index 0000000..76ceceb --- /dev/null +++ b/site/controllers/help.php @@ -0,0 +1,130 @@ + + @copyright Copyright (C) 2015. All Rights Reserved + @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html + + Support Groups + +/-----------------------------------------------------------------------------------------------------------------------------*/ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import Joomla controllerform library +jimport('joomla.application.component.controller'); + +/** + * Supportgroups Help Controller + */ +class SupportgroupsControllerHelp extends JControllerLegacy +{ + public function __construct($config) + { + parent::__construct($config); + // load the tasks + $this->registerTask('getText', 'help'); + } + + public function help() + { + $user = JFactory::getUser(); + $jinput = JFactory::getApplication()->input; + // Check Token! + $token = JSession::getFormToken(); + $call_token = $jinput->get('token', 0, 'ALNUM'); + if($token == $call_token){ + $task = $this->getTask(); + switch($task){ + case 'getText': + try + { + $idValue = $jinput->get('id', 0, 'INT'); + if($idValue) + { + $result = $this->getHelpDocumentText($idValue); + } + else + { + $result = ''; + } + echo $result; + // stop execution gracefully + jexit(); + } + catch(Exception $e) + { + // stop execution gracefully + jexit(); + } + break; + } + } + else + { + // stop execution gracefully + jexit(); + } + } + + protected function getHelpDocumentText($id) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select(array('a.title','a.content')); + $query->from('#__supportgroups_help_document AS a'); + $query->where('a.id = '.(int) $id); + $query->where('a.published = 1'); + $query->where('a.location = 2'); + $db->setQuery($query); + $db->execute(); + if($db->getNumRows()) + { + $text = array(); + $document = $db->loadObject(); + // fix image issue + $images['src="images'] = 'src="'.JURI::root().'images'; + $images["src='images"] = "src='".JURI::root()."images"; + $images['src="/images'] = 'src="'.JURI::root().'images'; + $images["src='/images"] = "src='".JURI::root()."images"; + // set document template + $text[] = ""; + $text[] = ''; + $text[] = ""; + $text[] = ''; + $text[] = "".$document->title.""; + $text[] = ''; + $text[] = ''; + $text[] = ""; + $text[] = '
'; + $text[] = '
'; + $text[] = '
'; + // build the help text + $text[] = '

'.$document->title."

"; + $text[] = str_replace(array_keys($images),array_values($images),$document->content); + // end template + $text[] = '


'; + $text[] = '
'; + $text[] = ""; + $text[] = ""; + + return implode("\n",$text); + } + return false; + } +} diff --git a/site/helpers/supportgroups.php b/site/helpers/supportgroups.php index 955409a..eeb936e 100644 --- a/site/helpers/supportgroups.php +++ b/site/helpers/supportgroups.php @@ -108,11 +108,75 @@ abstract class SupportgroupsHelper } /** - * Can be used to build help urls. + * Load the Component Help URLs. **/ public static function getHelpUrl($view) { + $user = JFactory::getUser(); + $groups = $user->get('groups'); + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select(array('a.id','a.groups','a.target','a.type','a.article','a.url')); + $query->from('#__supportgroups_help_document AS a'); + $query->where('a.site_view = '.$db->quote($view)); + $query->where('a.location = 2'); + $query->where('a.published = 1'); + $db->setQuery($query); + $db->execute(); + if($db->getNumRows()) + { + $helps = $db->loadObjectList(); + if (self::checkArray($helps)) + { + foreach ($helps as $nr => $help) + { + if ($help->target == 1) + { + $targetgroups = json_decode($help->groups, true); + if (!array_intersect($targetgroups, $groups)) + { + // if user not in those target groups then remove the item + unset($helps[$nr]); + continue; + } + } + // set the return type + switch ($help->type) + { + // set joomla article + case 1: + return self::loadArticleLink($help->article); + break; + // set help text + case 2: + return self::loadHelpTextLink($help->id); + break; + // set Link + case 3: + return $help->url; + break; + } + } + } + } return false; + } + + /** + * Get the Article Link. + **/ + protected static function loadArticleLink($id) + { + return JURI::root().'index.php?option=com_content&view=article&id='.$id.'&tmpl=component&layout=modal'; + } + + /** + * Get the Help Text Link. + **/ + protected static function loadHelpTextLink($id) + { + $token = JSession::getFormToken(); + return 'index.php?option=com_supportgroups&task=help.getText&id=' . (int) $id . '&token=' . $token; } /** diff --git a/supportgroups.xml b/supportgroups.xml index 09b447c..8573f40 100644 --- a/supportgroups.xml +++ b/supportgroups.xml @@ -71,6 +71,8 @@ COM_SUPPORTGROUPS_MENU_SUPPORT_GROUPS + COM_SUPPORTGROUPS_MENU_PAYMENTS + COM_SUPPORTGROUPS_MENU_CLINICS COM_SUPPORTGROUPS_MENU_LOCATIONS COM_SUPPORTGROUPS_MENU_REGIONS